Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Prüfen ob Formular bereits existiert


Danny87 - Di 14.02.06 13:54
Titel: Prüfen ob Formular bereits existiert
Hallo auch,
Ich erzeuge zu Laufzeit mit einem Buttonklick ein Formular.
Dieses Formular darf aber nur einmal erzeugt werden.
Ich weiss aber nicht wie ich abfragen kann, ob das Formular bereits existiert.
Ich hatte da schon eine Idee mit einer booleschen Variablen, aber das scheint mir
nicht sehr elegant.

Ich hab mir das ungefähr so vorgestellt:

Delphi-Quelltext
1:
2:
if Form2.Existiert then
  Erzeuge Form2;



gruss daniel


jaenicke - Di 14.02.06 15:17

Wenn Form2 noch nicht existiert, dann kannst du auch auf kein darin enthaltenes Element, in diesem Fall deine boolsche Variable, zugreifen...
Du bekommst dann eine Zugriffsverletzung...

So gehts...

Delphi-Quelltext
1:
2:
if Form2 = nil then
  Form2 := TForm2.Create(Self);

Solange Form2 noch nicht erzeugt wurde, ist die entsprechende Variable nil (der Pointer zeigt auf den Speicherbereich 0, wo nie zugegriffen werden darf).
Und genau das kannst du abfragen.


digi_c - Di 14.02.06 15:18

Also ich finde es akzeptabel, ansonsten (da bin ich mir aber nicht sicher) müsstest du in einer Schleife prüfen ob unter den Formularen ein Formular ist, das von dieser Formularklasse abgeleitet wurde.


chrisw - Di 14.02.06 15:21

Oder

Delphi-Quelltext
1:
if assigned(Form2) then .....                    


Danny87 - Di 14.02.06 15:51

user profile iconjaenicke hat folgendes geschrieben:

So gehts...

Delphi-Quelltext
1:
2:
if Form2 = nil then
  Form2 := TForm2.Create(Self);

Solange Form2 noch nicht erzeugt wurde, ist die entsprechende Variable nil (der Pointer zeigt auf den Speicherbereich 0, wo nie zugegriffen werden darf).
Und genau das kannst du abfragen.


Das wars was ich gesucht habe. Danke!


jojo-sp - Di 14.02.06 16:05

Vergiss nachher nicht das Freigeben des Forms. Entweder wenn du das Fenster verlässt, oder das ganze Programm beendest (kommt daruaf an, wo du dein Create machst).


Delphi-Quelltext
1:
2:
3:
4:
5:
If Assigned(EigenesForm) Then
Begin
  EigenesForm.Free;
  EigenesForm := nil;
end;


Danny87 - Di 14.02.06 16:07

das create hab ich anders gemacht, weil ich mit


Delphi-Quelltext
1:
Form2 := Form2.Create(self);                    

eine Fehlermeldung bekomme.

habs so gemacht:


Delphi-Quelltext
1:
Application.CreateForm(TForm2, Form2);                    



//Edit:

Im OnClose von Form2

Delphi-Quelltext
1:
2:
Destroy;
Form2 := nil;


Es handelt sich übrigens um ein MDI-Child


mkinzler - Di 14.02.06 16:11

Zitat:
das create hab ich anders gemacht, weil ich mit

ausblenden anzeigen Delphi-Quelltext
ausgeblendet markieren
1:

Form2 := Form2.Create(self);

eine Fehlermeldung bekomme.


es muß auch Form2 := TForm2.Create(self); heißen


Danny87 - Di 14.02.06 16:14

Huch!
Verdammtes T ;-)

ja, jetzt gehts....
ich sollte vllt mal genauer hinschauen :-D

Jetzt funzt auch das Free;


jojo-sp - Di 14.02.06 16:16

Du hasst ja auch ein T vergessen:


Delphi-Quelltext
1:
  Form2 := TForm2.Create(Self);                    


aber die Funktion FormCreate kannte ich noch gar nicht ;-), aber wenns geht :gruebel:


digi_c - Di 14.02.06 16:48

Ahh assigned, verdammt :oops: