Difference between revisions of "Dynamic form components creation in Lazarus/de"

From Lazarus wiki
Jump to navigationJump to search
m
m (Fixed template loop)
 
(6 intermediate revisions by 2 users not shown)
Line 1: Line 1:
Zum einen kann man ganz einfach über den Objektinspektor einen [[TButton/de|Button]] erstellen sowie Ereignisse für diesen registrieren (natürlich gehen auch andere Objekte).
+
{{LanguageBar}}
Das hat seine Vor- und Nachteile. Wenn man nur einen Button braucht, kann man den lieber über den Objektinspektor auf die Form ziehen und fertig (siehe dazu auch [[Form Tutorial/de|Tutorial für Formulare]]). Wenig Tipparbeit und schnell getan. Dann noch eben die gewüschten Eigenschaften ändern und fertig. Anders ist das, wenn man z.B. je nach Umständen verschiedene Buttons an unterschiedlichen Stellen haben möchte. Dann wird die Form sehr schnell unübersichtlich. Also brauchen wir eine alternative Lösung. Diese besteht darin, die Buttons (aber auch beliebige andere Objekte) mit ein paar Zeilen Quellcode zu erstellen. Ein kleines Beispiel ist hier zu sehen:
+
 
 +
= Dynamisch Komponenten in eime Form erzeugen =
 +
 
 +
Zum einen kann man ganz einfach über den Objektinspektor einen [[TButton/de|Button]] erstellen sowie Ereignisse für diesen registrieren (natürlich gehen auch andere Objekte).<br>
 +
Das hat seine Vor- und Nachteile. Wenn man nur einen Button braucht, kann man den lieber über den Objektinspektor auf die Form ziehen und fertig (siehe dazu auch [[Form Tutorial/de|Tutorial für Formulare]]). <br>
 +
Wenig Tipparbeit und schnell getan. Dann noch eben die gewünschten Eigenschaften ändern und fertig. Anders ist das, wenn man z.B. je nach Umständen verschiedene Buttons an unterschiedlichen Stellen haben möchte. <br>
 +
Dann wird die Form sehr schnell unübersichtlich. Also brauchen wir eine alternative Lösung. Diese besteht darin, die Buttons (aber auch beliebige andere Objekte) mit ein paar Zeilen Quellcode zu erstellen. Ein kleines Beispiel ist hier zu sehen:
 +
 
 +
<syntaxhighlight lang="pascal">
 +
unit Unit1;
 +
// Quellcode von carli | carli - lazarusforum.de
 +
// Kommentare von Sven | Bauer321 - lazarusforum.de
 +
 
 +
{$mode objfpc}{$H+}
 +
 
 +
interface
 +
 
 +
uses
 +
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 +
 
 +
type
  
unit Unit1;
 
//Quellcode von carli | carli - lazarusforum.de
 
//Kommentare von Sven | Bauer321 - lazarusforum.de
 
 
{$mode objfpc}{$H+}
 
 
interface
 
 
uses
 
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;
 
 
type
 
 
  { TForm1 }
 
 
 
  TForm1 = class(TForm)
 
    procedure FormCreate(Sender: TObject);
 
    procedure ButtonClick(Sender: TObject);
 
  private
 
    { private declarations }
 
  public
 
    { public declarations }
 
  end;
 
 
 
var
 
  Form1: TForm1;
 
 
implementation
 
 
 
{$R *.lfm}
 
 
 
 
  { TForm1 }
 
  { TForm1 }
 +
 +
TForm1 = class(TForm)
 +
  procedure FormCreate(Sender: TObject);
 +
  procedure ButtonClick(Sender: TObject);
 +
private
 +
  { private declarations }
 +
public
 +
  { public declarations }
 +
end;
 +
 +
var
 +
  Form1: TForm1;
 +
 +
implementation
 +
 +
{$R *.lfm}
 +
 +
{ TForm1 }
 +
 +
procedure TForm1.FormCreate(Sender: TObject);
 +
var
 +
  ed:  TEdit;  // eine Variable vom Typ TEdit
 +
  but: TButton; // eine Variable vom Typ TButton
 +
