| Autor |
Beitrag |
motion
      
Beiträge: 295
XP, Linux
D7 Prof
|
Verfasst: Mo 19.09.05 08:08
In meiner Applikation kann der Anwender von einem Hauptprogramm aus verschiedene Funktionen/Formulare starten. Diese Formulare erzeuge ich dynamisch und starte sie mittels "show" nicht-modal!
Der Anwender hat die Möglichkeit Fenster sogar mehrfach zu öffnen.
Ich möchte jetzt im Hauptprogramm das schliessen des Programmes verhindern, solange noch "Tochter"-Formulare geöffnet sind.
Wie lässt sich dieses am Besten prüfen? Gibt es eine Liste, der abgeleiteten Formulare, die sich verwenden lässt?
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Mo 19.09.05 10:57
Hallo,
jedes Formular, auch dein Hauptfenster, besitzt die Eigenschaft OnCloseQuery welche die auch erlaubt das Schließen zu verhindern. Das sieht dann so aus:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin if TochetFensterOffen then CanClose := False else CanClose := true; end; |
Gruß
Klabautermann
|
|
motion 
      
Beiträge: 295
XP, Linux
D7 Prof
|
Verfasst: Mo 19.09.05 12:41
Vielen Dank für die Antwort.
Dieses Closequery war mir schon bekannt.
Wir kann ich aber ohne eigene "Buchführung" feststellen, ob noch unter-Fenster existieren?
Kann ich irgendwie eine Liste von aktiven Fenstern ermitteln, welche mein Hauptformular als Parent/Owner angegeben haben?
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Mo 19.09.05 12:58
Hallo,
ich bin mir nicht sicher, aber eventuell werden sie von FindComponent mit zurückgeliefert. Ansonsten würde ich dir einfach empfehlen ein Wenig Buchführung zu betreiben, es ist ja kein Problem, beim erzeugen der Fenster einen Pointer auf diese in einer Verketteten Liste oder einen DynArray zu speichern.
Gruß
Klabautermann
|
|
motion 
      
Beiträge: 295
XP, Linux
D7 Prof
|
Verfasst: Mo 19.09.05 16:12
Hmmm,
gerade die eigene Buchhaltung wollte ich vermeiden. Das wirklich wasserdicht und robust über alle Fensteroperationen hinzubekommen ist schon Aufwand. Z.B. einfach einen globalen Zähler zu erhöhen bzw. zu erniedriegen kann z.B. bei einer Exception (welche das Fenster schnell selbst schliesst und damit am Zähler dekrement vorbei marschiert) aus dem Tritt kommen.
Vielleicht hilft auch eine WinAPI Funktion zum enumerieren der Fenster. Alleim am Fenstertitel kann ich nicht immer erkennen, ob es zu meinem Programm gehört), die Captions sind da zu individuell. Da brauche ich also die wirkliche Vererbungsfolge (welches Fenster hat welches andere geöffnet).
Also ich gebe die Hoffnung noch nicht auf, hier eine bessere Lösung als eigene Buchhaltung zu bekommen.
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Mo 19.09.05 16:19
Hi,
also per API kannst du mit FINDWINDOW auch nach Fenster einer Bestimmten Klasse suchen (zweiten Parameter nil lassen). Wen es dir nur darum geht festzustellen ob noch solche Fenster offen sind würde das reichen. Vorrausgesetzt, dass dein Programm nicht mehrmals gestartet werden darf.
Gruß
Klabautermann
|
|
motion 
      
Beiträge: 295
XP, Linux
D7 Prof
|
Verfasst: Mo 19.09.05 18:52
Korrekter Einwand! Der Mehrfachstart ist schon unterbunden, somit droht hier keine Gefahr!
Damit könnte die API Funktion ein guter Ansatz sein.
|
|
rochus
      
Beiträge: 416
Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
|
Verfasst: Di 20.09.05 09:23
Hallo,
du könntest auch über Screen gehen -> Screen.Forms und dann immer auf den Parent überprüfen.
Gruß
_________________ Im Nachhinein ist man immer ein Schlauch!
"Dream as if you'll live forever, live as if you'll die today!" James Dean
|
|
motion 
      
Beiträge: 295
XP, Linux
D7 Prof
|
Verfasst: Di 20.09.05 12:35
Das war der entscheidende Hinweis!
Ich habe über Screen.forms[i] die Namen der Formulare abgeklappert.
Falls doch einige (wenige) statische Forms existieren (zwei Stück bei mir), müssen die natürlich besonders beachtet werden.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure THauptformular.FormCloseQuery(Sender: TObject; var CanClose: Boolean); VAR I : Integer; sname : String; begin Canclose:=True; For I:=0 to Screen.FormCount-1 do Begin sname:=Screen.Forms[I].Name; if (sname<>'Hauptformular') and (sname<>'Form_Konfiguration') and (sname<>'DBAnalyze') then Begin canclose:=False; break; end; End; if NOT Canclose then Showmessage ('XXXxxx kann nicht beendet werden. Sie haben noch andere Programmfunktionen aktiv. Schliessen Sie diese bitte zuerst.'); end; |
|
|