Dynamisches Erstellen von Komponenten (zur Laufzeit)

In den meisten Fällen müssen Sie beim Programmieren in Delphi keine Komponente dynamisch erstellen. Wenn Sie eine Komponente in einem Formular ablegen, wird die Komponentenerstellung von Delphi beim Erstellen des Formulars automatisch ausgeführt. Dieser Artikel beschreibt die richtige Methode zum programmgesteuerten Erstellen von Komponenten zur Laufzeit.

Dynamische Komponentenerstellung

Es gibt zwei Möglichkeiten, Komponenten dynamisch zu erstellen. Eine Möglichkeit besteht darin, ein Formular (oder eine andere TComponent) zum Eigentümer der neuen Komponente zu machen. Dies ist eine gängige Praxis beim Erstellen von Verbundkomponenten, bei denen ein visueller Container die Unterkomponenten erstellt und besitzt. Dadurch wird sichergestellt, dass die neu erstellte Komponente zerstört wird, wenn die besitzende Komponente zerstört wird.

Um eine Instanz (Objekt) einer Klasse zu erstellen, rufen Sie die Methode "Create" auf. Der Create-Konstruktor ist eine Klassenmethode, im Gegensatz zu praktisch allen anderen Methoden, die in der Delphi-Programmierung verwendet werden. Hierbei handelt es sich um Objektmethoden.

Beispielsweise deklariert die TComponent den Create-Konstruktor wie folgt:

Konstruktor Create (AOwner: TComponent); virtuell;

Dynamische Erstellung mit Inhabern
Hier ist ein Beispiel für dynamisches Erstellen Selbst ist eine TComponent oder ein TComponent-Nachkomme (z. B. eine Instanz einer TForm):

mit TTimer.Create (Self) machen
Start
Intervall: = 1000;
Aktiviert: = Falsch;
OnTimer: = MyTimerEventHandler;
Ende;

Dynamische Erstellung mit einem expliziten Aufruf zur Befreiung
Die zweite Möglichkeit, eine Komponente zu erstellen, besteht in der Verwendung Null als der Besitzer. Beachten Sie, dass Sie in diesem Fall das von Ihnen erstellte Objekt auch explizit freigeben müssen, sobald Sie es nicht mehr benötigen (oder einen Speicherverlust verursachen). Hier ist ein Beispiel für die Verwendung von nil als Eigentümer:

mit TTable.Create (nil) machen
Versuchen
DataBaseName: = 'MyAlias';
TableName: = 'MyTable';
Öffnen;
Bearbeiten;
FieldByName ('Busy'). AsBoolean: = True;
Post;
schließlich
Kostenlos;
Ende;

Dynamische Erstellung und Objektreferenzen
Es ist möglich, die beiden vorherigen Beispiele zu erweitern, indem das Ergebnis des Aufrufs Create einer Variablen zugewiesen wird, die lokal für die Methode ist oder zur Klasse gehört. Dies ist häufig wünschenswert, wenn Referenzen auf die Komponente später verwendet werden müssen oder wenn Probleme mit dem Gültigkeitsbereich, die möglicherweise durch "With" -Blöcke verursacht werden, vermieden werden müssen. Hier ist der TTimer-Erstellungscode von oben, wobei eine Feldvariable als Referenz auf das instanziierte TTimer-Objekt verwendet wird:

FTimer: = TTimer.Create (Self);
mit FTimer machen
Start
Intervall: = 1000;
Aktiviert: = Falsch;
OnTimer: = MyInternalTimerEventHandler;
Ende;

In diesem Beispiel ist "FTimer" eine private Feldvariable des Formulars oder des visuellen Containers (oder was auch immer "Self" ist). Wenn Sie mit Methoden dieser Klasse auf die Variable FTimer zugreifen, sollten Sie vor der Verwendung überprüfen, ob die Referenz gültig ist. Dies geschieht mit der Funktion Assigned von Delphi:

wenn zugewiesen (FTimer) dann FTimer.Enabled: = True;

Dynamische Erstellung und Objektreferenzen ohne Eigentümer
Eine Variante besteht darin, die Komponente ohne Eigentümer zu erstellen und die Referenz für eine spätere Zerstörung beizubehalten. Der Konstruktionscode für den TTimer würde folgendermaßen aussehen:

FTimer: = TTimer.Create (nil);
mit FTimer machen
Start

Ende;

Und der Zerstörungscode (vermutlich im Destruktor des Formulars) würde ungefähr so ​​aussehen: