Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi abfragen, ob eine Form offen ist. (https://www.delphipraxis.net/96363-abfragen-ob-eine-form-offen-ist.html)

smart 23. Jul 2007 08:49


abfragen, ob eine Form offen ist.
 
Guten morgen!

Wie kann man abfragen, ob eine Form offen oder geschlossen ist.
Delphi-Quellcode:
If Form1.Show = True Then ...
geht nicht.


Gruß
Heike

SirThornberry 23. Jul 2007 08:50

Re: abfragen, ob eine Form offen ist.
 
Form.Show und Form.Hide sind Methoden welche letztendlich nur Form.Visible setzen.

h826839 23. Jul 2007 09:18

Re: abfragen, ob eine Form offen ist.
 
hi..

hast du schon ...

Delphi-Quellcode:
if Assigned(Form) then ...
... probiert

CalganX 23. Jul 2007 09:20

Re: abfragen, ob eine Form offen ist.
 
Assigned prüft letztlich nur, ob das Objekt erzeugt wurde. Aber das Formular kann ja erzeugt, aber trotzdem unsichtbar sein. Der Test auf Form.Visible = true, wie Jens ihn vorgeschlagen hat, ist schon die beste Lösung.

Chris

SirThornberry 23. Jul 2007 09:26

Re: abfragen, ob eine Form offen ist.
 
Zitat:

Zitat von CalganX
Assigned prüft letztlich nur, ob das Objekt erzeugt wurde. Aber das Formular kann ja erzeugt, aber trotzdem unsichtbar sein. Der Test auf Form.Visible = true, wie Jens ihn vorgeschlagen hat, ist schon die beste Lösung.

Chris

wenn denn nur ein Test auf Form.Visible :wink: Ein Test auf Form.Visible = true gibt nicht zwangsläufig an ob das Formular sichtbar ist. [b]Form.Visible = true[b] kann auch false sein obwohl das Form sichtbar ist

h826839 23. Jul 2007 09:32

Re: abfragen, ob eine Form offen ist.
 
^^...

... ja aber die Frage war doch, ob die Form offen oder geschlossen ist

smart 23. Jul 2007 09:57

Re: abfragen, ob eine Form offen ist.
 
Hi,

ich habe es getestet. Es klappt beides nicht einwandfrei. Ich nehme jetzt einfach zusätzlich ein String in den ich schreibe ob das Fenster zu oder offen ist. Den String kann ich dann später auswerten. Ist vielleicht nicht die eleganteste Lösung, aber läuft.

Gruß
Heike

RavenIV 23. Jul 2007 10:01

Re: abfragen, ob eine Form offen ist.
 
Zitat:

Zitat von h826839
... ja aber die Frage war doch, ob die Form offen oder geschlossen ist

was meint der Threadersteller mit offen oder geschlossen?
ist mit offen gemeint, dass das Form angezeigt wird?
oder meint er mit offen: es ist erzeugt worden und wartet darauf, dass es angezeigt wird?
oder vielleicht meint er damit ja auch, dass das Form sichtbar ist, also dass es nicht hinter einer anderen Form oder Anwendung liegt?

Und bedeutet geschlossen, dass es nicht sichtbar ist?
oder vielleicht, dass es auch schon zerstört worden ist?
oder dass es angezeicgt wird, aber nicht sichtbar ist weil es im Hintergrund ist?

Fragen über Fragen...
Das muss erst mal definiert werden.

SirThornberry 23. Jul 2007 10:05

Re: abfragen, ob eine Form offen ist.
 
die Bedeutung von offen und geschlossen ist eigentlich in dem fall eindeutig durch diese Zeile
Delphi-Quellcode:
If Form1.Show = True Then ...
Dadurch wird ja geheigt das es darum geht zu prüfen ob die Show-Anweisung ausgeführt wurde oder nicht.

smart 23. Jul 2007 10:06

Re: abfragen, ob eine Form offen ist.
 
Sorry, da habe ich mich unklar ausgedrückt ;-) Mit offen oder geschlossen meinte ich gezeigt oder nicht gezeigt. Um das ganze noch mal ganz einfach zu machen. Ich möchte einfach erreichen, dass man eine Form nicht zweimal aufrufen (öffnen) kann. Ich erzeuge die Form mit
Delphi-Quellcode:
Application.CreateForm(TForm5, Form5);
Gruß
Heike

bitsetter 23. Jul 2007 11:41

Re: abfragen, ob eine Form offen ist.
 
