Moin!
Delphi-Quellcode:
Unit Geometrie;
Interface
Type
TGeometrieMetaClass =
Class Of TGeometrie;
// das ist die Metaklasse
TGeometrie =
Class
Public
Constructor Create;
Virtual;
Destructor Destroy;
Override;
Class Function ObjektID:
String;
Virtual;
Abstract;
End;
So, da hast du dann deine Basisklasse mit dem Constructor und einer Funktion die dir die ID für das Objekt gibt als String. Dies kann dann z.B. "Kreis" oder "Quadrat" sein. Diese Funktion kann als Class Funktion auch ohne eine Instanz aufgerufen werden. Darüber können wir dann später die richtige Klasse finden - wenn in deiner Textdatei denn drinne steht "Kreis" (z.B.).
Ok, nun brauchen wir nur noch eine Funktionalität, die die ganzen Typen annimmt und sie alle kennt:
Delphi-Quellcode:
Unit GeometrieRegSvr;
Interface
Uses
Geometrie;
Function GetMetaClassForID(
Const AID:
String): TGeometrie;
Procedure RegisterGeometrieClass(AClass : TGeometrieMetaClass);
Implementation
Var
GeometrieClasses :
Array Of TGeometrieMetaClass;
Procedure RegisterGeometrieClass(AClass : TGeometrieMetaClass);
Var
i : Integer;
Begin
// already registered?
For i := Low(GeometrieClasses )
To High(GeometrieClasses )
Do
If ( GeometrieClasses [i] = AClass )
Then
Exit;
SetLength(GeometrieClasses , Length(GeometrieClasses )+1);
GeometrieClasses [Length(GeometrieClasses )-1] := AClass ;
End;
Function GetMetaClassForID(
Const AID:
String): TGeometrie;
Var
i : Integer;
Begin
For i := Low(GeometrieClasses)
To High(GeometrieClasses)
Do
If ( UpperCase(GeometrieClasses[i].ObjektID) = AID)
Then
Begin
Result := GeometrieClasses[i].Create;
Exit;
End;
Raise Exception.Create('
unbekannter Geometrietyp ' + AID + '
!');
End;
So, dann bekommst du mit GetMetaClassForID() schon die fertig angelegte Instanz der Klasse zurück die du suchst. Du musst nun nur noch 2 Dinge machen:
1. Alle deine TKreis, TQuadrat oder sonstige von TGeometrie ableiten und die ObjektID Procedure überschreiben und diese Kennung jeweils zurück geben. Diese Kennung ist gleich der die in die Datei geschrieben wird und gleich der die aus der Datei gelesen wird und die Klasse identifiziert.
2. In diesen Units die dann jeweils ein Objekt enthalten (also z.B: TKreis) musst du einmal diese Klasse hier registrieren. Dies machst du am besten im Initialize der
Unit:
Delphi-Quellcode:
Initialization
// registering the string adapter to the converter
RegisterGeometrieClass(TKreis);
end.
Und dann klappt das auch schon.
MfG
Muetze1