Hallo zusammen,
vielleicht muss ich das ja auch einfach nur so hinnehmen, aber vielleicht kann man es auch verstehen und vielleicht macht das auch für irgendwas Sinn:
Ich habe ein Fenster, in dem eine Prozedur (mittels eines ButtonClicks gestartet) über einen längeren Zeitraum läuft. Diese Prozedur ruft dabei regelmäßig Application.ProcessMessages auf, damit man das Fenster trotzdem schließen und damit den Prozess abbrechen kann. Dazu habe ich das Event OnClose des Formulars gefüllt und setze dort ein Flag, dass die lang laufende Prozedur prüft und gegebenenfalls abbricht.
So weit, so simpel.
ABER:
Das funktioniert nur, wenn man das Fenster mit
Show aufgerufen hat!
Wenn man das Fenster mit
ShowModal aufruft, dann wird - trotz Application.ProcessMessages - das OnClose-Event erst ausgelöst bzw. verarbeitet, wenn der laufende Prozess (das ButtonClick-Event) vollständig durchgelaufen ist!
Da rollen sich mir glatt die Fußnägel auf!
Kann mir das irgendwer begründen/erklären?
PS: Ich habe das mit einem frischen Projekt getestet, bei dem das vom Hauptformular geöffnete zweite Formular nur einen Button und folgenden Code hat:
Delphi-Quellcode:
procedure TfSubWindow.btDoSomethingClick(Sender: TObject);
var
OldTime: TDateTime;
begin
OldTime := now;
while SecondsBetween(Now,OldTime) < 10 do
Application.ProcessMessages;
end;
procedure TfSubWindow.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Beep;
end;
Das Beep wird erst nach dem END von btDoSomethingClick ausgeführt, falls das Formular mit ShowModal geöffnet wurde...