Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Komponenten merken und später zuweisen (https://www.delphipraxis.net/121516-komponenten-merken-und-spaeter-zuweisen.html)

stahli 2. Okt 2008 14:00

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:
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:19 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