AGB  ·  Datenschutz  ·  Impressum  







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

richtigen Constructor aufrufen?

Ein Thema von Gruber_Hans_12345 · begonnen am 12. Mai 2011 · letzter Beitrag vom 16. Mai 2011
Antwort Antwort
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#1

richtigen Constructor aufrufen?

  Alt 12. Mai 2011, 14:01
Delphi-Version: 5
ich hab so einen teil, mit dem ich Objekte erzeuge, wo ich vorher nicht weiss, um was es sich handelt ...

Delphi-Quellcode:
            
                Value := TClass(Args.Obj).Create
Das Problem ist, das mitr dadurch der constructor nicht aufgerufen wird

Delphi-Quellcode:
TMyList = class(TList)
public
  constructor Create;
end;

constructor TMyList.Create;
begin
  inherited;
  Add(nil);
end;
er geht mir wenn ich es so global mache nicht in den constructor rein, gibt es eine Möglichkeit das zu machen, ohne zu wissen, um was es sich handelt?

wenn ich
Delphi-Quellcode:
temp : TMyList;
temp := TMyList.Create;
schreibe, dann gehts natürlich genau so wie es soll ....
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von Deep-Sea
Deep-Sea

Registriert seit: 17. Jan 2007
907 Beiträge
 
Delphi XE2 Professional
 
#2

AW: richtigen Constructor aufrufen?

  Alt 12. Mai 2011, 14:05
Du musst den Konstruktor als override deklarieren?! constructor Create; override;
Chris
Die Erfahrung ist ein strenger Schulmeister: Sie prüft uns, bevor sie uns lehrt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: richtigen Constructor aufrufen?

  Alt 12. Mai 2011, 14:08
Du brauchst einen virtuellen Constructor oder du mußt den richtigen Klassen-Typen verwenden

Delphi-Quellcode:
TMyBaseObject = class(TList)
public
  constructor Create; virtual; abstract;
end;
TMyBaseClass = class of TMyBaseObject;

TMyList = class(TMyBaseObject)
public
  constructor Create; override;
end;

Value := TMyBaseClass(Args.Obj).Create;

Delphi-Quellcode:
TMyList = class(TMyBaseobject)
public
  constructor Create;
end;
TMyListClass = class of TMyList;

Value := TMyListClass(Args.Obj).Create;

Wie ist Args.Obj eigentlich definiert?
$2B or not $2B
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#4

AW: richtigen Constructor aufrufen?

  Alt 12. Mai 2011, 14:38
Du musst den Konstruktor als override deklarieren?! constructor Create; override;
geht leider nicht, da es sich um eine TList handelt, und da kann man den constructor nicht mit override deklarieren ....


Args.Obj ist eigetnlich ein TObject ... allerdings ist in einem Args.ObjTyp definiert das es sich nun um eine TClass handelt.

Das problem ist, ich habe keinen zugriff auf die Objekte die ich hier create will.
Es handelt sich um einen Interpreter in dem es möglich sein sollte Objekte zu kreieren .. diese sind alle mit {$M+} definiert, damit findet der Interpreter die, und eine Create kann ich auch aufrufen, nur dadurch das der constructor selbst nicht aufgerufen wird ... ist es natürlich etwas blöd ... es schein zu funktionieren -> aber halt etwas falsch

Ich vermute, das ich auf keinen grünen zweig kommen werde damit ...
Gruss Hans

2B or not 2B, that is FF
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

AW: richtigen Constructor aufrufen?

  Alt 12. Mai 2011, 14:46
Das was du vor hast ist nicht möglich. Du musst schon eine gemeinsame Basisklasse haben und der Constructor muss entsprechend in abgeleiteten Klassen überschrieben werden.
Oder was würdest du zum Beispiel machen wenn jemand TComponent oder einen Nachfahren erzeugen will? Da braucht der Constructor einen Parameter der natürlich auch übergeben werden muss. (nicht umsonst müssen Komponenten die auf dem Formular platziert werden und automatisch erzeugt werden von TComponent abgeleitet sein)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Ralf Kaiser
Ralf Kaiser

