![]() |
Einer Variablen einer Oberklasse einen Wert zuweisen
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:
In TBaseWizard.Create gilt: Height := 650;
BaseWizard := TBaseWizard.Create(AOwner, InputFinished);
inherited Create(AOwner, InputFinished); BaseWizard.Height := 2200; Ich nehme an, der Grund ist der: BaseWizard ändert die Höhe nicht mehr, da es vor TfrmWizard.Create erzeugt wurde. Ich freue mich über jeden Hinweis, ob meine Vermutung zutrifft, und ob es einen Weg gibt, die Höhe der Oberklasse in der Unterklasse zu ändern. |
AW: Einer Variablen einer Oberklasse einen Wert zuweisen
Was bitte verstehst du unter einer Oberklasse und Unterklasse?
In welcher Beziehung stehen die zueinander? Wo ist die Deklaration? Ich kenne nur Basisklasse und abgeleite Klassen. |
AW: Einer Variablen einer Oberklasse einen Wert zuweisen
Entweder fehlt in der Frage noch irgend etwas ganz grundsätzliches, oder ich habe Grundlagen von objektorientierter Programmierung noch nicht verstanden.
Was ist BaseWizard? Eine globale Variable? Wenn ja, dann ist das doch eine ganz andere Instanz. Oder ist das die Variable, die das Objekt später referenzieren soll? Hast du verstanden was
Delphi-Quellcode:
genau macht?
inherited Create(..)
|
AW: Einer Variablen einer Oberklasse einen Wert zuweisen
Deine Fragestellung ist etwas ungenau.
Grundsätzlich hast Du wohl zwei Möglichkeiten: Du kannst Dein Control mit Align irgendwie automatisch ausrichten lassen oder auf eine Größenänderung Deines Formulars in MyForm.OnResize (oder so ähnlich) reagieren und Dein Control neu anordnen. Ohne einen dieser beiden Wege merken Controls nicht, wenn sich die Formulargröße ändert. |
AW: Einer Variablen einer Oberklasse einen Wert zuweisen
Zitat:
Delphi-Quellcode:
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
inherited Create(AOwner, InputFinished);
Delphi-Quellcode:
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.
Height := 2200;
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. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz