gpt4 book ai didi

delphi - 如何使用Delphi在virtualtree组件中保存/加载文件?

转载 作者:行者123 更新时间:2023-12-03 15:23:04 26 4
gpt4 key购买 nike

我已经下载了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 DATA
begin
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);//ADDCHILD
var
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 FILE
var
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)^, Len);

Stream.read(Len, SizeOf(Len));
SetLength(Data^.Column2, Len);
Stream.read(PChar(Data^.Column2)^, Len);
end;

保存到文件

procedure TForm3.VSTSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
Stream: TStream); //SAVE TO FILE
var
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。您只写了字符串的一半,因为您没有考虑到这一点。在每次调用 WriteRead 获取字符串内容时,您必须写入两倍的字节数。

例如,每一行都是这样的

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

应该是

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

其他一些评论:

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

关于delphi - 如何使用Delphi在virtualtree组件中保存/加载文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45606992/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com