如何将TreeView上的节点连同其关联的对象存在一个文件里并可以重新装载访问。

Time 2000-01-11 08:57:00
如何将TreeView上的节点连同其关联的对象存在一个文件里并可以重新装载访问。
注:不保存在文件型数据库里。
...全文
171 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lin 2000-02-18
  • 打赏
  • 举报
回复
在添加节点时可用TTreeView.Items.AddObject代替TTreeView.Items.Add来保存对象信息到节点中。
其余同意Tiger和LightTop的意见。
土豆 2000-02-18
  • 打赏
  • 举报
回复
将节点信息保存就可以了,不必序列化对象吧?
barton 2000-01-23
  • 打赏
  • 举报
回复
谁把我的应答删了?可恶。
光明山人 2000-01-23
  • 打赏
  • 举报
回复
保存对象要稍难一些,因为在TreeNode中只存了个指针,除非TreeNode.Data是一个能用流操作的对象。如果是这样:(简单示范)
var
s1: TFileStream;
s2: TMemoryStream;
nCount, i: Inteter;

procedure CopyStream( sSrc, sDest: TStream );
begin
nCount := sSrc.Size;
sDest.Write( nCount, sizeof(nCount) ); // 请写入字节数
sDest.CopyFrom( sSrc, 0 ); // 写入TreeView的内容,第二个参数为0表示全部复制
sSrc.Size := 0; // 清掉以前数据
end;

begin
s2 := TMemoryStream.Create;
// 保存到文件
s1 := TFileStream.Create( '文件名', fmCreate );
TreeView.SaveToStream( s2 );
CopyStream( s2, s1 );
// 下面写入TreeNode的Data
for i:=0 to TreeView.Items.Count-1 do
begin
if Assigned(TreeView.Items[i].Data) then
begin
s2.Write( i, sizeof(i) ); // 保存序号,如果你有更好标识方法,可以代替
TYourDataClass(TreeView.Items[i].Data).SaveToStream( s2 ); // TYourDataClass只是假定的名字
CopyStream( s2, s1 );
end;
end;

s1.Free; // 在Free之前它会保存的

// 从文件读取
s1 := TFileStream.Create( '文件名', fmOpenRead );
s1.ReadBuffer( nCount, sizeof(nCount) );
s2.CopyFrom( s1, nCount );
TreeView.LoadFromStream( s2 );
// 下面读入TreeNode的Data
while s1.Position<s1.Size do
begin
s1.ReadBuffer( i, sizeof(i) );
s1.ReadBuffer( nCount, sizeof(nCount) );
s2.CopyFrom( s1, nCount );
TreeView.Items[i].Data := TYourDataClass.Create; // 当然,可能Create调用格式是另外的
TYourDataClass(TreeView.Items[i].Data).LoadFromStream( s2 );
end;

s1.Free;

s2.Free;

这个例子不一定能满足你的要求,不过至少你可以参考一下。因为在你的程序里,可能TreeView.Items[i].Data还有别的变量指着。但你可以变化一下。比如倒着赋值。
tiger 2000-01-11
  • 打赏
  • 举报
回复
TreeView.SaveToFile
lighttop 2000-01-11
  • 打赏
  • 举报
回复
或者保存到数据库表里。

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