How can I prevent a custom Node data loss tree for TTreeView?

I use the Zarko Gajic Store More (user) data in the Node tree from the tree> to add additional rows for each Node element, but I found that if my application has been idle for a long time, the values ​​that I saved in the custom nodes of the tree disappear.

This is what my custom treenode looked like when I left yesterday

Before going home

Here's what it looks like this morning (note that fMyProperty is now empty)

Back the next day

, , 1 . . , , , 30 .

, , , , , , . , FItemId , , , "" Treeview , , Tree node.

, .

, , Treenode, , , .

, ?

unit Test04Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls;

type
  TMyTreeNode = class(TTreeNode)
    private
      fMyProperty : string;
    public
    property MyProperty : string read fMyProperty write fMyProperty;
  end;
  TForm1 = class(TForm)
    TreeView1: TTreeView;
    StatusBar1: TStatusBar;
    procedure FormCreate(Sender: TObject);
    procedure TreeView1CreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
    procedure TreeView1Change(Sender: TObject; Node: TTreeNode);
  private
    fTreeView1_Selected: TMyTreeNode;
    property TreeView1_Selected : TMyTreeNode read fTreeView1_Selected;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  tn : TTreeNode;
  cnt : integer;
begin
  //fill some items
  TreeView1.Items.Clear;

  for cnt := 0 to 9 do
  begin
    tn := TreeView1.Items.AddChild(nil, IntToStr(cnt));
    //add default MyProperty values
    TMyTreeNode(tn).MyProperty := 'this is node ' + IntToStr(cnt);
  end;
end;

procedure TForm1.TreeView1Change(Sender: TObject; Node: TTreeNode);
begin
  fTreeView1_Selected := TMyTreeNode(Node);
  StatusBar1.Panels[0].Text := TreeView1_Selected.MyProperty;
end;

procedure TForm1.TreeView1CreateNodeClass(Sender: TCustomTreeView; var NodeClass: TTreeNodeClass);
begin
  NodeClass := TMyTreeNode;
end;

end.

Delphi XE6 Windows 2012 R2, Debug Win32 build, Win64.

+4
1

- VCL. VCL , , , . , . . , , .

, . , node. , node .

, RecreateWnd . . RecreateWnd, , node . node , .

. , , node, . . . Data , node. , node?

, Data node.

, node .

+6

Source: https://habr.com/ru/post/1583942/


All Articles