Autor Beitrag
colaka
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 200
Erhaltene Danke: 4

Win XP, W7
Delphi 2005 Prof.
BeitragVerfasst: Fr 08.01.10 06:45 
Hallo,

jetzt, wo mein Projekt abgeschlossen schien, stellt sich doch noch die ein oder andere Macke heraus:

Es gibt Benutzer, die ein Programm nicht über die im Programm vorgesehenen Befehle beenden, sondern über die Windows-Taskleiste. Das funktioniert bei meinem Projekt fehlerfrei nur dann, wenn nur das Hauptfenster geöffnet ist. Ich habe in meinem Programm aber neben dem Hauptfenster (fsMDIForm) noch mehrere fsMDIChild- und ein normales Fenster (fsNormal). Dieses spezielle Fenster kann ich nicht zum Child machen, weil es über 2 Monitore geht.

Mit Hilfe des Forums habe ich eine Lösung für die Childfenster gefunden, bei der ich mir aber auch nicht sicher bin, ob das der Weisheit letzter Schluß ist. In das FormClose-Ereignis des Hauptformulars habe ich geschrieben:
ausblenden Delphi-Quelltext
1:
for i := MDIChildCount - 1 downto 0 do MDIChildren[i].Close;					

Das scheint das Problem zu lösen, wenn ein beliebiges Child-Fenster geöffnet ist, aber im Forum habe ich gelesen, daß Close das Fenster nicht wirklich freigibt, sondern nur versteckt, und daß das somit keine saubere Lösung ist. Und für das normale Fenster, das ja auch geöffnet sein könnte, habe ich trotz langer Suche noch keine Lösung gefunden. Ich bräuchte sowas wie:
ausblenden Delphi-Quelltext
1:
if speziellesFenster = open then speziellesFenster.close					


Oder gibt es einen besseren Befehl, mit dem alle möglicherweise geöffeten Fenster auf einmal geschlossen werden können.

Danke Ebi
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 08.01.10 21:21 
Erstens: Wenn du in OnClose den Parameter Action auf caFree setzt, dann wird das Fenster nicht nur versteckt, sondern wirklich freigegeben. Das passiert beim Beenden des Programms dann aber ohnehin, wenn du als Owner nicht nil angegeben hast beim Erzeugen.

Zweitens: Du kannst einfach Application.Terminate aufrufen, dann werden automatisch alle Fenster und das Programm geschlossen. Dann musst du nicht extra alle Fenster schließen.
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Sa 09.01.10 13:00 
Moin!

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst einfach Application.Terminate aufrufen, dann werden automatisch alle Fenster und das Programm geschlossen. Dann musst du nicht extra alle Fenster schließen.
Da ich neulich noch drüber gestolpert bin: Aufpassen, dabei wird (zumindest) die Methode FormClose() nicht aufgerufen, sondern sofort beendet! :idea: ;)

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.