Registriert seit: 21. Mär 2005
Ort: Wuppertal
932 Beiträge
 
Delphi 10.3 Rio
 
#6

AW: richtigen Constructor aufrufen?

  Alt 12. Mai 2011, 15:13
Geht es nur darum, den Code im Constructor auszuführen, da diese wichtige Dinge initialisiert?

Wenn nicht, dann nicht weiter lesen...

Wenn doch dann verschiebe doch den Code vom Constructor in die Methode procedure AfterConstruction; override; Diese Methode wird immer nach dem Constructor ausgeführt und kann genausogut für Initialisierungen benutzt werden wenn eine Situation es nicht erlaubt den echten Constructor aufzufufen.

Ciao,
Ralf
Ralf Kaiser
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: richtigen Constructor aufrufen?

  Alt 12. Mai 2011, 16:10
Args.Obj ist eigetnlich ein TObject ... allerdings ist in einem Args.ObjTyp definiert das es sich nun um eine TClass handelt.
Du konvertierst Objektzeiger und Klassenzeiger untereinander hin und her?
Das sind Probleme ja schon vorprogrammiert.


Zitat:
Das problem ist, ich habe keinen zugriff auf die Objekte die ich hier create will.
Tja, dann hast du ein Problem,
denn du kannst nur Methoden aufrufen, welche du an dieser Stelle kennst.
TObjekt kennt nur sein Create und da dieses nicht als virtual/dynamic deklariert ist, kann dieses nicht überschrieben werden, womit abgeleitete klassen dort nicht rankommen.
TObjekt und damit auch TClass kennen natürlich das Create deiner TList nicht, wodurch man darüber Dieses auch nicht aufrufen kann.

Entweder du kämpfst dich über die RTTI zum richtigen Constuctor der entsprechenden Klasse durch
oder du mußt alle nötigen Klassen selber umwandeln.
Delphi-Quellcode:
if Args.Cls = TList then
  Value := TList.Create
else if Args.Cls = TEdit then
  Value := TEdit.Create
else
  raise Exception.Create('du hast ein Problem');
Wobei man bei sowas wie TEdit z.B. prüfen kann, ob Args.Cls als Vorfahren das TComponent besitzt und kann dann alle Nachfahren von TComponent über TComponent.Create(nil) erstellen, da TComponent einen virtuellen Constructor besitzt, welche alle Nachfahren überschrieben haben sollten.



Aber änder erstmal das obj: TObjekt in ein cls: TClass und laß das rumgercaste.

PS: Genau darum wurde in TComponent auch ein virtueller Constructor eingeführt, damit der DFM-Loader alle nötigen VCL-Komponenten laden kann, ohne deren abgeleitete Create kennen zu müssen.
Der DFM-Loader kennt das Create von TComponent und da dieses virtuell ist, kann jede abgeleitete Klasse dieses für sich überschreiben und schon kennt der DFM-Loader auch diese Klassen.
Bzw. er kennt die Adresse des virtuellen Create und nutzt alles, was darin verlinkt ist.
$2B or not $2B

Geändert von himitsu (12. Mai 2011 um 16:19 Uhr)
  Mit Zitat antworten Zitat
Gruber_Hans_12345

Registriert seit: 14. Aug 2004
1.439 Beiträge
 
Delphi 2007 Professional
 
#8

AW: richtigen Constructor aufrufen?

  Alt 16. Mai 2011, 15:47
Geht es nur darum, den Code im Constructor auszuführen, da diese wichtige Dinge initialisiert?

Wenn nicht, dann nicht weiter lesen...

Wenn doch dann verschiebe doch den Code vom Constructor in die Methode procedure AfterConstruction; override; Diese Methode wird immer nach dem Constructor ausgeführt und kann genausogut für Initialisierungen benutzt werden wenn eine Situation es nicht erlaubt den echten Constructor aufzufufen.

Ciao,
Ralf
... danke, damit kann ich schon mal 95% meiner fälle erschlagen
Gruss Hans

2B or not 2B, that is FF
  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 09:38 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