AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GUI-Design

Ein Thema von MarkusB · begonnen am 9. Dez 2004 · letzter Beitrag vom 11. Dez 2004
Antwort Antwort
MarkusB

Registriert seit: 3. Apr 2004
Ort: Hamburg
105 Beiträge
 
#1

GUI-Design

  Alt 9. Dez 2004, 23:29
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
Miniaturansicht angehängter Grafiken
beispiel_169.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Jelly
Jelly

Registriert seit: 11. Apr 2003
Ort: Moestroff (Luxemburg)
3.741 Beiträge
 
Delphi 2007 Professional
 
#2

Re: GUI-Design

  Alt 9. Dez 2004, 23:36
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 ;
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#3

Re: GUI-Design

  Alt 10. Dez 2004, 07:28
Oder du benutzt Delphi-Referenz durchsuchenTFrame. Damit lassen sich Forms als untergeordnetes, aber getrennt weiterentwickelbares Element eines anderen Formulars anzeigen
  Mit Zitat antworten Zitat
MarkusB

Registriert seit: 3. Apr 2004
Ort: Hamburg
105 Beiträge
 
#4

Re: GUI-Design

  Alt 11. Dez 2004, 23:14
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:14 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz