![]() |
Tform.Create überladen
Hallo zusammen,
ich weiß dieses Thema wurde schon x mal behandelt, aber mein delphi möchte einfach den Inherited befehl nich ausführen :( Zur Vorgeschichte: Ich habe eigentlich das gleiche wie in ![]() -> ich besitze eine Tform -> Möchte einen weiteren Create schreiben um verschiedene Designs anzupassen. hier mein Code:
Delphi-Quellcode:
So nun habe ich das ganze mit und ohne Reintroduce ausprobiert gleiches Ergebnis. Immer knallts beim
type
TModeType = (mt_default, mt_edit); TfrmCreateThema = class(TForm) ... private FModeType: TModeType; Fbearbeiter: String; procedure SetModeType(const Value: TModeType); procedure SetBearbeiter(const Value: String); public property ModeType : TModeType read FModeType write SetModeType; property Bearbeiter : String read FBearbeiter write SetBearbeiter; Constructor Create(AOwner: TComponent; Mode : TModetype;bearbeiter :string); reintroduce;overload; end; ... constructor TfrmCreateThema.Create(AOwner: TComponent; Mode : TModetype;bearbeiter :string); begin inherited create(AOwner); // <---- Hier knallts mit Zugriffsverletzung if mode <> mt_default then setModeType(Mode); if mode = mt_edit then begin setBearbeiter(bearbeiter); Height := 240; end; end;
Delphi-Quellcode:
mit zugriffsverletzung :/
inherited create(AOwner);
Was mach ich falsch ?! EDIT: als aOwner gebe ich beispielsweise die Mainform an. |
AW: Tform.Create überladen
Das kann ich nicht nachvollziehen. Ich nehme an, das Formular wird dynamisch erzeugt?
|
AW: Tform.Create überladen
ja per Button mit
Delphi-Quellcode:
oder
var
frmCreateThema :TfrmCreateThema; begin frmCreateThema.Create(self,mt_edit,DBEdit_Bearbeiter.Text);
Delphi-Quellcode:
frmCreateThema.Create(frmMain,mt_edit,DBEdit_Bearbeiter.Text);
|
AW: Tform.Create überladen
Delphi-Quellcode:
frmCreateThema := TfrmCreateThema.Create(self,mt_edit,DBEdit_Bearbeiter.Text);
|
AW: Tform.Create überladen
ich depp xD :wall:
muss natürlich so lauten
Delphi-Quellcode:
Danke dass du nichts finden konntest ;D;D
frmCreateThema := TfrmCreateThema.Create(self,mt_edit,DBEdit_Bearbeiter.Text);
edit: da war er schneller :) |
AW: Tform.Create überladen
Zitat:
|
AW: Tform.Create überladen
Bei einem Formular ist der Konstruktor virtuell.
Deshalb würde ich stark davon abraten weitere Konstruktoren einzuführen. Folgender Code wäre nämlich nicht in der Lage, deinen Konstruktor aufrurufen, einfach weil er einfach nicht bekannt ist:
Delphi-Quellcode:
Application.CreateForm(TfrmCreateThema, frmCreateThema);
Man kann einen weiteren Konstruktor bei einem Formular einführen, aber man sollte es nicht tun. Man kann hier Parallelen zu ![]() Es gibt im Prinzip 3 Wege um einem Objekt Informationen mitzugeben:
|
AW: Tform.Create überladen
Es spricht eigentlich nichts dagegen einen neuen Constructor einzuführen bei einer Ableitung von TComponent (trifft auch auf alle anderen Klassen mit virtuellem Constructor zu). Allerdings sollte man dann nicht reintroduce verwenden. Stattdessen sollte man den alten Constructor auch überschreiben und in diesem den neuen Constructor mit Standardparamtern aufrufen um sicherzustellen das der Nachfahre weiterhin wie gewohnt genutzt werden kann.
|
AW: Tform.Create überladen
Ich hatte es so verstanden, dass gerade der Aufruf des geerbten Konstruktors nicht möglich sein soll. Über Sinn und Unsinn möchte ich hier nicht diskutieren.
|
AW: Tform.Create überladen
Ja, ich vermute der andere constructor sollte nicht verwendet werden weil sonst (wenn man diesen nicht auch überschreibt) etwas uninitialisiert bleibt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:55 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-2025 by Thomas Breitkreuz