TForm Close() ???



  • Hi Gemeinde,

    ich glaub, ich steh grad fürchterlich auf dem Schlauch.
    Folgendes Prob: Habe ein TForm, Style = bsDialog. In diesem Dialog läuft eine Aktion in einer 'Endlosschleife( läuft, bis Abbruch-bool( spRun ) = false )'. Soweit, so gut.
    Nur wenn ich jetzt Den Button 'Schliessen' klicke, stoppt zwar die Schleife, das Fenster wird aber nicht geschlossen 😕

    void __fastcall TPreview::ButtonCloseClick(TObject *Sender)
    {
    	spRun = false;
    	Close();
    }
    

    😕 😕

    grüssle



  • Setz mal ModalResult auf nen sinnvollen Wert!



  • DerAltenburger schrieb:

    Setz mal ModalResult auf nen sinnvollen Wert!

    habs mit mrClose, mrCancel, mrNone, ... versucht, das Ergenis ist immer gleich: beim ersten Klick stoppt die Schleife, beim zweiten geht das Fenster zu 😕

    grüssle



  • Wie sieht denn deine Endlosschleife aus? Wenn du damit den VCL Hauptthread blockierst wundert mich, dass da überhaupt etwas passiert.
    Poste doch bitte mal den Code deiner Schleife, vielleicht liegts daran.



  • kann nur auszugsweise Code posten, also hier die Schleife:

    while( spRun )
    	{
    		Application->ProcessMessages();
    		...
    

    Merkwürdig ist auch, dass die Closeverweigerung nur beim ersten Klick auf den Button passiert. Beim zweiten Klick auf den Button funktionierts dann 😮

    grüssle

    p. s. Code entfernt, denn an dem liegts nicht( Platz sparen 😉 ). Liegt am Start der Schleife. Wenn ich die Schleife z. B. im OnActivate starte, tritt das Problem auf. Wenn ich jedoch über einen ButtonClick starte, läuft alles wie es soll.
    Wird wohl gestartet, während der Dialog noch nicht komplett geladen ist?!
    Nur was nu? Sollte schon automatisch starten.



  • Nachdem ich einige Male mit so wackligen Geschichten wie ProcessMessages auf die Nase gefallen bin benutze ich eigentlich nur noch Threads, wenn ich irgendwas parallel in einem Formular erledigen will. Per Synchronize() Methode kann ich auf das Formular innerhalb des VCL Hauptthreads zugreifen. Kommt so etwas für dich in Frage? Ist in meinen Augen auch die bessere Lösung.
    Wenn der Benutzer dann auf Abbrechen klickt kannst du den laufenden Thread beenden und das Formular schliessen.



  • Wenn innerhalb OnACtivate ne Endlosschleife klemmt, wird das Formular erst richtig aktiv, wenn die Schleife abbricht - da kann natürlich NICHT geschlossen werden!

    Mach das so:
    1. Formular erzeugen
    2. PostMessage an dieses mit Botschaft zum Starten.
    3. ShowModal für das Teil

    In dem Formular machste noch nen MessageHandler für Deine "Startbotschaft"

    Gruss
    Frank



  • @ _DocShoe_
    Thx, aber einen Thread für die paar Zeilen war mir einfach zuviel Aufwand.

    @ DerAltenburger
    Thx, genau das hab ich gesucht.

    grüssle 🙂


Log in to reply