![]() |
Re: Komponenten merken und später zuweisen
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:
Wenn Interesse besteht, stelle ich die TExtIniFile gern im Forum bereit.
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; 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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:28 Uhr. |
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