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 Objekte aus Textdatei erstellen (https://www.delphipraxis.net/175361-objekte-aus-textdatei-erstellen.html)

stahli 18. Jun 2013 20:33

AW: Objekte aus Textdatei erstellen
 
So, jetzt mit mehr Zeit etwas genauer.

Du kannst Klassen folgendermaßen registrieren (am Beispiel der TodPanel):

Delphi-Quellcode:
// Klassenunit
unit odPanel;

interface

type

  TodPanel = class(TPanel)
  ...
  end;

  TodPanelClass = class of TodPanel;

procedure Register; // wenn Du das Control für die IDE registrieren willst

implementation

procedure Register;
begin
  RegisterComponents('odControls', [TodPanel]);
end;

initialization

RegisterClasses([TodPanel]);

end.
Und dann zur Laufzeit:

Delphi-Quellcode:
FindClass('TodPanel');
odPanel := TodPanelClass(GetClass('TodPanel')).Create(Self);
In dieser Richtung solltest Du mal schauen.
Ach so, es hängt ggf. auch von Deiner Delphiversion ab.

Acuaplano 18. Jun 2013 21:11

AW: Objekte aus Textdatei erstellen
 
Ich nehme mal an, dass ich für meine Klassen stattdessen "RegisterClasses" nehmen soll.
Aber das Problem ist jetzt dabei, dass TImageSprite keine "persistent class" ist und ich die deshalb nicht registrieren kann. Ich versteh auch im Moment nicht wo jetzt der Sinn dahinter ist. Gäbe es denn ne andere Möglichkeit, als die Klassenvererbung zu ändern? Falls nicht, wovon müsst ich theoretisch TImageSprite ableiten?

jaenicke 18. Jun 2013 21:29

AW: Objekte aus Textdatei erstellen
 
Theoretisch von TPersistant, aber ich würde die Registrierung einfach bei einem eigenen Factory-Objekt machen wie schon geschrieben. Sprich:
Delphi-Quellcode:
MyFactory.RegisterClass(TBaum);
...
Und in MyFactory das ganze in ein TDictionary<string, TClass> werfen, wobei der Key der Klassenname als String der Klasse ist. Dann kannst du aus diesem Dictionary jederzeit über den Namen der Klasse die Klasse finden und kannst die entsprechend erzeugen.

Sir Rufo 18. Jun 2013 21:45

AW: Objekte aus Textdatei erstellen
 
@jaenicke :thumb:

So könnte die Klasse aussehen
Delphi-Quellcode:
unit Entity;

TEntity = class

end;

TEntityClass = class of TEntity;

TEntityFactory = class
class procedure RegisterClass( const AName : string; AClass : TEntityClass ); overload;
class procedure RegisterClass( AClass : TEntityClass ); overload;
class function Construct( const AName : string ) : TEntity;
// oder mit Generics
class function Construct<T : TEntityClass>( const AName : string ) : T;
end;
das Registrieren dann wie schon erwähnt
Delphi-Quellcode:
unit Baum;

uses
  Entity;

TBaum = class( TEntity )
end;

TBusch = class( TEntity )
end;

initialization

TEntityFactory.RegisterClass( 'Baum', TBaum );
TEntityFactory.RegisterClass( 'Busch', TBusch );

end.
und erzeugen dann mit
Delphi-Quellcode:
var
  LBaum : TEntity;
  LBusch : TEntity;

LBaum := TEntityFactory.Construct( 'Baum' );
LBusch := TEntityFactory.Construct( 'Busch' );

Acuaplano 20. Jun 2013 16:36

AW: Objekte aus Textdatei erstellen
 
Hab jetzt das mit dem "Dictionary" probiert. Nur heißt das bei Lazarus TFPGMap und hat bisschen andere Namen, wobei das in meinen Augen ansonsten wenig Unterschiede hat.
Eine Klasse einfügen funktioniert und auslesen geht glaube ich auch*.
Nur schmeißt der mir jetzt hier ne Fehlermeldung aus (External SIGSEGV):
Delphi-Quellcode:
Value := Dictionary.GetKeyData('Baum');
with TImageSprite(Dictionary.GetKeyData('Baum')).Create(AdSpriteEngine) do
begin
  x := i * 96;
  y := j * 96;
  z := 30;
end;
Ich persönlich würde ja einfach mal sagen, dass ich Zeile 2 einfach falsch geschrieben hab, aber als ich überprüfen wollte*, ob der überhaupt die Klasse ausliest kam mir der Inhalt von "Value" etwas verdächtig vor:
Code:
Value = TClass($00573390) = record{}
Ist das so schon richtig oder passt da das record nicht rein? Wäre ein record nicht eine Gruppierung aus Variablen, also keine Klasse?

Acuaplano 22. Jun 2013 15:43

AW: Objekte aus Textdatei erstellen
 
Okay, hat sich erledigt, ich hatte vergessen den "class of"-Befehl zu benutzen.
Delphi-Quellcode:
TUnbenutzbarClass = class of TUnbenutzbar

...
Delphi-Quellcode:
Dictionary := TFPGMap<String, TUnbenutzbarClass>.Create;

...
Delphi-Quellcode:
Value := Dictionary.GetKeyData('Baum');
TestObjekt := Value.Create(AdSpriteEngine);
Jedenfalls danke für die Hilfe! Wir werden uns dann später auch an den Streams und Factorys versuchen :D


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

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