Einzelnen Beitrag anzeigen

corny2000

Registriert seit: 31. Mai 2007
3 Beiträge
 
#1

Frame soll sich selbst löschen

  Alt 27. Jan 2008, 14:11
Hallo,

Ich verwende Delphi 7 und habe folgenden Eintrag in der Hilfe-Datei unter der Erklärung für die prozedur "free" gefunden:

Zitat:
Warnung: Sie dürfen eine Komponente nie in einer ihrer eigenen Ereignisbehandlungsroutinen oder in einer Ereignisbehandlungsroutine eines untergeordneten Objekts freigeben. Geben Sie beispielsweise auf keinen Fall eine Schaltfläche oder ihr übergeordnetes Formular in der OnClick Ereignisbehandlungsroutine der Schaltfläche frei.
Nun, genau DIES muss ich aber für mein Projekt hinbekommen. Ich habe ein kleines Beispiel-Projekt zur Veranschaulichung erzeugt.

Ich erzeuge ein Formular mit einem Button und einem Panel:

http://web.whosting.ch/Fashionhbj/frame1.jpg

Delphi-Quellcode:
type
  TForm1 = class(TForm)
    Button1: TButton;
    Panel1: TPanel;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var MyFrame: TFrame1;

procedure TForm1.Button1Click(Sender: TObject);
begin
  if not Assigned(MyFrame) then
  begin
    MyFrame := TFrame1.Create(Panel1);
    MyFrame.Parent := Panel1;
    MyFrame.Align := alClient;
  end else MyFrame.Free;
end;
Klickt man nun auf den Button, wird MyFrame erzeugt oder gelöscht. Funktioniert ganz fantastisch!


MyFrame ist vom Typ Frame1. Diese sieht folgendermaßen aus:

http://web.whosting.ch/Fashionhbj/frame0.jpg

Delphi-Quellcode:
type
  TFrame1 = class(TFrame)
    FrameButton: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

implementation

uses UTest;

{$R *.dfm}

procedure TFrame1.FrameButtonClick(Sender: TObject);
begin
  Form1.Button1.Click;
end;
Wie am Quellcode von FrameButtonClick auf TFrame1 ersichtlich, möchte ich den Frame löschen, sobald dieser Button geklickt wird.

http://web.whosting.ch/Fashionhbj/frame2.jpg


Natürlich geht das so nicht, denn folgendes geschieht:
- Ich klicke auf FrameButton in MyFrame
- Es wird Button1Click in Form1 aufgerufen
- Button1.Click in Form1 sorgt dafür, dass der Frame zerstört wird
- Nach Beenden von Button1Click in Form1 kehrt das Programm in FrameButtonClick auf MyFrame zurück - oh hoppla, MyFrame wurde doch schon gelöscht - Adressfehler, Programmabsturz.


Was also EIGENTLICH in FrameButtonClick stehen müsste wäre so etwas wie:
1. sobald dieser Frame freigegeben wurde, führe Button1Click auf Frame1 aus

-> Es gibt ein Kommando ".Release" was wohl genau das macht. Dummerweise gibt es das nicht für Frames.
-> Bei TForm geht das, einfach Self.Close

Hat einer ne Idee, wie man das Programm austricksen kann, damit ich mit dem Button auf den Frame den Frame löschen kann?
  Mit Zitat antworten Zitat