![]() |
GUI-Design
Liste der Anhänge anzeigen (Anzahl: 1)
Moin!
Ich möchte ein GUI bauen das in der Funktionsweise einer MDIForm ähnelt. Die Main-Form soll als ein Container für austauschbare Masken (z.B. Detaileingabe, Übersichts-Tabellen oder Auswertungsdiagramme) dienen. Ich habe mir das etwa so vorgestellt: eine leere Main-Form mit einem Menü, in deren Client-Bereich ich unterschiedliche „Panels“ platzieren könnte. Die „Panels“ sollten in selbständigen Projekten unabhängig vom dem MainForm-Project entwickelt werden. Wie kann man das realisieren ohne MDIForm, TabControl oder PageControl benutzen zu müssen? Beispiel: MainForm: Picture01 Panel für Übersichtstabelle: Picture02 GUI-Übersicht: Picture03 = Picture01 + Picture 02 MainForm: Picture01 Panel für Details-Eingabe/-Manipulation: Picture04 GUI-Details: Picture05 = Picture 01 + Picture 04 Viele Grüße Markus :gruebel: |
Re: GUI-Design
Du kannst mit dieser Methode eine komplette Form in einem Panel (Name=panContainer) anzzeigen. Vielleicht hilft dir das ja schon mal weiter:
Delphi-Quellcode:
procedure TfrmMain.ChangeModule (ModuleNum : integer) ;
var NewDemoClass: TFormClass; NewDemo: TForm; begin case ModuleNum of 1: NewDemoClass := TForm1; 2: NewDemoClass := TForm2; else NewDemoClass := nil; end; { panContainer = TPanel } if (panContainer.ControlCount = 0) or not (panContainer.Controls[0] is NewDemoClass) then begin if panContainer.ControlCount > 0 then panContainer.Controls[0].Free; if Assigned(NewDemoClass) then begin NewDemo := NewDemoClass.Create(Self); NewDemo.Hide; NewDemo.BorderStyle := bsNone; NewDemo.Parent := panContainer; NewDemo.Align := alClient; NewDemo.Show; end; end; end ; |
Re: GUI-Design
Oder du benutzt
![]() |
Re: GUI-Design
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:
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“:
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;
Delphi-Quellcode:
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).
procedure TViewFrame.Button1Click(Sender: TObject);
begin Form1.MainMenu1.Items[0].Click; end; 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:
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.
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; 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 :gruebel: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz