Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Weitere Fenster geöffnet? (https://www.delphipraxis.net/105158-weitere-fenster-geoeffnet.html)

trashcandesign 17. Dez 2007 10:33


Weitere Fenster geöffnet?
 
Moin,

ich habe ein Programm, dass mehrere Unterfenster öffnen kann.
Diese unterfenster sind leider nicht vom gleichen Typ, dh. ich habe TForm1, TForm2, TForm3 ... usw.

Jetzt möchte ich bevor das Programm geschlossen wird überprüfen, ob noch eins dieser Unterfenster geöffnet ist und dementsprechend eine Meldung ausgeben. Frage ist nur wie?

Ich hab mir mal eine Array gebastelt, in das ich die WindowHandles schreibe, finde aber keine möglichkeit zu überprüfen, ob das zu dem Handle gehörende Fenster noch offen ist!?

vlees91 17. Dez 2007 10:37

Re: Weitere Fenster geöffnet?
 
lass die Fenster beim oeffnen in ein Projektwetes Array (boolsch) reinschreiben wenn sie sich oeffnen und wenn sie geschlossen werden.
beim beenden kontrollieren ob das ganze array nur falses enthaelt

trashcandesign 17. Dez 2007 10:40

Re: Weitere Fenster geöffnet?
 
sowas in der richtung hatte ich mal drin, hat aber ab und an mal nicht richtig funktioniert.
Irgendwie haben es unsere kunden immerwieder geschafft, die fenster zu shcließen, ohne dass dieser Boolean wert false angenommen hat.
Sodass dann zwar kein fenster mehr offen war, aber mein Programm immer noch "dachte" es wäre so.

Deswegen wollte ich halt aktiv überprüfen, ob die Fenster noch aktiv sind.

Luckie 17. Dez 2007 10:44

Re: Weitere Fenster geöffnet?
 
Kann man nicht Show auf wahr prüfen? Und man müsste auch über TApplication über die vorhandenen Formulare iterieren können.

trashcandesign 17. Dez 2007 10:55

Re: Weitere Fenster geöffnet?
 
Show kann man auf wahr prüfen, indem man schaut, ob es visible ist, aber dazu müsste ich ja irgendwie vom Handle auf die Form kommen.

Bei TApplicaiton hab ich leider nichts gefunden, mit dem man durch die Formulare iterieren könnte.

Luckie 17. Dez 2007 11:11

Re: Weitere Fenster geöffnet?
 
Zitat:

Zitat von trashcandesign
Show kann man auf wahr prüfen, indem man schaut, ob es visible ist, aber dazu müsste ich ja irgendwie vom Handle auf die Form kommen.

Bei TApplicaiton hab ich leider nichts gefunden, mit dem man durch die Formulare iterieren könnte.

Falsch du brauchst nicht das Handle, sondern die Objektinstanz, um die Eigenschaft Visisble abzufragen. Und der application sollten alle vorhandenen Formulare bekannt sein.

himitsu 17. Dez 2007 11:16

Re: Weitere Fenster geöffnet?
 
wie wäre es, wenn du einfach mal Form1.Visible, Form2.Visible, ... ausließt?

und warum speicherst du ie Handles der Forms?
(eine Refferenz auf die Forms macht sich doch auch gut :zwinker:)

:gruebel:
Delphi-Quellcode:
For i := 0 to Application.ComponentCount - 1 do
  If Application.Components[i].ClassName = 'TForm' Then
    ...

RavenIV 17. Dez 2007 11:18

Re: Weitere Fenster geöffnet?
 
Also ich habe eigene Prozeduren dafür in meiner Hauptform.

RegisterClient(aForm:TForm) und UnregisterClient(aForm: TForm)
Diese fügen das Form in eine TList ein bzw. entfernen sie wieder.
im FormCreate bzw. FormClose der UnterFormulare rufe ich diese Prozeduren auf.

Beim Schliessen der Hauptform prüfe ich, ob in der Liste noch ein Eintrag drin ist und reagiere entsprechend.
if fFensterListe.Count <> 0 then

bitsetter 17. Dez 2007 11:23

Re: Weitere Fenster geöffnet?
 
Hi,

noch eine Variante:
Delphi-Quellcode:
var
  i: integer;
begin
  for i:= 0 to Application.ComponentCount- 1 do
    if Application.Components[i] is TCustomForm then
      if TCustomForm(Application.Components[i]).Showing then
        showmessage(TCustomForm(Application.Components[i]).Name)

Hawkeye219 17. Dez 2007 11:46

Re: Weitere Fenster geöffnet?
 
Hallo,

ihr sucht an der falschen Stelle., Delphi-Referenz durchsuchenTScreen bietet einen Zugriff auf alle Formulare der Applikation.

Gruß Hawkeye

trashcandesign 17. Dez 2007 12:28

Re: Weitere Fenster geöffnet?
 
Danke Hawkeye so funktioniert das, was ich will:

Delphi-Quellcode:
var
  i : integer;
begin
  for i := 0 to Scree.FormCount-1 do
    if Screen.Forms[i].Visible then
      Showmessage Screen.Forms[i].Name;

himitsu 17. Dez 2007 13:00

Re: Weitere Fenster geöffnet?
 
Zitat:

Zitat von Hawkeye219
ihr sucht an der falschen Stelle...

wieso?
in Application.Components sind alle Komponenten (TForm und sein Vorfahre TCustomForm sind welche), welcheApplication zugeordnet sind, aufgelistet. :angel:


naj, ein Ziel und viele Wege

RavenIV 17. Dez 2007 13:20

Re: Weitere Fenster geöffnet?
 
Zitat:

Zitat von himitsu
Zitat:

Zitat von Hawkeye219
ihr sucht an der falschen Stelle...

wieso?
in Application.Components sind alle Komponenten (TForm und sein Vorfahre TCustomForm sind welche), welcheApplication zugeordnet sind, aufgelistet. :angel:


naj, ein Ziel und viele Wege

Hawkeye hat schon recht.
Warum soll ich (das Programm) mich durch Application.Components durchackern, wenn in Screen.Forms genau das ist, was ich haben will, nämlich die geöffneten Formulare?

Man kann es ja auch oberkompliziert machen, sodass es am Schluss keiner mehr kapiert.

Hawkeye219 17. Dez 2007 13:43

Re: Weitere Fenster geöffnet?
 
Zitat:

Zitat von himitsu
wieso?
in Application.Components sind alle Komponenten (TForm und sein Vorfahre TCustomForm sind welche), welche Application zugeordnet sind, aufgelistet.

Eben, nur die. Für Formulare, die man dynamisch ohne Eigentümer erzeugt hat, muß man entweder selbst Referenzen verwalten, oder man kann das Screen-Objekt befragen. Ich bin allerdings nicht sicher, ob das noch Teil der Aufgabenstellung war.

Gruß Hawkeye

RavenIV 17. Dez 2007 13:51

Re: Weitere Fenster geöffnet?
 
Zitat:

Zitat von Hawkeye219
Für Formulare, die man dynamisch ohne Eigentümer erzeugt hat, muß man entweder selbst Referenzen verwalten, ...

<offtopic>
Ich sehe keinen Sinn darin ein Formular ohne Eigentümer (Besitzer) zu erstellen.
Normalerweise erstellt man ein Formular mit
Application.CreateForm(TFoStatus, FoStatus);
oder
fFoTimeEdit := TTimeEditForm.Create(Self);


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz