AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Einer Variablen einer Oberklasse einen Wert zuweisen

Einer Variablen einer Oberklasse einen Wert zuweisen

Offene Frage von "peterbelow"
Ein Thema von enigma · begonnen am 17. Jan 2022 · letzter Beitrag vom 18. Jan 2022
Antwort Antwort
enigma

Registriert seit: 15. Jun 2008
28 Beiträge
 
#1

Einer Variablen einer Oberklasse einen Wert zuweisen

  Alt 17. Jan 2022, 15:45
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;

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.
  Mit Zitat antworten Zitat
Blup

Registriert seit: 7. Aug 2008
Ort: Brandenburg
1.381 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Einer Variablen einer Oberklasse einen Wert zuweisen

  Alt 17. Jan 2022, 15:50
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.
  Mit Zitat antworten Zitat
Der schöne Günther
Online

Registriert seit: 6. Mär 2013
5.871 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Einer Variablen einer Oberklasse einen Wert zuweisen

  Alt 17. Jan 2022, 16:13
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 inherited Create(..) genau macht?
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.268 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Einer Variablen einer Oberklasse einen Wert zuweisen

  Alt 17. Jan 2022, 16:32
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.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
peterbelow

Registriert seit: 12. Jan 2019
Ort: Hessen
458 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
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf