Komponenten zur Laufzeit erzeugen |
|
| System | Win9x, WinNT, Win2000, WinXP, Vista, Win7 |
|---|---|
| Ab Delphi-Version | Delphi 1 |
| Letzte Änderung | 28.09.2010 |
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.
- Überblick
- Komponenten vom Formular entfernen
- Eigenschaften von Komponenten zur Laufzeit ändern
- Zugriffsmethoden auf Komponenten
- Komponente beim Fokussieren farblich hervorheben
- TWinControl beim Mauszeiger ermitteln
- Steuerelement am Neuzeichnen hindern
- Zugriff auf Komponenten über ihre Namen
- Komponenten speichern/laden
- Einer Komponente den Fokus geben