Einzelnen Beitrag anzeigen

Benutzerbild von Matze
Matze
(Co-Admin)

Registriert seit: 7. Jul 2003
Ort: Schwabenländle
14.929 Beiträge
 
Turbo Delphi für Win32
 

Re: Frame HowTo

  Alt 12. Apr 2006, 10:10
Es gibt Situationen, da benötigt man mehrere identische Eingabeformulare, zum Beispiel auf TabSheets, wie hier zu sehen ist:



Ich habe mich hingesetzt und probiert, wie man so etwas am einfachsten bewerkstelligen kann und kam zu dem Ergebnis, das TFrames dafür ideal sind. Damit geht es ohne größeren Programmieraufwand.

Im Programm kann man in verschiedene Register zum Beispiel Namen hineinschreiben und diese dann auslesen. Die Namen schreibt man in ein TEdit, das über ein Frame auf jedes TabSheet gesetzt wird. Möchte man diese Eingabemaske bearbeiten, so genügt es, das Frame zu ändern, dann wird dies für jedes TabSheet übernommen.

Um ein Frame zu erstellen wählt man aus dem Menü Datei --> Neu --> Frame.
Folgendes bekommt man dann zu Gesicht:



Es ist quasi ein Formular, auf dem man natürlich nach Belieben Komponenten platzieren kann. Wir bestücken das Frame so:



Dann ziehen wir noch ein TPageControl (Register: Win32) aufs Formular, auf dem nachher die TabSheets angezeigt werden.

Nun zum eigentlichen Programmieren:

Das Frame müssen wir nun erst einmal in das Formular einbinden, was mittels

Delphi-Quellcode:
implementation

{$R *.dfm} 

//Frame einbinden
uses Unit2;
geschieht.

Dann erzeugen wir zur Laufzeit die TabSheets, die Frames für die einzelnen TabSheets und Labels zur Ausgabe des Namens. Dazu müssen wir die entsprechenden Variablen deklarieren. Ich habe sie global deklariert, dann kann man später von anderen Formularen einfach darauf zugreifen, aber es geht natürlich genauso lokal:

Delphi-Quellcode:
var
  MyTabSheet: TTabSheet;
  MyFrame: TFrame;
  MyLabel: TLabel;
In unserem Beispiel erstellen wir 4 TabSheets mit den dazugehörigen Frames und Ausgabelabels:

Delphi-Quellcode:
var
  i: integer;
begin
  for i := 1 to 4 do
  begin
    //TabSheets anlegen
    MyTabSheet := TTabSheet.Create(PageControl1);
    MyTabSheet.PageControl := PageControl1;
    MyTabSheet.Name := 'MyTab_' + IntToStr(i);
    MyTabSheet.Caption := 'Register Nr. ' + IntToStr(i);
    MyTabSheet.Show;

    //Frames drauf positionieren
    MyFrame := TFrame2.Create(Self);
    MyFrame.Name := 'MyFrame_' + IntToStr(i);
    MyFrame.Parent := MyTabSheet;
    MyFrame.Show;
  end;
end;
Nun erhält man 4 TabSheets mit jeweils einem Eingabeformular darauf. Um die eingetragenen Namen der einzelnen TabSheets auszulesen, geht man folgendermaßen vor:

Delphi-Quellcode:
var
  FrameText: string;
  i: integer;
begin
  for i := 1 to 4 do
  begin
    //Labels zur Ausgabe der Namen erstellen
    MyLabel := TLabel.Create(Form1);
    MyLabel.Name := 'MyLabel_' + IntToStr(i);
    MyLabel.Parent := Form1;
    MyLabel.Left := 10;
    MyLabel.Top := 220 + (MyLabel.Height + 10) * i;
    MyLabel.Show;

    //Den Text (Name) der einzelnen Frameszwischenspeichern ...
    FrameText := (FindComponent('MyFrame_' + IntToStr(i)) as TFrame2).Edit1.Text;
    //...und ausgeben
    (FindComponent('MyLabel_' + IntToStr(i)) as TLabel).Caption := FrameText;
  end;
end;
Nicht vergessen, am Ende wieder die erzeugten Objekte freizugeben:

Delphi-Quellcode:
//Objekte freigeben
procedure TForm1.FormDestroy(Sender: TObject);
var
  i: integer;
begin
  for i := 1 to 4 do
  begin
    (FindComponent('MyFrame_' + IntToStr(i)) as TFrame2).Free;
    (FindComponent('MyLabel_' + IntToStr(i)) as TLabel).Free;
    (FindComponent('MyTabSheet_' + IntToStr(i)) as TTabSheet).Free;
  end;
end;
Hinweis:
Mit Frames hat man die gleiche Unterstützung durch die IDE wie es bei Forms der Fall ist.
Das heißt: Man kann sie fröhlich von einander ableiten, um zum Beispiel eine gewisse Funktionalität oder ein Layout in allen Ableitungen verwenden zu können.

Dazu geht man auf Datei --> Neu --> Weitere --> Projektname und Frame auswählen

Mein Dank für diesen Hinweis geht an Robert_G.



So, das war's schon, viel Spaß beim Ausprobieren.
  Mit Zitat antworten Zitat