TTreeView Komponentenstreaming

Rund um die LCL und andere Komponenten
Antworten
ore12
Beiträge: 20
Registriert: Fr 3. Feb 2012, 16:37

TTreeView Komponentenstreaming

Beitrag von ore12 »

Hallo zusammen,

ich habe ein Problem mit dem Streaming von TTreeNode-Properties. Ich fülle ein TTreeView mit diversen TTreeNodes und streame das mittels Komponentenstreaming

Code: Alles auswählen

// schreiben
WriteComponentAsBinaryToStream(MemoryStream, TreeView1);
// und lesen
ReadComponentFromBinaryStream(MemoryStream, TComponent(TreeView1), @OnFindClass, self, nil, nil);
,was auch problemlos funktioniert. Dabei werden die Properties der zugehörigen TTreeNodes mitgestreamt, u.a. der Beschriftungstext der Nodes.

Nun will ich aber die TreeNodes erweitern mit:

Code: Alles auswählen

type
  TExtendedTreeNode = class(TTreeNode)
    private
      FValue: Integer;
    public
      constructor Create(AOwner: TTreeNodes); override;
    published
      property Value: Integer read FValue write FValue; 
  end;
und ergänze daher

Code: Alles auswählen

procedure TMeinFormular.FormCreate(Sender: TObject);
begin
  TreeView1.OnCreateNodeClass := @CreateExtendedNodeClass;
  TreeView1.OnCustomCreateItem := @CreateExtendedNodeItem;
end...
// und weiter

procedure TMeinFormular.CreateExtendedNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
begin
  NodeClass := TExtendedTreeNode;
end;

procedure TMeinFormular.CreateExtendedNodeItem(Sender: TCustomTreeView; var ATreeNode: TTreeNode);
begin
  ATreeNode := TMeinFormular.Create(Sender.Items) as TTreeNode;
end;  
Das wird ohne Fehler compiliert, aber mit oder ohne {$M+} werden die neuen Properties nicht mitgestreamt.
Ich habe zwar einen häßlichen Workaround, indem ich diese nach WriteComponentAsBinaryToStream einfach in den MemoryStream mit hineinschreibe, aber das ist natürlich nicht das Wahre.

Hat jemand von Euch schonmal sowas gemacht oder erkennt jemand, wo bei mir der Denkfehler liegt?

Vielen Dank für Eure Hinweise!

Schöne Weihnachten!

wp_xyz
Beiträge: 4893
Registriert: Fr 8. Apr 2011, 09:01

Re: TTreeView Komponentenstreaming

Beitrag von wp_xyz »

Ohne das jetzt konkret ausprobiert zu haben, vermute ich, dass du in dem neuen TreeNode die Methoden DefineProperties, ReadData und WriteData überschreiben musst: https://wiki.freepascal.org/Streaming_c ... Properties

wennerer
Beiträge: 524
Registriert: Di 19. Mai 2015, 20:05
OS, Lazarus, FPC: Linux Mint 20 Cinnamon,Lazarus 2.2.6 (rev lazarus_2_2_6) FPC 3.2.2 x86_64-linux-
CPU-Target: x86_64-linux-gtk2

Re: TTreeView Komponentenstreaming

Beitrag von wennerer »

Hallo,
schau mal in den Beitrag:
viewtopic.php?p=128693#p128693
Da hat mir wp_xyz erklärt wie es geht.

Viele Grüße
Bernd

Antworten