【发布时间】:2015-04-24 03:18:22
【问题描述】:
我正在使用Zarko Gajic's Store More (Custom) Data Into The Tree Node Of A Tree View为每个节点项添加额外的字符串,但我发现如果我的应用程序长时间空闲,我存储在自定义树节点中的值就会消失。
这是我昨天离开时自定义树节点的样子
这就是今天早上的样子(注意 fMyProperty 值现在为空)
我已确认我的计算机从不休眠或休眠,但系统会在锁定 1 分钟后关闭显示器以省电。但是,计算机需要空闲一段时间才能发生此问题。整夜闲置时最明显,但仅闲置 30 分钟则不太可能发生。
我能想到的唯一可能导致此问题的原因是操作系统正在将应用程序内存交换到磁盘,并且当您重新激活计算机时,它会交换回内存。如您所见,FItemId 正在发生变化,因此它似乎正在“重建” Treeview,从而失去与自定义 Tree 节点的关联。
我用一个非常简单的应用程序重现了这个问题,代码如下。
我知道我可以使用另一种方法来存储额外的数据,即使用 Treenode 中的 Data 字段,但是能够这样做会很好,因为我不必担心释放额外的内存块节点被删除。
我可以做些什么来防止这种数据丢失的发生?
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.
在 Windows 2012 R2 上使用 Delphi XE6,调试 Win32 版本,但 Win64 版本也会出现此问题。
【问题讨论】:
标签: delphi