begin
 +
  ed        := TEdit.Create(self);            // Das Edit erstellen
 +
  ed.Parent := self;                          // Die aktuelle Form als Parent Form registrieren
 +
  ed.top    :=  8;                            // Abstand oben für das Edit festlegen
 +
  ed.Left  := 10;                            // Abstand links für das Edit festlegen
 +
  ed.Width  := ClientWidth - 2 * ed.left;      // Breite für das Edit festlegen
 +
  ed.text  := 'Bitte geben sie den Text ein'; // einen Text in das Edit-Feld schreiben
 
    
 
    
procedure TForm1.FormCreate(Sender: TObject);
+
   but         := TButton.Create(self);
var ed: TEdit; //eine Variable vom Typ Edit
+
  but.parent := self;               // Die aktuelle Form als Parent Form registrieren
    but: TButton; //eine Variable vom Typ Button
+
  but.top     := ed.Top + ed.Height; // Abstand oben für das Button festlegen
begin
+
  but.left   := ed.Left;           // Abstand links für das Button festlegen
  ed:=TEdit.Create(self); //Das Edit erstellen
+
  but.Caption := 'Klickmich';       // Caption für den Button festlegen
  ed.Parent:=self; //Die aktuelle Form als Parent Form registrieren
+
  but.OnClick := @ButtonClick;       // event Hinzufügen, in diesem Fall soll die Prozedur ButtonClick ausgerufen werden, wenn das OnClick Ereignis ausgelöst wird.
  ed.top:=8; //Abstand oben für das Edit festlegen
+
end;
  ed.Left:=10; //Abstand links für das Edit festlegen
+
 
  ed.Width:=ClientWidth-2*ed.left; //Breite für das Edit festlegen
+
// Prozedur "ButtonClick", die durch den Button, der unter der Variable "but" definiert ist, aufgerufen wird
  ed.text:='Bitte geben sie den Text ein'; //einen Text in das Edit-Feld schreiben
+
procedure TForm1.ButtonClick(Sender: TObject);
    
+
begin
  but:=TButton.Create(self);
+
  ShowMessage('Hallo Welt');
  but.parent:=self; //Die aktuelle Form als Parent Form registrieren
+
end;
  but.top:=ed.Top+ed.Height; //Abstand oben für das Button festlegen
+
 
  but.left:=ed.Left; //Abstand links für das Button festlegen
+
end.
  but.Caption:='Klickmich'; //Caption für den Button festlegen
+
</syntaxhighlight>
  but.OnClick:=@ButtonClick; //event Hinzufügen, in diesem Fall soll die Prozedur ButtonClick augerufen werden, wenn das OnClick Ereignis ausgelöst wird.
+
 
end;
 
 
//Prozedur "ButtonClick", die durch den Button, der unter der Variable "but" definiert ist, aufgerufen wird
 
procedure TForm1.ButtonClick(Sender: TObject);
 
begin
 
  showmessage('Hallo Welt');
 
end;
 
 
end.
 
  
Wie man sieht, wird dort ein Button unter der Variable "but" und ein Edit unter der Variable "ed" erstellt. Wenn man jetzt auf diese Objekte zugreifen will, muss man einfach nur die Variable "but" bzw. "ed" nutzen. Außerdem lassen sich Arrays nutzen. Bei vielen Feldern hat das den Vorteil, dass man sie einfach mit for-to-do Schleifen mit sehr wenig Quellcode auslesen bzw. ändern kann.
+
Wie man sieht, wird dort ein Button unter der Variable "but" und ein Edit unter der Variable "ed" erstellt. Wenn man jetzt auf diese Objekte zugreifen will, muss man einfach nur die Variable "but" bzw. "ed" nutzen. Außerdem lassen sich Arrays nutzen. Bei vielen Feldern hat das den Vorteil, dass man sie einfach mit for-to-do Schleifen mit sehr wenig Quellcode auslesen bzw. ändern kann.<br>
 
Beispiel mit zwei Arrays:
 
