Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Klassen mit virtuellem Constructor (https://www.delphipraxis.net/144412-klassen-mit-virtuellem-constructor.html)

himitsu 7. Dez 2009 12:45


Klassen mit virtuellem Constructor
 
Moin,

TComponent besitzt ja einen virtuellen Constructor ...

gibt es da noch andere delphieigene "Basistypen", welche über sowas verfügen?


Es geht um die Definition für eine Deserialisierung meines himXML,
also speziell darum, welche Classen man dafür registrieren kann.

Das Problem ist ja, daß dieses nur mit Klassen geht, welche über sowas verfügen, da man ja nur die Klassen registrieren kann/müßte und ohne einen solchen Constructor lassen sich "normale" Klassen nicht automatisch erstellen (.Create).
Delphi-Quellcode:
var registriert: array of TComponent;

objekt := registriert[i].Create;

Alaitoc 7. Dez 2009 13:05

Re: Klassen mit virtuellem Constructor
 
Gib einfach mal in Delphi 7 in der Delphi-Hilfe unter dem Tabsheet Suchen "constructor virtual" ein.
Dort werden mir dann zumindest alle damit aufgelistet :)

Abtippen wäre mir grad zuviel Aufwand :wink:

MfG Alaitoc

himitsu 7. Dez 2009 13:39

Re: Klassen mit virtuellem Constructor
 
Joar, die über 500 Suchergebnisse kenn ich, allerdings sucht der hier bei "constructor virtual" nach "constructor OR virtual" und das bringt mir recht wenig.

Alaitoc 7. Dez 2009 15:29

Re: Klassen mit virtuellem Constructor
 
500 Suchergebnisse? :shock:
Also bei mir waren das nur ein paar...

Hab ich auf irgendwas draufgeklickt :gruebel:

Also eigentlich sollte das darüber gehen, ging bei mir zumindest...nur leider hab ich hier zuhause kein Delphi 7 drauf.

MfG Alaitoc

himitsu 7. Dez 2009 16:12

Re: Klassen mit virtuellem Constructor
 
Liste der Anhänge anzeigen (Anzahl: 1)
Nja, es sind mehr, aber bei 500 wird aufgehört mit auflisten.
Wie gesagt, es wird leider ODER verknüpft und demnach werden alle Beiträge gefunden, wo eines der beiden Wörter drinsteht ... als quasi jede Komponente, welche es gibt.

Im Grunde haben auch alle VCL-Komponenten einen viruellen Konstructor, da sie natürlich von TComponent abstammen.
Und ich würde gern wissen, ob noch antere "fundamentale" Klassen soeinen haben, so wie eben TComponent.

[add]
Hab mich schon etwas durch die Deklarationen gekämpft und bis jetzt diese gefunden:
Zitat:

Classes.TBasicActionLink
Classes.TComponent (im Grunde alle VCL-Komponenten)
Classes.TCollectionItem
ComCtrls.TListItem
ComCtrls.TConversion
ComCtrls.TTreeNode
DockTabSet.TTabDockPanel
ExtCtrls.TEditButton
Graphics.TGraphic
OleAuto.TAutoClass
die Fetten werde wohl für eine Deserialisierung und ihre automatische Erzeugung vorsehn
und die grauen dürften für sowas eh nicht in Frage kommen

Alaitoc 7. Dez 2009 20:57

Re: Klassen mit virtuellem Constructor
 
Also ich schau morgen einfach nochmal nach was ich alles da hatte, wundert mich irgendwie
das es soviele Einträge sind... werde sie dann halt mal abtippen :-D

uligerhardt 7. Dez 2009 22:13

Re: Klassen mit virtuellem Constructor
 
Zitat:

Zitat von himitsu
Joar, die über 500 Suchergebnisse kenn ich, allerdings sucht der hier bei "constructor virtual" nach "constructor OR virtual" und das bringt mir recht wenig.

Wie wäre es mit "Suchen in Dateien" (oder GExperts-Grep) mit regulären Ausdrücken nach "constructor.*virtual" in den VCL-Sourcen?

