10 个解决方案
#1
1lou
#2
如果用VirtualTree(一个第三方TreeView)就很容易了。
#3
我看看
#4
TREEVIEW 不是有SAVETOFILE 方法吗?
就保存的是节点的信息,你可以试下,然后用LoadFromFile再提取信息
就保存的是节点的信息,你可以试下,然后用LoadFromFile再提取信息
#5
我试了TVirtualStringTree 这个控件的SavetoFiel()和LoadFromFile()好相只存储了结构信息没有存储属性
#6
关于树的生成和保存是大家平时用的最多的功能了。是不应该将它总结一下,用一种通用的模式来解决呢?
以前每一次都是重新写,这几天想将它总结一下。
一个节点最基本的信息就是名字和两个图标索引编号。其它的数据都保存到Data中。以前都是在Data中保存一个个对象,每个对象都有ShowChildNode(ANode:TTreeNode)方法,用来显示子节点。对象都有PathStr 属性,就是路径,每一个节点都有唯一标识,就用象文件路径的方式在表中保存路径,只要给定表中对应的路径字段,就可以生成树了。
如果要生成非常多的节点,是不是在Data中保存记录会比保存对象能更快一些。
看了一下系统资源管理器,Windows是用命名空间来管理实际的文件夹和虚拟的文件夹(我的电脑,控制面版)我们是不是也应用类似的方法实现
大家有什么好的实现模式吗?
以前每一次都是重新写,这几天想将它总结一下。
一个节点最基本的信息就是名字和两个图标索引编号。其它的数据都保存到Data中。以前都是在Data中保存一个个对象,每个对象都有ShowChildNode(ANode:TTreeNode)方法,用来显示子节点。对象都有PathStr 属性,就是路径,每一个节点都有唯一标识,就用象文件路径的方式在表中保存路径,只要给定表中对应的路径字段,就可以生成树了。
如果要生成非常多的节点,是不是在Data中保存记录会比保存对象能更快一些。
看了一下系统资源管理器,Windows是用命名空间来管理实际的文件夹和虚拟的文件夹(我的电脑,控制面版)我们是不是也应用类似的方法实现
大家有什么好的实现模式吗?
#7
>>>>我试了TVirtualStringTree 这个控件的SavetoFiel()和LoadFromFile()好相只存储了结构信息没有存储属性
------------------------------------------------
节点关联的 结构 的数据,应该在OnSaveNode事件中保存,
在OnLoadNode事件中读取。
type
PMyRec = ^TMyRec;
TMyRec = record
ID : Integer;
Caption: String;
end;
....
procedure TMainForm.VSTSaveNode(Sender: TBaseVirtualTree;
Node: PVirtualNode; Stream: TStream);
var
Data: PMyRec;
s : String;
l : Integer;
begin
with Sender do
begin
Data := GetNodeData(Node);
s:=Data.Caption;
l:=Length(s);
Stream.WriteBuffer(Data.Id,Sizeof(Integer));
Stream.WriteBuffer(l,Sizeof(Integer));
Stream.WriteBuffer(s[1],l);
end;
end;
procedure TMainForm.VSTLoadNode(Sender: TBaseVirtualTree;
Node: PVirtualNode; Stream: TStream);
var
Data: PMyRec;
s : String;
l : Integer;
begin
with Sender do
begin
Data := GetNodeData(Node);
Stream.ReadBuffer(l,Sizeof(Integer));
Data.Id:=l;
Stream.ReadBuffer(l,Sizeof(Integer));
SetLength(s,l);
Stream.ReadBuffer(s[1],l);
Data.Caption:=s;
end;
end;
procedure TMainForm.Button2Click(Sender: TObject);
begin
VST.SaveToFile('a.VT');
end;
procedure TMainForm.Button3Click(Sender: TObject);
begin
VST.LoadFromFile('a.VT');
end;
------------------------------------------------
节点关联的 结构 的数据,应该在OnSaveNode事件中保存,
在OnLoadNode事件中读取。
type
PMyRec = ^TMyRec;
TMyRec = record
ID : Integer;
Caption: String;
end;
....
procedure TMainForm.VSTSaveNode(Sender: TBaseVirtualTree;
Node: PVirtualNode; Stream: TStream);
var
Data: PMyRec;
s : String;
l : Integer;
begin
with Sender do
begin
Data := GetNodeData(Node);
s:=Data.Caption;
l:=Length(s);
Stream.WriteBuffer(Data.Id,Sizeof(Integer));
Stream.WriteBuffer(l,Sizeof(Integer));
Stream.WriteBuffer(s[1],l);
end;
end;
procedure TMainForm.VSTLoadNode(Sender: TBaseVirtualTree;
Node: PVirtualNode; Stream: TStream);
var
Data: PMyRec;
s : String;
l : Integer;
begin
with Sender do
begin
Data := GetNodeData(Node);
Stream.ReadBuffer(l,Sizeof(Integer));
Data.Id:=l;
Stream.ReadBuffer(l,Sizeof(Integer));
SetLength(s,l);
Stream.ReadBuffer(s[1],l);
Data.Caption:=s;
end;
end;
procedure TMainForm.Button2Click(Sender: TObject);
begin
VST.SaveToFile('a.VT');
end;
procedure TMainForm.Button3Click(Sender: TObject);
begin
VST.LoadFromFile('a.VT');
end;
#8
回去看看..谢先
#9
如果你熟悉了树,你就知道怎么处理这种问题了
#10
好像是可以直接save 的
#1
1lou
#2
如果用VirtualTree(一个第三方TreeView)就很容易了。
#3
我看看
#4
TREEVIEW 不是有SAVETOFILE 方法吗?
就保存的是节点的信息,你可以试下,然后用LoadFromFile再提取信息
就保存的是节点的信息,你可以试下,然后用LoadFromFile再提取信息
#5
我试了TVirtualStringTree 这个控件的SavetoFiel()和LoadFromFile()好相只存储了结构信息没有存储属性
#6
关于树的生成和保存是大家平时用的最多的功能了。是不应该将它总结一下,用一种通用的模式来解决呢?
以前每一次都是重新写,这几天想将它总结一下。
一个节点最基本的信息就是名字和两个图标索引编号。其它的数据都保存到Data中。以前都是在Data中保存一个个对象,每个对象都有ShowChildNode(ANode:TTreeNode)方法,用来显示子节点。对象都有PathStr 属性,就是路径,每一个节点都有唯一标识,就用象文件路径的方式在表中保存路径,只要给定表中对应的路径字段,就可以生成树了。
如果要生成非常多的节点,是不是在Data中保存记录会比保存对象能更快一些。
看了一下系统资源管理器,Windows是用命名空间来管理实际的文件夹和虚拟的文件夹(我的电脑,控制面版)我们是不是也应用类似的方法实现
大家有什么好的实现模式吗?
以前每一次都是重新写,这几天想将它总结一下。
一个节点最基本的信息就是名字和两个图标索引编号。其它的数据都保存到Data中。以前都是在Data中保存一个个对象,每个对象都有ShowChildNode(ANode:TTreeNode)方法,用来显示子节点。对象都有PathStr 属性,就是路径,每一个节点都有唯一标识,就用象文件路径的方式在表中保存路径,只要给定表中对应的路径字段,就可以生成树了。
如果要生成非常多的节点,是不是在Data中保存记录会比保存对象能更快一些。
看了一下系统资源管理器,Windows是用命名空间来管理实际的文件夹和虚拟的文件夹(我的电脑,控制面版)我们是不是也应用类似的方法实现
大家有什么好的实现模式吗?
#7
>>>>我试了TVirtualStringTree 这个控件的SavetoFiel()和LoadFromFile()好相只存储了结构信息没有存储属性
------------------------------------------------
节点关联的 结构 的数据,应该在OnSaveNode事件中保存,
在OnLoadNode事件中读取。
type
PMyRec = ^TMyRec;
TMyRec = record
ID : Integer;
Caption: String;
end;
....
procedure TMainForm.VSTSaveNode(Sender: TBaseVirtualTree;
Node: PVirtualNode; Stream: TStream);
var
Data: PMyRec;
s : String;
l : Integer;
begin
with Sender do
begin
Data := GetNodeData(Node);
s:=Data.Caption;
l:=Length(s);
Stream.WriteBuffer(Data.Id,Sizeof(Integer));
Stream.WriteBuffer(l,Sizeof(Integer));
Stream.WriteBuffer(s[1],l);
end;
end;
procedure TMainForm.VSTLoadNode(Sender: TBaseVirtualTree;
Node: PVirtualNode; Stream: TStream);
var
Data: PMyRec;
s : String;
l : Integer;
begin
with Sender do
begin
Data := GetNodeData(Node);
Stream.ReadBuffer(l,Sizeof(Integer));
Data.Id:=l;
Stream.ReadBuffer(l,Sizeof(Integer));
SetLength(s,l);
Stream.ReadBuffer(s[1],l);
Data.Caption:=s;
end;
end;
procedure TMainForm.Button2Click(Sender: TObject);
begin
VST.SaveToFile('a.VT');
end;
procedure TMainForm.Button3Click(Sender: TObject);
begin
VST.LoadFromFile('a.VT');
end;
------------------------------------------------
节点关联的 结构 的数据,应该在OnSaveNode事件中保存,
在OnLoadNode事件中读取。
type
PMyRec = ^TMyRec;
TMyRec = record
ID : Integer;
Caption: String;
end;
....
procedure TMainForm.VSTSaveNode(Sender: TBaseVirtualTree;
Node: PVirtualNode; Stream: TStream);
var
Data: PMyRec;
s : String;
l : Integer;
begin
with Sender do
begin
Data := GetNodeData(Node);
s:=Data.Caption;
l:=Length(s);
Stream.WriteBuffer(Data.Id,Sizeof(Integer));
Stream.WriteBuffer(l,Sizeof(Integer));
Stream.WriteBuffer(s[1],l);
end;
end;
procedure TMainForm.VSTLoadNode(Sender: TBaseVirtualTree;
Node: PVirtualNode; Stream: TStream);
var
Data: PMyRec;
s : String;
l : Integer;
begin
with Sender do
begin
Data := GetNodeData(Node);
Stream.ReadBuffer(l,Sizeof(Integer));
Data.Id:=l;
Stream.ReadBuffer(l,Sizeof(Integer));
SetLength(s,l);
Stream.ReadBuffer(s[1],l);
Data.Caption:=s;
end;
end;
procedure TMainForm.Button2Click(Sender: TObject);
begin
VST.SaveToFile('a.VT');
end;
procedure TMainForm.Button3Click(Sender: TObject);
begin
VST.LoadFromFile('a.VT');
end;
#8
回去看看..谢先
#9
如果你熟悉了树,你就知道怎么处理这种问题了
#10
好像是可以直接save 的