Einzelnen Beitrag anzeigen

Benutzerbild von Kalakmul
Kalakmul

Registriert seit: 11. Apr 2008
27 Beiträge
 
Delphi 2010 Professional
 
#1

Unterschied zwischen "Self" und Form2 (MDI-Child-Formular)?

  Alt 6. Aug 2014, 20:59
Ich habe ein Programm (MDI) erstellt, das außer dem Hauptformular zwei Childfenster enthält.

Von diesen soll eines (Form3 - "Auswahlfenster" genannt) beim Programmstart sofort angezeigt werden (mittels Projektoptionen - verfügbare Formulare unter "automatisch erzeugen" eingetragen). Es soll Buttons als eine Art Auswahl enthalten, von denen aus weitere Childfenster angezeigt werden können. Jedes Childfenster soll aber nur einmal angezeigt werden können.

Das zweite Childfenster ("Kindfenster" genannt) wird zur Laufzeit erzeugt und hat einen Button, mit dem es wieder geschlossen werden kann.

Das habe ich auch so hinbekommen (mit dem unten auskommentierten "Form2 := nil", bin dabei aber auf ein Verständnisproblem im FormClose-Ereignis des "Kindfensters" gestoßen:

Delphi-Quellcode:
procedure TForm2.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  Action := caFree;
  if Self = Form2
  then begin
// Self := nil; // klappt offenbar nicht (Child wird nach einmaligem
                 // Schließen nicht mehr angezeigt.
// TForm2(Sender) := nil;
// Form2 := nil; // sonst öffnet sich das das Fenster nur beim ersten Mal
                   // Offenbar ist "self" nicht genau dasselbe
                   // an dieser Stelle wie "Form2".
    TForm(Self) := nil; // auch so geht es nicht
  end;
end;
So wie der Quelltext oben angegeben ist, lässt sich das Kindfenster einmal schließen und wird beim erneuten Versuch, es zu öffnen, nicht mehr angezeigt.

Der aufrufende Quellcode zur Anzeige des Kindfensters lautet:

Delphi-Quellcode:
procedure TForm3.btnZeigeChildClick(Sender: TObject);
begin
  if Form2 = nil then // soll verhindern, dass das Child 2mal angezeigt wird
  begin
    Application.CreateForm(TForm2, Form2);
  end;
end;
Was ich nun nicht verstehe ist, warum nur das explizite Setzen von Form2 auf nil wie gewünscht funktioniert, selbst wenn ich Self auf TForm2 caste und vorher auf "Self = Form2" getestet habe. Kann mir hierzu jemand eine Erklärung geben?

Im Anhang habe ich das Beispielprojekt angehängt. Ich benutze Delphi 2010 und habe es damit kompiliert.
Angehängte Dateien
Dateityp: zip MDI-Fenster mit Self schließen.zip (405,5 KB, 1x aufgerufen)
Wer fragt, ist ein Narr für 5 Minuten, wer nicht fragt, ist ein Narr ein Leben lang.
  Mit Zitat antworten Zitat