Einzelnen Beitrag anzeigen

peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
672 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Einer Variablen einer Oberklasse einen Wert zuweisen

  Alt 18. Jan 2022, 11:51
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.
Peter Below
  Mit Zitat antworten Zitat