Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Tform.Create überladen (https://www.delphipraxis.net/157858-tform-create-ueberladen.html)

H3llsing 27. Jan 2011 13:54

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 diesem Thread vor.
-> ich besitze eine Tform
-> Möchte einen weiteren Create schreiben um verschiedene Designs anzupassen.

hier mein Code:
Delphi-Quellcode:
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;
So nun habe ich das ganze mit und ohne Reintroduce ausprobiert gleiches Ergebnis. Immer knallts beim
Delphi-Quellcode:
inherited create(AOwner);
mit zugriffsverletzung :/


Was mach ich falsch ?!

EDIT:
als aOwner gebe ich beispielsweise die Mainform an.

DeddyH 27. Jan 2011 14:10

AW: Tform.Create überladen
 
Das kann ich nicht nachvollziehen. Ich nehme an, das Formular wird dynamisch erzeugt?

H3llsing 27. Jan 2011 14:15

AW: Tform.Create überladen
 
ja per Button mit

Delphi-Quellcode:
var
  frmCreateThema :TfrmCreateThema;
begin
  frmCreateThema.Create(self,mt_edit,DBEdit_Bearbeiter.Text);
oder
Delphi-Quellcode:
frmCreateThema.Create(frmMain,mt_edit,DBEdit_Bearbeiter.Text);

DeddyH 27. Jan 2011 14:16

AW: Tform.Create überladen
 
Delphi-Quellcode:
frmCreateThema := TfrmCreateThema.Create(self,mt_edit,DBEdit_Bearbeiter.Text);

H3llsing 27. Jan 2011 14:19

AW: Tform.Create überladen
 
ich depp xD :wall:

muss natürlich so lauten

Delphi-Quellcode:
  frmCreateThema := TfrmCreateThema.Create(self,mt_edit,DBEdit_Bearbeiter.Text);
Danke dass du nichts finden konntest ;D;D

edit:
da war er schneller :)

DeddyH 27. Jan 2011 14:28

AW: Tform.Create überladen
 
Zitat:

Zitat von H3llsing (Beitrag 1077651)
edit:
da war er schneller :)

:zwinker:

shmia 27. Jan 2011 18:05

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 Java Beans ziehen. Dort gibt es ebenfalls nur einen öffentlichen, virtuellen Konstruktor.


Es gibt im Prinzip 3 Wege um einem Objekt Informationen mitzugeben:
  1. Konstruktor
  2. über ein Property
  3. Methodenaufruf
Die Datenübergabe über Properties ist der Standardweg wenn es einen virtuellen Konstruktor gibt..

SirThornberry 27. Jan 2011 18:08

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.

DeddyH 27. Jan 2011 18:23

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.

SirThornberry 27. Jan 2011 18:26

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 03:57 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz