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.