如何使用Delphi保存加载到virtualtree组件中的文件?

如何使用Delphi保存加载到virtualtree组件中的文件?,第1张

概述我已经下载了virtualtree组件和手册“Virtual TreeView教程”.我一步一步地按照教程和编码.教程中的大部分功能都很好,除了savetofile和loadfromfile不起作用. 我的节点数据是 type PMytreedata = ^TMYTreeData; TMYTreeData = record Column0: String; Column1: @H_301_1@ 我已经下载了virtualtree组件和手册“Virtual TreeVIEw教程”.我一步一步地按照教程和编码.教程中的大部分功能都很好,除了savetofile和loadfromfile不起作用.

我的节点数据是

type  PMytreedata = ^TMYTreeData;  TMYTreeData = record    Column0: String;    Column1: String;    Column2: String;  end;

问题是当从文件加载时,column0,column1 / 2中的字符串丢失.

代码如下

创建新节点和数据:

procedure TForm3.button1Click(Sender: TObject); //CRETAE NEW NODE AND DATAbegin  Randomize;  Rand := Random(99);  XNode := VST.AddChild(nil);  if VST.absoluteIndex(XNode) > -1 then  begin    Data := VST.GetNodeData(Xnode);    Data^.Column0 := IntToStr(Rand)+EDIT1.Text + 'One' ;    Data^.Column1 := EDIT1.Text+'Two' + IntToStr(Rand + 10);    Data^.Column2 := EDIT1.Text+'Three' + IntToStr(Rand - 10);  end;end;procedure TForm3.button2Click(Sender: TObject);//ADDCHILDvar  XNode: PVirtualNode;  Data: PMytreedata;begin  if not Assigned(VST.Focusednode) then     Exit;   XNode := VST.AddChild(VST.Focusednode);   Data := VST.GetNodeData(Xnode);   Data^.Column0 := EDIT1.Text ;   Data^.Column1 := EDIT2.Text ;   Data^.Column2 := EDIT3.Text ;   VST.Expanded[VST.Focusednode] := True;end;

保存到文件并从文件加载

procedure TForm3.button4Click(Sender: TObject);begin    VST.Savetofile('C:\vst.at1');end;procedure TForm3.button5Click(Sender: TObject);begin    VST.LoadFromfile('C:\vst.at1');end;

获取节点大小而不出现代码错误

procedure TForm3.VSTGetNodeDataSize(Sender: TBaseVirtualTree;  var NodeDataSize: Integer);begin    NodeDataSize := SizeOf(TMYTreeData);//WITHOUT THE CODE,ERROR COMING .end;

显示文字

procedure TForm3.VSTGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;  Column: TColumnIndex; TextType: TVSTTextType; var CellText: string);var  Data: PMytreedata;begin  Data := VST.GetNodeData(Node);  case Column of    0: CellText := Data^.Column0;    1: CellText := Data^.Column1;    2: CellText := Data^.Column2;  end;end;

加载表格文件

procedure TForm3.VSTLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode;  Stream: TStream);//LOAD FORM filevar  Data: PMytreedata;  Len: Integer;begin      Data := VST.GetNodeData(Node);      Stream.read(Len,SizeOf(Len));      SetLength(Data^.Column0,Len);      Stream.read(PChar(Data^.Column0)^,Len);      Stream.read(Len,SizeOf(Len));      SetLength(Data^.Column1,Len);      Stream.read(PChar(Data^.Column1)^,SizeOf(Len));      SetLength(Data^.Column2,Len);      Stream.read(PChar(Data^.Column2)^,Len);end;

保存文件

procedure TForm3.VSTSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode;  Stream: TStream); //SAVE TO filevar  Data: PMytreedata;  Len: Integer;begin  Data := VST.GetNodeData(Node);  Len := Length(Data^.Column0);  Stream.write(Len,SizeOf(Len));  Stream.write(PChar(Data^.Column0)^,Len);  Len := Length(Data^.Column1);  Stream.write(Len,SizeOf(Len));  Stream.write(PChar(Data^.Column1)^,Len);  Len := Length(Data^.Column2);  Stream.write(Len,SizeOf(Len));  Stream.write(PChar(Data^.Column2)^,Len);end;
解决方法 在Unicode Delphi,2009及更高版本中,Char是16位类型的WIDeChar.你只写了一半的字符串,因为你没有考虑到这一点.在每次调用Write和Read的字符串内容时,必须写入两倍的字节.

例如,每条线都是这样的

Stream.read(PChar(Data^.Column0)^,Len);

应该

Stream.read(PChar(Data^.Column0)^,Len*SizeOf(Char));

其他一些评论:

>您复制代码以读取和写入每个字符串.将这些重复的代码段提取到重用方法中会更好.>您应该使用WriteBuffer而不是Write. WriteBuffer调用Write来完成工作,但也会检查返回值并执行错误检查.同样调用ReadBuffer而不是Read.

总结

以上是内存溢出为你收集整理的如何使用Delphi保存/加载到virtualtree组件中的文件?全部内容,希望文章能够帮你解决如何使用Delphi保存/加载到virtualtree组件中的文件?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1251256.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存