Entwickler-Ecke

Grafische Benutzeroberflächen (VCL & FireMonkey) - Fenster schließen


Andi1982KA - Sa 19.10.02 15:28
Titel: Fenster schließen
hallo alle zusammen,

ich habe eine MDI-Anwendung (Form1). Darin wird ein MDI-Child Fenster (Form3) mit folgendem Befehl geöffnet:


Quelltext
1:
2:
3:
4:
procedure TForm1.MStartClick(Sender: TObject);
begin
   TForm3.Create(Self);
end;


Aus diesem Fenster heraus will ich ein anderes MDI-Child Fenster (Form4) öffnen aber Form3 dabei gleich schließen.

Mit folgendem Button öffne ich also Form4:


Quelltext
1:
2:
3:
4:
procedure TForm3.Button13Click(Sender: TObject);
begin
   TForm4.Create(Form1);
end;


In Form4 Soll dann ein Button die Form3 schließen:


Quelltext
1:
2:
3:
4:
procedure TForm4.Button1Click(Sender: TObject);
begin
   Form3.Close;
end;


Dann kommt aber immer ein Adressfehler. Ich denke dass sich das Programm merkt dass Form3 eigentlich Form4 erstellt hat und es deswegen nicht geschlossen werden kann oder so.

Achso, als FormClose-Ereignis bei Form3 habe ich action := CaFree; Weiss nicht ob das eine Rolle spielt!

Bitte helft mir, Gruss Andi!


AndyB - Sa 19.10.02 17:10

Das liegt wohl daran, dass du der Variablen Form3 keine Instanz der Klasse TForm3 zugewiesen hast.
Anstatt TForm3.Create(Self); könntest du
Form3 := TForm3.Create(Self);schreiben.


Andi1982KA - Sa 19.10.02 18:32
Titel: Hat geklappt
vielen Dank,

ich versteh zwar nicht warum das so funktioniert :? , aber es geht :D

Also danke nochmal!


AndyB - Sa 19.10.02 18:44

Mit TForm3.Create(...) setzt du die Variable Form3 noch nicht. Somit enthält Form3 den Wert nil. Wenn du nun mit Form3.Close auf Form3 zugreifst, wird eine Schutzverletzung ausgelöst, da Form3 eben nil enthält. Mit der Anweisung Form3 := TForm.Create(...) setzt du die Variable Form3 auf einen Wert, der die von dir gerade erzeugt Instanz enthält. Deswegen kann nun Form3.Close ohne AV aufgerufen werden.


Andi1982KA - So 20.10.02 16:05

Achso, ich dachte das lag daran weil Form3 die Form4 eigentlich erstellt hatte und sie deswegen nicht schließen konnte weil es sozusagen die "Mutter" von ihr ist :) Naja, jetzt hab ichs aber verstanden.

Vielen Dank nochmal!