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?