Autor Beitrag
motion
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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:

ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Veteran
Beiträge: 6366
Erhaltene Danke: 60

Windows 7, Ubuntu
Delphi 7 Prof.
BeitragVerfasst: Mo 19.09.05 16:19 
Hi,

also per API kannst du mit Suche im MSDN 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 416

Win XP Prof, Fedora Core 4, SuSE 7.0
D7 Ent, D2005 Pers
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 295

XP, Linux
D7 Prof
BeitragVerfasst: 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.
ausblenden 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;