So, danke an alle!
Das funktioniert jetzt wunderbar.
Meine Komponenten enthalten jetzt lediglich zwei Methoden zum Schreiben und Lesen in bzw. aus einer TExtIniFile.
Dabei können beliebige Daten (auch binäre Daten, einigene Objekte und Zeiger auf fremde Objekte) gespeichert und wieder hergestellt werden.
Für das Wiederherstellen von Objekten müssen die entsprechenden Klassen vorher registriert sein. Mehr ist nicht zu beachten.
Das Wiederherstellen von Zeigern auf fremde Komponenten (die ebenfalls in die Datei geschrieben wurden)funktioniert automatisch, ohne extra irgendwelche temp. ID´s verwalten zu müssen.
Mehrfaches Einlesen der gleichen Datei und Erzeugen analoger Komponenten und Beziehungen ist problemlos möglich, da die Beziehungen untereinander bei jedem Einlesevorgang erneut gültig sind (z.B. 5 Opel Corsa-Instanzen mit allen entsprechenden Objektbeziehungen für ein Autohaus).
Meine betreffenden Komponenten habe ich TExtIniFile bekannt gegeben, so dass nach dem Erzeugen der Komponenten-Instanzen diese gleich veranlasst werden, ihre Daten einzulesen. Dieser Teil ließe sich leicht auch auf andere Komponenten anpassen (oder wenn man die erzeugten Komponenten von außen veranlasst, ihre Daten zu lesen, braucht man gar nichts weiter verändern).
Delphi-Quellcode:
function TExtIniFile.DoReadComponent(Section, Ident: String; ReadingComponent,
OwnerComponent: TComponent; List: TList): TComponent;
var
S: String;
CN: String;
CCN: String;
P: Integer;
RC: TComponent;
ExistFlag: Boolean;
begin
Result := nil;
S := ReadString(Section, Ident, '');
if (S <> '') and (S <> 'Component(nil)') then
begin
P := Pos('(', S);
Delete(S, 1, P);
P := Pos(')', S);
CN := Copy(S, 1, Pred(P));
CCN := ReadString('Component(' + CN + ')', '{ClassName}', '');
if not PropertyFlag then
begin
RC := nil;
ExistFlag := ExistComponentName(CN);
if ExistFlag then
begin
RC := FoundComponent(CN);
end
else
begin
if Assigned(ReadingComponent) then
begin
RC := ReadingComponent;
end
else
begin
if (CN <> '') and (CCN <> '') then
begin
FindClass(CCN);
RC := TComponentClass(GetClass(CCN)).Create(nil); // KOMPONENTE ERZEUGEN...
end;
end;
end;
if Assigned(RC) then
begin
if Assigned(OwnerComponent) then
OwnerComponent.InsertComponent(RC);
if Assigned(List) then
List.Add(RC);
if RC is TDCustom then // ...UND GLEICH DATEN EINLESEN
begin
(RC as TDCustom).LoadFromFile(Self, 'Component(' + CN + ')', '');
end
else
if RC is TVCustom then // ...UND GLEICH DATEN EINLESEN
begin
(RC as TVCustom).LoadFromFile(Self, 'Component(' + CN + ')', '');
end;
end;
if not ExistFlag then
ComponentList.AddObject(CN, RC);
Result := RC;
end;
end;
end;
Wenn Interesse besteht, stelle ich die TExtIniFile gern im Forum bereit.
Ach so, ein Nachsatz:
Ich wollte die Unterstützung noch von public propertys (Objekten) ermöglichen. Ich habe IsStoredProp verwendet, was auch funktionierte. SetObjectProp führte jedoch zu einem Laufzeitfehler. Eine Alternative habe ich nicht gefunden. Gibt´s da noch etwas?
Stahli