Zum Virtuellen Konstruktor
Also dass mein eigens entwickelter Konstruktor nicht aufgerufen wird, halte ich fuer unwahrscheinlich. Ich rufe ihn ja selbst explizit auf.
Jede Komponente kann aber auch von der
VCL erzeugt werden.
Dieser Weg wird in der Praxis weit häufiger benützt als das explizite Aufrufen des Konstruktors.
Jedes Label, Editfeld, Menü,... wird ja normalerweise unter Zuhilfenahme der
DFM-Datei dynamisch zur Laufzeit erzeugt.
Genau aus diesem Grund wurde ja für Komponenten ein virtueller (Standard-)Konstruktor eingeführt.
Wenn deine Komponente eine weiteren Konstruktor hat, dann wird dieser von der
VCL ignoriert.
Daraus kann man nur die Schlussfolgerung ziehen, dass es einfacher und sicherer ist Parameter nicht über den Konstruktor sondern über Properties dem Objekt bekannt zu machen.
Delphi-Quellcode:
// Negativbeispiel
TDoppeltGemoppelt = class(TBasisComponent)
private
FAnzahl : integer;
public
// virtueller Standard Konstruktor
constructor Create(AOwner:TComnponent); override;
// nicht-standard Konstruktor
constructor Create(anzahl:integer);
published
property Anzahl:integer read FAnzahl write FAnzahl default 100;
end;
constructor TDoppeltGemoppelt.Create(AOwner:TComnponent); override;
begin
inherited; // vererbten Konstruktor aufrufen
FAnzahl := 100; // Defaultwert für property Anzahl setzen
end;
constructor TDoppeltGemoppelt.Create(anzahl:integer);
begin
// wir müssen auf jeden Fall den Standard Konstruktor aufrufen
// wenn das vergessen wird, gibt es Probleme
Create(nil {Owner ist hier unbekannt});
FAnzahl := anzahl;
end;
.....
var
a, b : TDoppelGemoppelt;
begin
a := TDoppelGemoppelt.Create(42);
b:= TDoppelGemoppelt.Create(nil);
b.Anzahl := 42;
Um das Objekt "b" zu initialisieren benötigt man eine Zeile mehr als für Objekt "a".
Wenn aber der eigene Konstruktor so wenig Zusatznutzen bringt ist es besser ihn ganz weg zu lassen und immer nur mit dem Standard Konstruktor und Properties zu arbeiten.
Komponenten in Delphi sind in der Hinsicht genau gleich wie
JavaBeans.