Beispiel mit zwei Arrays:
[http://sourceforge.net/projects/lazarusbeispiel/files/Komponenten-in-Lazarus-dynamisch-erstellen-Beispiel.zip/download Komponenten-in-Lazarus-dynamisch-erstellen-Beispiel.zip, 21.06.11]
+
* [http://sourceforge.net/projects/lazarusbeispiel/files/Komponenten-in-Lazarus-dynamisch-erstellen-Beispiel.zip/download Komponenten-in-Lazarus-dynamisch-erstellen-Beispiel.zip, 21.06.11]
  
 
Für's Erste soll's das sein. Mal gucken, ob ich das irgendwann nochmal erweitere oder nicht.
 
Für's Erste soll's das sein. Mal gucken, ob ich das irgendwann nochmal erweitere oder nicht.
 
Bei Fehlern oder optimierten Dingen einfach ausbessern ... --[[User:Sven|Sven]] 22:00, 20 June 2011 (CEST)
 
Bei Fehlern oder optimierten Dingen einfach ausbessern ... --[[User:Sven|Sven]] 22:00, 20 June 2011 (CEST)
<br />
+
 
<br />
 
 
[[Category:Forms/de]]
 
[[Category:Forms/de]]

Latest revision as of 11:51, 17 January 2020

Deutsch (de)

Dynamisch Komponenten in eime Form erzeugen

Zum einen kann man ganz einfach über den Objektinspektor einen Button erstellen sowie Ereignisse für diesen registrieren (natürlich gehen auch andere Objekte).
Das hat seine Vor- und Nachteile. Wenn man nur einen Button braucht, kann man den lieber über den Objektinspektor auf die Form ziehen und fertig (siehe dazu auch Tutorial für Formulare).
Wenig Tipparbeit und schnell getan. Dann noch eben die gewünschten Eigenschaften ändern und fertig. Anders ist das, wenn man z.B. je nach Umständen verschiedene Buttons an unterschiedlichen Stellen haben möchte.
Dann wird die Form sehr schnell unübersichtlich. Also brauchen wir eine alternative Lösung. Diese besteht darin, die Buttons (aber auch beliebige andere Objekte) mit ein paar Zeilen Quellcode zu erstellen. Ein kleines Beispiel ist hier zu sehen:

unit Unit1;
// Quellcode von carli | carli - lazarusforum.de
// Kommentare von Sven | Bauer321 - lazarusforum.de

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type

 { TForm1 }

 TForm1 = class(TForm)
   procedure FormCreate(Sender: TObject);
   procedure ButtonClick(Sender: TObject);
 private
   { private declarations }
 public
   { public declarations }
 end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormCreate(Sender: TObject);
var 
  ed:  TEdit;   // eine Variable vom Typ TEdit
  but: TButton; // eine Variable vom Typ TButton
begin
  ed        := TEdit.Create(self);             // Das Edit erstellen
  ed.Parent := self;                           // Die aktuelle Form als Parent Form registrieren
  ed.top    :=  8;                             // Abstand oben für das Edit festlegen
  ed.Left   := 10;                             // Abstand links für das Edit festlegen
  ed.Width  := ClientWidth - 2 * ed.left;      // Breite für das Edit festlegen
  ed.text   := 'Bitte geben sie den Text ein'; // einen Text in das Edit-Feld schreiben
  
  but         := TButton.Create(self);
  but.parent  := self;               // Die aktuelle Form als Parent Form registrieren
  but.top     := ed.Top + ed.Height; // Abstand oben für das Button festlegen
  but.left    := ed.Left;            // Abstand links für das Button festlegen
  but.Caption := 'Klickmich';        // Caption für den Button festlegen
  but.OnClick := @ButtonClick;       // event Hinzufügen, in diesem Fall soll die Prozedur ButtonClick ausgerufen werden, wenn das OnClick Ereignis ausgelöst wird.
end;

// Prozedur "ButtonClick", die durch den Button, der unter der Variable "but" definiert ist, aufgerufen wird
procedure TForm1.ButtonClick(Sender: TObject);
begin
  ShowMessage('Hallo Welt');
end;

end.


Wie man sieht, wird dort ein Button unter der Variable "but" und ein Edit unter der Variable "ed" erstellt. Wenn man jetzt auf diese Objekte zugreifen will, muss man einfach nur die Variable "but" bzw. "ed" nutzen. Außerdem lassen sich Arrays nutzen. Bei vielen Feldern hat das den Vorteil, dass man sie einfach mit for-to-do Schleifen mit sehr wenig Quellcode auslesen bzw. ändern kann.
Beispiel mit zwei Arrays:

Für's Erste soll's das sein. Mal gucken, ob ich das irgendwann nochmal erweitere oder nicht. Bei Fehlern oder optimierten Dingen einfach ausbessern ... --Sven 22:00, 20 June 2011 (CEST)