Hi,

ich bin mir zwar nicht sicher, aber geht es nicht mit
Delphi-Quellcode:
If Form1.Showing Then ...
?

Edit:
wenn du die Formulare dynamisch erstellst würde dann ja doch ein Test mit
Delphi-Quellcode:
if Assigned(Form) then ...
reichen um festzustellen ob das Objekt schon erzeugt wurde.

h826839 23. Jul 2007 13:29

Re: abfragen, ob eine Form offen ist.
 
hi... nochmal


wenn den Programm ein MDI ist dann Funktioniert auch

Delphi-Quellcode:
if (Main.ActiveMDIChild is Form5) then ...

RavenIV 23. Jul 2007 13:37

Re: abfragen, ob eine Form offen ist.
 
Zitat:

Zitat von smart
...Ich möchte einfach erreichen, dass man eine Form nicht zweimal aufrufen (öffnen) kann. ...

Dazu gibt es schon einige Beiträge hier.
Such mal nach "eine Instanz", "OneInstance", "mehrfach starten", oder "Mutex". Dann wirst Du geholfen.

Muetze1 23. Jul 2007 13:39

Re: abfragen, ob eine Form offen ist.
 
Zitat:

Zitat von h826839
wenn den Programm ein MDI ist dann Funktioniert auch

Delphi-Quellcode:
if (Main.ActiveMDIChild is Form5) then ...

Nein, das bedeutet nur, das die aktuelle, aktive Form das Child ist, nicht aber, dass es nicht sichtbar ist, da es auch sichtbar und nicht aktiv sein kann. Diese Abfrage ist somit auch bei MDI nicht zweckerfüllend...

Zitat:

Zitat von RavenIV
Zitat:

Zitat von smart
...Ich möchte einfach erreichen, dass man eine Form nicht zweimal aufrufen (öffnen) kann. ...

Dazu gibt es schon einige Beiträge hier.
Such mal nach "eine Instanz", "OneInstance", "mehrfach starten", oder "Mutex". Dann wirst Du geholfen.

Eine Form einmalig zeigen ist was anderes als ein Programm einmalig starten können...

Codewalker 24. Jul 2007 07:22

Re: abfragen, ob eine Form offen ist.
 
Du könntest doch einfach im OnCreate Deines Forms einen Mutex erzeugen
Delphi-Quellcode:
dwMutex : DWORD;
{ .... }
dwMutex  := CreateMutex(nil,true,'Test'); // Schauen, ob das Programm schon mal läuft
ihn im OnClose wieder freigeben
Delphi-Quellcode:
CloseHandle(dwMutex);

und dann einfach vor dem CreateForm prüfen, ob der Mutex schon existiert
Delphi-Quellcode:
dwMutex  := CreateMutex(nil,true,'Test'); // Mutex erzeugen
  try
    if GetLastError <> ERROR_ALREADY_EXISTS then // Mutex noch nicht erzeugt
     CreateForm(  {... und so weiter }
dwMutex muss dann nur irgendwo global deklariert sein, aber das sollte ja das kleinere Problem sein. Ist vielleicht nicht die einfachste Lösung, aber sollte so funktionieren.

Grüße

Tom

EDIT: Na, der Mutex im OnCreate ist ja doppelt gemoppelt. So schlägt der ja fehl. Also das OnCreate ist wohl unnötig.

SirThornberry 24. Jul 2007 07:47

Re: abfragen, ob eine Form offen ist.
 
der Mutex kann auch im OnCreate erzeugt werden und im Falle des existierens wird eine exception augelöst. Dadurch würde der Destructor aufgerufen werden und es wird nicht nochmal erstellt.

Codewalker 24. Jul 2007 10:29

Re: abfragen, ob eine Form offen ist.
 
Klar, das geht - dann wirds natürlich noch einfacher :mrgreen:

SirThornberry 24. Jul 2007 10:34

Re: abfragen, ob eine Form offen ist.
 
Generell finde ich das aber eigentlich die falsche herangehensweise. Wenn man eine Instanz erzeugt hat, hat man ja die Instanzvariable anhand der man das prüfen kann.
Es wurde ja auch geschrieben das es anhand einer Stringvariablen geht (wo drin steht ob gestartet oder nicht). Warum sollte es also nicht mit der Instanzvariablen klappen? Da ist irgendwas im argen. Und selbst ohne Instanzvariable sollte anstelle der Stringvariablen dann doch eine Bool-Variable genügen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:20 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