Moin!
Vielen Dank für Eure prompten Antworten. Inzwischen habe ich Eure Hinweise in ein ganz einfaches Delphi-Testprogramm umgesetzt. Über das Menü „Übersicht“ bekommt man die Tabelle zu sehen und wenn man das Menü „Details“ anklickt, sieht man einzelne Felder eines Datensatzes. Ganz genau so wie ich das in meinem Posting beschrieben habe. Super!
Und so wurde es implementiert (1 Form und 2 Frames):
Im Ereignis „OnCreate“ der Main-Form werden 2 Frames erzeugt: „View“ und „Details“. Am Anfang sind beide unsichtbar. Danach, abhängig vom angeklickten Menü werden die Frames entsprechend sichtbar oder unsichtbar gemacht:.
Delphi-Quellcode:
procedure TForm1.ShowViewFrame(Sender: TObject);
begin
if DetailsFrame.Visible
then DetailsFrame.Hide;
ViewFrame.Show;
end;
procedure TForm1.ShowDetailsFrame(Sender: TObject);
begin
if ViewFrame.Visible
then ViewFrame.Hide;
DetailsFrame.Show;
end;
Dadurch bekommt man den Effekt des Frame-Austauschens. Wenn man sich im „View“-Frame befindet, dann kann man das Menü „Details“ oder auch den Button „Details“ benutzen um zu dem Frame „Details“ zu gelangen. Im letzen Fall simuliere ich das „Anklicken“ des Menü „Details“:
Delphi-Quellcode:
procedure TViewFrame.Button1Click(Sender: TObject);
begin
Form1.MainMenu1.Items[0].Click;
end;
Und umgekehrt wenn man sich im „Details“-Frame befindet, dann kann man das Menü „View“ oder auch den Button „View“ benutzen um zu dem Frame „View“ zu gelangen. Im letzen Fall simuliere ich das „Anklicken“ der Menü „View“ (ähnlich wie oben).
So kann man zwischen den Frames wechseln. Prima! Nun könnte ich weitere Frames definieren und in Programm einbinden. Könnte ich machen, aber .... J. Das wurde dazu führen, dass im Falle eines größeren Programms ich unzählige Frames beim seinem Start erstellen müsste. Und das gefiel mir nicht so ganz ...
Implementierung mit einer Form:
Ich habe in der Form eine public Variable LocalFrame (TFrame) definiert. Jetzt werden die unterschiedlichen Frames zu der Laufzeit dynamisch, einzählend (ein Frame zur Zeit und nur dann wenn sie tatsächlich gebraucht werden) erstellt und der Variablen „LocalFrame“ zugewiesen. Das geschieht wenn man das entsprechende Menü anklickt:
Delphi-Quellcode:
procedure TForm1.ShowViewFrame(Sender: TObject);
begin
if Assigned(LocalFrame)
then LocalFrame.Destroy;
LocalFrame := TViewFrame.Create(self);
LocalFrame.Parent := Form1;
LocalFrame.Show;
end;
procedure TForm1.ShowDetailsFrame(Sender: TObject);
begin
if Assigned(LocalFrame)
then LocalFrame.Destroy;
LocalFrame := TDetailsFrame.Create(self);
LocalFrame.Parent := Form1;
LocalFrame.Show;
end;
Funktioniert perfekt bis man auf die Idee kommt die Buttons zum Wechseln der Frames zu benutzen (Funktion wie oben). Dann nämlich kriegt man die
Exception um die Ohren gehauen und das zu Recht. Beim OnClick Ereignis des Buttons (der auf der Frame liegt) wird die Funktion ShowXXXFrame (die in der MainForm definiert ist) aufgerufen. Sie beinhaltet eine Reihe von Anweisungen und löst eine Reihe von Aktionen aus. Unter anderem wird der Frame vom Button zerstört (LocalFrame.Destroy). Nach Abarbeitung aller Anweisungen in ShowXXXFrame kehrt das Programm in die OnClick-Funktion des Buttons zurück und das geht nicht gut, weil sie mitsamt dem ganzen Frame verschwunden ist - deswegen die
Exception.
Ufff – da hab ich viel erzählt. Nun meine Frage: wie kann ich ein Frame löschen und gleichzeitig einen neuen erstellen und am Schirm anzeigen. Beide Frames sollten der gerade freigewordenen Variablen zugewiesen werden. Die Schwierigkeit, die ich damit habe ist, dass die ganze Aktion aus dem zu zerstörendem Frame herausgestartet werden soll - zum Beispiel durch Anklicken eines Buttons der auf dem Frame liegt.
Viele Grüße
Markus