himitsu 7. Dez 2009 22:23

Re: Klassen mit virtuellem Constructor
 
bei der alten OH konnte man noch selber bestimmen, wie gesucht werden so
- Wörter UND oder ODER verknüpft
- Themen ohne Überschrift beachten
- usw.
das geht jetzt nicht mehr

vorallem daß die Suche mehrere Wörter einfach per ODER verknüpft :wall:

@uligerhardt
hatte ich versucht, aber irgendwie mochte er meinen regulären Ausdruck nicht und fand einfach nichts :cry:
drumm hatte ich dann nach "virtual" als ganzes Wort gesucht und mich durch viele Units geklickt :?

ich baue aber grade meine Seralisierung nochmals um und gestalte es so, daß man dann auch noch solche Basisklassen nachrüsten kann :-D
(ich hoffe, daß es dann auch so läuft, wie es geplant ist)

uligerhardt 7. Dez 2009 23:34

Re: Klassen mit virtuellem Constructor
 
Zitat:

Zitat von uligerhardt
Wie wäre es mit "Suchen in Dateien" (oder GExperts-Grep) mit regulären Ausdrücken nach "constructor.*virtual" in den VCL-Sourcen?

Hab's mal mit Grep probiert, ohne Einschränkung auf ganzes Wort. Ergebnis:
Code:
$(BDS)\Source\Win32\VCL\CaptionedDockTree.pas
     57   $(BDS) Create(DockCaptionOrientation: TDockCaptionOrientation); virtual;

$(BDS)\Source\Win32\VCL\Controls.pas
    439   $(BDS) Create(AControl: TControl); virtual;
    673   $(BDS) Create(Control: TControl); virtual;
    697   $(BDS) Create(Control: TControl); virtual;
   1842   $(BDS) Create(DockSite: TWinControl); virtual;

$(BDS)\Source\Win32\VCL\Forms.pas
    637   $(BDS) CreateNew(AOwner: TComponent; Dummy: Integer = 0); virtual;

$(BDS)\Source\Win32\VCL\Graphics.pas
    704   $(BDS) Create; virtual;

$(BDS)\Source\Win32\VCL\OleAuto.pas
    100   $(BDS) Create; virtual;

$(BDS)\Source\Win32\VCL\ShadowWnd.pas
     51   $(BDS) CreateShadow(AOwner: TComponent; ControlSide: TControlSide); virtual;

$(BDS)\Source\Win32\VCL\Themes.pas
    389   $(BDS) Create; virtual;

Stevie 8. Dez 2009 06:31

Re: Klassen mit virtuellem Constructor
 
Zitat:

Zitat von himitsu
Das Problem ist ja, daß dieses nur mit Klassen geht, welche über sowas verfügen, da man ja nur die Klassen registrieren kann/müßte und ohne einen solchen Constructor lassen sich "normale" Klassen nicht automatisch erstellen (.Create).
Delphi-Quellcode:
var registriert: array of TComponent;

objekt := registriert[i].Create;

Das ist so aber nicht ganz korrekt, wenn überhaupt, musst du dir Referenzen auf TComponentClass speichern, und darauf ein Create aufrufen. Und das geht auch, wenn der Konstruktor der Basis-Klasse nicht virtual wäre. Das Problem wird dann nur sein, dass ein spezieller Konstruktor beim Erstellen eines Objekts nicht aufgerufen wird. Das kann aber auch passieren, wenn irgendein Spaßvogel von TComponent ableitet und mal fix ein reintroduce statt einem override hinter seinen Konstuktor schreibt. Ok, isser selber schuld dann, aber ich wollte nur die Möglichkeit aufzeigen.

Alaitoc 8. Dez 2009 07:23

Re: Klassen mit virtuellem Constructor
 
