Hallo zusammen,
ich habe als Oberklasse ein Formular TBaseWizard mit der Höhe (Height) als Variable.
Als Unterklasse steht TfrmWizard = class(TBaseWizard), dessen Height eben kleiner als die von
WizForm := TfrmWizard.Create sein soll.
Wenn ich in TfrmWizard.Create folgendes durchführe, bleibt die Höhe von BaseWizard unverändert:
Delphi-Quellcode:
BaseWizard := TBaseWizard.Create(AOwner, InputFinished);
inherited Create(AOwner, InputFinished);
BaseWizard.Height := 2200;
In TBaseWizard.Create gilt: Height := 650;
Du hast noch nicht so ganz verstanden wie Vererbung funktioniert. Dein TfrmWizard erbt alles von TBaseWizard, nach der Zeile
inherited Create(AOwner, InputFinished);
hat Height den Wert, den der Constructor von TBaseWizard setzt (oder aus der Form-Resource lädt). Um die Height zu ändern verwendest Du einfach
Height := 2200;
Es gibt in deinem Beispiel keine separate Instanz von TBaseWizard als Teil von TfrmWizard, was Du da erzeugst ist ein komplett separates Objekt der Klasse TBaseWizard die absolut nichts mit der Instanz von TfrmWizard zu tun hat in deren Constructor Du gerade bist. Jede Instanz von TfrmWizard ist auch eine Instanz von TBaseWizard und enthält alles, was in TBaseWizard deklariert ist.
Bei der Vererbung von Designer-Objekten (Forms, Frames, Datamodules) gibt es übrigens noch ein Detail zu beachten, das bei anderen Klassen nicht relevant ist:
Um eine von einer Designer-Klasse abgeleitete Klasse zu erzeugen muss man über das Menu File -> New -> Other... den Repository-Dialog aufrufen, dort auf die Seite "inheritable items" gehen und die gewünschte Basisklasse dort auswählen. Die
IDE erzeugt dann eine Kode-
Unit und das zugehörige
DFM-File für die abgeleitete Klasse.
Wenn man die Ableitung im Kode macht fehlt das
DFM-File, oder, wenn man die Basisklasse einer existierenden Klasse ändert, ist das
DFM-File nicht korrekt aufgebaut. Für eine direkt von TForm, TFrame oder TDatamodule abgeleitete Klasse beginnt das
DFM-File mit dem Keyword "object", für per visual form inheritance erzeugt Klassen (wie vorstehen beschrieben) aber mit "inherited". Das informiert den Kode, der eine Instanz aus der
DFM-Resource initialisiert, darüber, dass er zuerst die Resource der Basisklasse laden muß und danach dann die der abgeleiteten Klasse. Dann funktioniert auch das Ändern von Eigenschaften der Basisklasse in der abgeleiteten Klasse im Designer.