Delphi 保存和加载VirtualStringTree后损坏的数据

Delphi 保存和加载VirtualStringTree后损坏的数据,delphi,delphi-xe5,virtualtreeview,Delphi,Delphi Xe5,Virtualtreeview,我将严格遵循本教程,以保存和加载我的VirtualStringTree: 我现在的问题是,当我保存和加载数据时,我的数据被破坏了。更改和添加字符。有人知道问题出在哪里吗?我发现了这个问题,并更改了awnser以适应我的代码 Data.Symbol[1] //Simply points to a char. So I changed it to 'char' 阅读: 写: Len := Length(Data.Column0); Stream.Write(Len, SizeOf(Len));

我将严格遵循本教程,以保存和加载我的VirtualStringTree: 我现在的问题是,当我保存和加载数据时,我的数据被破坏了。更改和添加字符。有人知道问题出在哪里吗?

我发现了这个问题,并更改了awnser以适应我的代码

Data.Symbol[1]  //Simply points to a char. So I changed it to 'char'
阅读:

写:

Len := Length(Data.Column0);
Stream.Write(Len, SizeOf(Len));
Stream.Write(PChar(Data.Column0)^, Length(Data.Column0) * SizeOf(Char));

//Copy/Paste this code for all Columns
var
  TreeData: PTreeData;
  BinaryWriter: TBinaryWriter;
begin
  TreeData := Sender.GetNodeData(Node);

  BinaryWriter := TBinaryWriter.Create(Stream);
  try
    BinaryWriter.Write(TreeData.Column0);
    BinaryWriter.Write(TreeData.Column1);
    BinaryWriter.Write(TreeData.Column2);
  finally
    BinaryWriter.Free;
  end;
end;
特拉玛的第二个答案:

阅读:

写:

Len := Length(Data.Column0);
Stream.Write(Len, SizeOf(Len));
Stream.Write(PChar(Data.Column0)^, Length(Data.Column0) * SizeOf(Char));

//Copy/Paste this code for all Columns
var
  TreeData: PTreeData;
  BinaryWriter: TBinaryWriter;
begin
  TreeData := Sender.GetNodeData(Node);

  BinaryWriter := TBinaryWriter.Create(Stream);
  try
    BinaryWriter.Write(TreeData.Column0);
    BinaryWriter.Write(TreeData.Column1);
    BinaryWriter.Write(TreeData.Column2);
  finally
    BinaryWriter.Free;
  end;
end;
我实现了特拉玛的答案,因为我真的不能为所有的指针而烦恼。这段代码看起来更好,更容易阅读,占用更少的空间,并且也能做到这一点


因此,总结一下。当你搜索网页来保存你的VST数据时,你会得到很多垃圾代码。第一个答案将为您修复该代码。第二个会让你微笑:)

你需要读写比Lazarus中的例子更多的字节。更具体地说,您必须
Write(Data.Column,Len*SizeOf(Char))
读取(Data.Column,Len*SizeOf(Char))因为在Delphi版本中,字符串是每个字符2个字节。尽管如此,我还是会留下这个例子,或者制作用于字符串写入和读取的helper函数,或者使用现成的
TBinaryWriter
。您几乎已经拥有了它。你确实给了我信息来寻找正确的代码。TNX使用二进制读写器,我想你可以写一些东西。@TLama看起来不错。比我的代码更全面。我要看看我能不能实施它。“谢谢你。”特拉玛说,“我实现了它。如果你愿意,我可以接受你的答案,你是否应该发布它;)非常感谢您。请在您的回答中包含这些内容;-)