So das kommt zumindest bei mir bei der Suche raus:
  • ERemotableException
  • TAbstractContentParser
  • TActionListItem
  • TAggregate
  • TBaseArray
  • TBaseDragControlObject
  • TBasePropertyEditor
  • TBasicActionLink
  • TCollectionItem
  • TComponent
  • TCustomActionDockBar
  • TCustomActionMainMenuBar
  • TCustomActionMenuBar
  • TCustomActionPopupMenu
  • TCustomActionToolBar
  • TDirectory
  • TDocktree
  • TFieldValuesAdapter
  • TFileIconProvider
  • TInvokableClass
  • TPalette
  • TPreviewThread
  • TPropertyEditor
  • TRemotable
  • TSiteModuleHelper
  • TSizePageModuleHelper
  • TSizeConstraints
  • TSmallIntArray
  • TStandardMenuPopup
  • TStyle
  • TTab
  • TWidgetPalette
  • TWSDLItems

Vielleicht hilfts ja :wink:

himitsu 8. Dez 2009 07:42

Re: Klassen mit virtuellem Constructor
 
Zitat:

Zitat von Stevie
Das kann aber auch passieren, wenn irgendein Spaßvogel von TComponent ableitet und mal fix ein reintroduce statt einem override hinter seinen Konstuktor schreibt.

Schlimm ist, daß die VCL selbt schon sowas hab :wall:
da gibt es einige Klassen, welche direkt von TComponent abgeleitet sind und dann nochmal 'nen eigenen virtuellen Constructor einführen, anstatt den des Vorfahren zu nutzen. :shock:

@Alaitoc: TDirectory und TSmallIntArray klingen schonmal gut
dort können ganz gut Daten drinnenstecken, welche man bestimmt gern mal speichern möchte :-D

gut, da man demnächst auch Klassen nachrüsten kann, wäre es nicht so schlimm, aber ich würde auch gern schon einige "wichtige" Klassen direkt bei der (De)Serialisierung unterstüzen, ohne daß man da zusätzlich noch viel machen muß.

Stevie 8. Dez 2009 08:24

Re: Klassen mit virtuellem Constructor
 
Mich interessiert dein Ansatz, weil ich mich derzeit auch etwas mit XML Serialisierung in Delphi beschäftige (Delphi 2010 und die neue RTTI ist eine wahre Freude).
Versuchst du es so wie .Net zu machen, dass die Deserialisierung das Objekt erzeugt?

himitsu 8. Dez 2009 08:34

Re: Klassen mit virtuellem Constructor
 
Zitat:

Zitat von Stevie
Mich interessiert dein Ansatz, weil ich mich derzeit auch etwas mit XML Serialisierung in Delphi beschäftige (Delphi 2010 und die neue RTTI ist eine wahre Freude).
Versuchst du es so wie .Net zu machen, dass die Deserialisierung das Objekt erzeugt?

Die 2010 RTTI kann ich mir erst später ansehn (mein Delphi ist immernoch nicht da :cry: )
und wie es .Net macht weiß ich garnicht :oops:

Fertig ist jetzt noch nicht viel, da ich es ja derzeit komplett umbau.
(die Record- und Variantserialisierungen sind aber schon/wieder fertig)

Standardmäßig handhabe ich es dann so, daß Klassen erstmal mal NUR in TCollections und .Components von TComponent automatisch erzeugt werden und z.B. Objekte in TObjektList, TStringList und Co. werden nur nach Angabe eines "Parameters" automatisch erzeugt, ansonsten wird die Liste so versucht zu laden, mit den Objekten, welche dort grade drinnen sind (also nur ihre Eigenschaften).

Wenn der "Parameter" angegeben ist, dann werden die Objekte von deratigen Listen/Properties notfalls innerhalb der Serialisierung, bzw. über einen Callback (vom entsprechenden "Programmierer") neu erzeugt ... praktisch so ähnlich, wie es der Form-Loader der VCL macht.


Speziell für die Record-Serialisierng erhoffe ich mir ja von der neuen RTTI viel.
Aktuell muß man ja den Aufbau selber angeben. http://www.delphipraxis.net/internal...105533#1105533 , bzw. http://www.delphipraxis.net/internal...105869#1105869


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 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