AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Tform.Create überladen

Ein Thema von H3llsing · begonnen am 27. Jan 2011 · letzter Beitrag vom 27. Jan 2011
Antwort Antwort
H3llsing

Registriert seit: 12. Nov 2008
96 Beiträge
 
Delphi 2010 Enterprise
 
#1

Tform.Create überladen

  Alt 27. Jan 2011, 13:54
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
inherited create(AOwner); mit zugriffsverletzung :/


Was mach ich falsch ?!

EDIT:
als aOwner gebe ich beispielsweise die Mainform an.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Tform.Create überladen

  Alt 27. Jan 2011, 14:10
Das kann ich nicht nachvollziehen. Ich nehme an, das Formular wird dynamisch erzeugt?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
H3llsing

Registriert seit: 12. Nov 2008
96 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: Tform.Create überladen

  Alt 27. Jan 2011, 14:15
ja per Button mit

Delphi-Quellcode:
var
  frmCreateThema :TfrmCreateThema;
begin
  frmCreateThema.Create(self,mt_edit,DBEdit_Bearbeiter.Text);
oder
frmCreateThema.Create(frmMain,mt_edit,DBEdit_Bearbeiter.Text);
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Tform.Create überladen

  Alt 27. Jan 2011, 14:16
frmCreateThema := TfrmCreateThema.Create(self,mt_edit,DBEdit_Bearbeiter.Text);
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
H3llsing

Registriert seit: 12. Nov 2008
96 Beiträge
 
Delphi 2010 Enterprise
 
#5

AW: Tform.Create überladen

  Alt 27. Jan 2011, 14:19
ich depp xD

muss natürlich so lauten

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

edit:
da war er schneller
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Tform.Create überladen

  Alt 27. Jan 2011, 14:28
edit:
da war er schneller
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#7

AW: Tform.Create überladen

  Alt 27. Jan 2011, 18:05
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:
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..
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

AW: Tform.Create überladen

  Alt 27. Jan 2011, 18:08
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Tform.Create überladen

  Alt 27. Jan 2011, 18:23
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (27. Jan 2011 um 18:28 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#10

AW: Tform.Create überladen

  Alt 27. Jan 2011, 18:26
Ja, ich vermute der andere constructor sollte nicht verwendet werden weil sonst (wenn man diesen nicht auch überschreibt) etwas uninitialisiert bleibt.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Antwort Antwort


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 14:21 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