2016-05-14 4 views
-2

Ich habe einen Prozess in einer sekundären Form, die 25 Sekunden dauern kann und möchte verhindern, dass der Benutzer das Fenster schließen, ohne auf die Schaltfläche "Prozess abbrechen" zu klicken.Capture rot-X klicken

Wenn sie auf das rote X in der oberen rechten Ecke des Bildschirms klicken, passiert nichts, bis der Prozess abgeschlossen ist und dann schließt es.

Ich habe versucht, einen Booleschen Wert zu setzen, bis der Prozess abgeschlossen oder abgebrochen ist, aber es wartet immer noch, bis der Prozess abgeschlossen ist und schließt.

Wie kann ich den rot-X-Klick einfangen und dem Benutzer sagen, dass er warten oder abbrechen soll?

+0

Verwenden Sie den Leerlauf-Handler anstelle eines Massenprozesses. –

+0

Größeres Problem ist, dass Sie einen Haupt-Thread haben. Ich würde das zuerst beheben. Dann lassen Sie das Formular keine Schließen-Schaltfläche haben. –

+0

Sie können einen Handler für OnCloseQuery festlegen, bis Sie die Verarbeitung in einen Thread verschieben. Der Handler wird weiterhin ausgeführt, nachdem der Prozess abgeschlossen wurde. –

Antwort

0

Wenn Sie verhindern möchten, dass das 'X' das Formular schließt, legen Sie einen Handler in OnCloseQuery.

procedure TForm34.FormCloseQuery(Sender: TObject; var CanClose: Boolean); 
begin 
    CanClose:= DoneProcessing; 
    if not(DoneProcessing) then begin 
    ShowMessage('hold on'); 
    end; 
end; 

Wenn Sie nicht möchten, dass Ihre Verarbeitung die Benutzeroberfläche des Hauptfensters blockiert, müssen Sie das in einen separaten Thread einfügen.
Ich empfehle die Verwendung der OmniThreadLibrary dafür.

+0

Ich habe versucht, mit in meinem OP, _Ich habe versucht, einen Boolean, bis der Prozess abgeschlossen oder abgebrochen ist, aber es wartet immer noch bis der Prozess abgeschlossen ist und schließt. _ – user2175495

+0

@user - Damit dies funktioniert müssen Sie einen Timer einstellen (Intervall spielt keine Rolle) kurz bevor Ihre Verarbeitung beginnt und setzen Sie DoneProcessing auf true, wenn der Timer ausgelöst wird. Es wird ausgelöst, nachdem die Verarbeitung abgeschlossen ist und nachdem Benutzereingabenachrichten (Klick auf rotes X) aus der Warteschlange abgerufen wurden. Weil WM_TIMER die Nachricht mit der niedrigsten Priorität ist, die die Warteschlange pumpt. Was passieren wird, ist die Verarbeitung wird beendet, wie es jetzt tut, aber dann wird das Formular nicht geschlossen .. –

+0

Ansonsten legen Sie einige Application.Process Nachrichten in Ihrer Arbeit Verarbeitung. –