@Michl Danke für die Codestrecke! Hat mich auf eine andere Möglichkeit gebracht. Bei deiner Lösung war das Problem, dass das Schliessen des MainForm nur nach dem zweiten Click funktionierte, sofern ein SubForm geöffnet war.
Ein kleineres bestand darin, dass das SubForm nicht angezeigt wird. Bei mir kam nur die Message aus dem OnCloseQuery des SubForm.
Ich hab das ganze jetzt so gelöst und bis jetzt funktioniert es:
Code: Alles auswählen
procedure TFormMain.FormCloseQuery(Sender: TObject; var CanClose: boolean);
var
i : Integer;
begin
CanClose := true; //Vermeidet DoppelClick auf <Beenden> der Anwendung
for i := 1 to Screen.FormCount -1 do
if not Screen.Forms[i].CloseQuery then
begin
CanClose := false; //MainForm/Application kann nicht beenden
Screen.Forms[i].BringToFront; //Sub-Form mit nicht gespeicherten Daten anzeigen
BREAK; //Abbruch nach dem ersten nicht gespeicherten Formular
end;
end;
In meinem Fall wird nun erst die Message über nicht geänderte Daten der jeweiligen SubForm angezeigt und dann erhält diese den Focus.
Der BREAK in der Schleife vermeidet, dass bei mehreren nicht gespeicherten SubForms alle Messages hintereinander angezeigt werden, zugeclickt werden müssen und letztendlich aber das letzte Form den Focus erhält.
Die anderen SubForms sind dann aber nicht mehr sichtbar und der CloseQuery muss neu durchlaufen oder der Anwender hat sich die Forms gemeerkt *hüstel* und steuert alle gezielt an.
Ob das Verhalten ein Bug ist, kann ich nicht beurteilen - könnte aber durchaus sein.
Aber dazu fällt mir noch ein alter Witz ein - ging ungefähr so:

Sitzen Entwickler mit Ihrem Chef zusammen und besprechen ein neues Release mit einigen Mängeln.
Am Ende sagt der Chef: OK - wir lassen alle Fehler im Programm, ändern die Dokumentation und nennen das Ganz dann Features der Version 10 ...
Passiert wohl bei vielen OS, Programmen so ...