Home » Tipps & Tricks » Komponenten » Allgemein » Komponenten zur Laufzeit erzeugen

Komponenten zur Laufzeit erzeugen

Normalerweise werden die meisten Komponenten, die ein Programm benötigt, schon zur Entwicklungszeit auf dem Formular platziert. Ist die Anzahl der benötigten Komponenten zur Entwicklungszeit noch nicht absehbar, müssen sie dynamisch erstellt werden.Dieses Beispiel erstellt einen TButton und weist ihm eine OnClick-Routine zu:

procedure TForm1.Button1Click(Sender: TObject);
var
  Button: TButton;
begin
  Button:=TButton.Create(Self);
  Button.Parent := Self;
  Button.Caption := 'Alter Titel';
  Button.Left := 100;
  Button.Top := 100;
  Button.OnClick := Button2Click;
end;

Wichtig ist, dass die Eigenschaft Parent gesetzt wird, um die Komponente eindeutig einer übergeordneten Komponente zuzuordnen. Dies ist häufig ein Formular oder ein TPanel oder TGroupbox. Self bezieht sich immer auf die aktuelle Klasseninstanz also in diesem Fall auf Form1. Man könnte also statt Self auch Form1 schreiben. Das funktioniert aber dann nicht mehr, wenn es mehr als eine Formularinstanz gibt. Deshalb sollte man self ‚immer‘ vorziehen.In der Behandungsroutine des OnClicks-Ereignis wird die Sender-Variable ausgewertet, um die auslösende Komponente des Klicks zu ermitteln:

procedure TForm1.Button2Click(Sender: TObject);
begin
  if Sender is TButton then
    TButton(Sender).Caption:='Neuer Titel';
end;

Die Button2Click-Prozedur muss noch in der Klassendeklaration von TForm1 aufgenommen werden:

private
  procedure Button2Click(Sender: TObject);

Mit einem Klick auf den dynamisch erstellten Button sollte sich der Titel des Buttons ändern.Eine weitere Lösung ist die Verwendung eines dynamischen Arrays. Dadurch wird der Zugriff auf die Komponenten später einfacherer.Im folgenden Beispiel wird eine zufällige Zahl von TEdit-Feldern erstellt und untereinander auf dem Formular platziert.Zunächst muss das Array als Feld-Variable in der Klassendeklaration des Formulars erstellt werden:

private
  EditArray: array of TEdit;

Der Quelltext zum Erstellen sieht folgendermaßen aus:

procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  SetLength(EditArray, Count);
  for i:=0 to 4 do
  begin
    EditArray[i] := TEdit.Create(Self);
    EditArray[i].Parent := Form1;
    EditArray[i].Left := 20;
    EditArray[i].Top := 20 + ((EditArray[i].Height + 10) * i);
  end;
end;

Über den Array-Index lassen sich die einzelnen Controls ansprechen.