Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zu unbekanntem Klassenderivat casten? (https://www.delphipraxis.net/130762-zu-unbekanntem-klassenderivat-casten.html)

Blup 16. Mär 2009 07:12

Re: Zu unbekanntem Klassenderivat casten?
 
Das Object Kopie ist zwar von der selben Klasse wie das Orginal, das Feld Test ist aber leer, bis der Wert 'B' zugewiesen wird.
Bei einer "echten Kopie" sollten aber alle Werte vom Orginal übernommen werden. Das ist die Hauptaufgabe von Clone bzw. in meinem Beispiel Assign.

stoxx 17. Mär 2009 02:04

Re: Zu unbekanntem Klassenderivat casten?
 
Zitat:

Jetzt weiß ich auch endlich, was virtual bedeutet:
na das ist doch scheen :wink:

wenn Du jetzt noch Deine Klassen einzig und allein anhand eines normalen Strings des Klassennamen createn willst, dann mach Dir einfach ne kleine Liste mit einem Record String und der Metaklassenvariable, wenn Du dann nach dem Klassennamen suchst, kannst Du Dir die Metaklassenvariable zurückliefern .. jede Klasse muss allerdings vorher in Deiner (zentralen) Liste registriert werden (am besten wohl im initialization der betreffenden Unit .. oder nimm die in Delphi schon vorhandenen Boardmittel, das würde gehen, wenn Du nicht von TObject, sondern von TPersistent ableitest.
Für diesen Fall schau Dir mal die Funktion GetClass in der Unit Classes an ...

letztendlich kann dann so ein simpler Aufruf entstehen, und das Object wird dann automatisch mit der richtigen Klasse created ..

Delphi-Quellcode:
TBasis = class(TObject)

public
  constructor create; virtual;
  class function CreateInstance(aClassName : string) : TBasis;

end;

//==============================================================================

class function TBasis.CreateInstance(aClassName: string): TBasis;
var
  aBaseClass : TBaseClassType;
begin

   aBaseClass := ....SearchClassTypeName(aClassName); // oder GetClass

   if not Assigned(aBaseClass) then begin
      Showmessage('Nicht registrierte Klasse: '+ aClassName, 'TBasis.CreateInstance');
      aBaseClass:= TBasis;
    end;

   result := aBaseClass.create;
end;

Aufruf dann mit:



Delphi-Quellcode:
var
   aBaseObj : TBasis;
begin

  aBaseObj := TBasis.CreateInstance('TAbleitungA');
  Showmessage(aBaseObj.classname);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:14 Uhr.
Seite 2 von 2     12   

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