Moin!
Meine Applikation besteht aus einer MainForm und zwei Frames. Die MainForm beinhaltet ein Menü mit drei Punkten: „Exit“, „Frame1“ und „Frame2“. Jeder Frame beinhaltet jeweils einen Button. Die MainForm und die Frames sind in getrennten Projekten definiert. Die Frames sollen im Client-Bereich der MainForm angezeigt werden. Zum Wechseln zwischen den Frames benutze ich das Menü auf der MainForm. Nach einem Klick auf den Menü-Punkt „Frame1“ passiert folgendes:
<PRE>procedure TForm1.MenueFrame1Click(Sender: TObject);
begin
if Assigned(LocalFrame)
then LocalFrame.Destroy;
LocalFrame := TFrame1.Create(self);
LocalFrame.Parent := MainForm;
LocalFrame.Show;
end;</PRE>
und nach einem Klick auf den Menü-Punkt „Frame2“ das:
<PRE>procedure TForm1.MenueFrame2Click(Sender: TObject);
begin
if Assigned(LocalFrame)
then LocalFrame.Destroy;
LocalFrame := TFrame2.Create(self);
LocalFrame.Parent := MainForm;
LocalFrame.Show;
end;</PRE>
Wobei „LocalFrame“ eine Variable ist, die im Public Bereich der MainForm als TFrame definiert ist. Bis hier funktioniert alles sehr gut.
Nun zu meinem Problem. Wie ich schon erwähnt habe, ist auf jedem Frame ein Button platziert. Nachdem Wechsel zwischen den Frames über das Menü so gut funktioniert hat, wollte ich auch die Buttons dazu verwenden. Und zwar so, dass ich im Frame1 (oder Frame2) stehend durch den Klick auf Button1 den Klick auf das Menü in der MainForm simuliere:
<PRE>procedure TFrame1.Button1Click(Sender: TObject);
begin
MainForm.MainMenu1.Items[2].Click; //Items[2] -> Frame2
end;
procedure TFrame2.Button1Click(Sender: TObject);
begin
MainForm.MainMenu.Items[1].Click; //Items[1] -> Frame1
end; </PRE>
... und das funktioniert nur teilweise richtig. Es wird zwar zwischen den Frames gewechselt, aber nach der Abarbeitung aller Anweisungen in TForm1.MenueFrame1Click (bzw. TForm1.MenueFrame2Click), kehrt das Programm in Procedure TFrame1.Button1Click (bzw. TFrame1.Button2Click) zurück. Doch dann wird eine Exception ausgelöst und das, wie ich meine zu Recht. Das Problem liegt daran das zwischen dem Zeitpunkt des Klicks auf den Button und dem Zeitpunkt des Rückers in TFrameX.Button1Click, wird der Frame gelöscht (LocalFrame.Destroy). Also anders gesagt der Button löscht den eigenen Frame („Sägt den Ast, auf dem er selber sitzt, ab) und das geht schief. Deswegen wird eine Exception ausgelöst.
Wie kann ich den Fehler eliminieren?
Viele Grüße
Markus
Meine Applikation besteht aus einer MainForm und zwei Frames. Die MainForm beinhaltet ein Menü mit drei Punkten: „Exit“, „Frame1“ und „Frame2“. Jeder Frame beinhaltet jeweils einen Button. Die MainForm und die Frames sind in getrennten Projekten definiert. Die Frames sollen im Client-Bereich der MainForm angezeigt werden. Zum Wechseln zwischen den Frames benutze ich das Menü auf der MainForm. Nach einem Klick auf den Menü-Punkt „Frame1“ passiert folgendes:
<PRE>procedure TForm1.MenueFrame1Click(Sender: TObject);
begin
if Assigned(LocalFrame)
then LocalFrame.Destroy;
LocalFrame := TFrame1.Create(self);
LocalFrame.Parent := MainForm;
LocalFrame.Show;
end;</PRE>
und nach einem Klick auf den Menü-Punkt „Frame2“ das:
<PRE>procedure TForm1.MenueFrame2Click(Sender: TObject);
begin
if Assigned(LocalFrame)
then LocalFrame.Destroy;
LocalFrame := TFrame2.Create(self);
LocalFrame.Parent := MainForm;
LocalFrame.Show;
end;</PRE>
Wobei „LocalFrame“ eine Variable ist, die im Public Bereich der MainForm als TFrame definiert ist. Bis hier funktioniert alles sehr gut.
Nun zu meinem Problem. Wie ich schon erwähnt habe, ist auf jedem Frame ein Button platziert. Nachdem Wechsel zwischen den Frames über das Menü so gut funktioniert hat, wollte ich auch die Buttons dazu verwenden. Und zwar so, dass ich im Frame1 (oder Frame2) stehend durch den Klick auf Button1 den Klick auf das Menü in der MainForm simuliere:
<PRE>procedure TFrame1.Button1Click(Sender: TObject);
begin
MainForm.MainMenu1.Items[2].Click; //Items[2] -> Frame2
end;
procedure TFrame2.Button1Click(Sender: TObject);
begin
MainForm.MainMenu.Items[1].Click; //Items[1] -> Frame1
end; </PRE>
... und das funktioniert nur teilweise richtig. Es wird zwar zwischen den Frames gewechselt, aber nach der Abarbeitung aller Anweisungen in TForm1.MenueFrame1Click (bzw. TForm1.MenueFrame2Click), kehrt das Programm in Procedure TFrame1.Button1Click (bzw. TFrame1.Button2Click) zurück. Doch dann wird eine Exception ausgelöst und das, wie ich meine zu Recht. Das Problem liegt daran das zwischen dem Zeitpunkt des Klicks auf den Button und dem Zeitpunkt des Rückers in TFrameX.Button1Click, wird der Frame gelöscht (LocalFrame.Destroy). Also anders gesagt der Button löscht den eigenen Frame („Sägt den Ast, auf dem er selber sitzt, ab) und das geht schief. Deswegen wird eine Exception ausgelöst.
Wie kann ich den Fehler eliminieren?
Viele Grüße
Markus
Comment