保存VirtualStringTree节点数据
我正试图将一个项目从D6移到D-XE3。 当使用VirtualStringTree版本5.10保存并加载OnSaveNode和OnLoadEvents中的树数据时,我得到了垃圾。 我可能没有正确处理Unicode,但我可能会有一些其他的无知:
procedure TfMain.vstGridSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
Stream: TStream);
var
Data: PStkData;
begin
Data := Sender.GetNodeData(Node);
// Owned: boolean;
Stream.Write(Data.Owned, SizeOf(boolean) );
// Symbol: string;
Stream.Write(PChar(Data.Symbol)^, Length(Data.Symbol) * SizeOf(Char));
// AvgTarget: currency;
//Stream.Write(Data.AvgTarget, SizeOf(currency));
// PE: double;
Stream.Write(Data.PE, SizeOf(double));
end;
procedure TfMain.vstGridLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
Stream: TStream);
var
Data: PStkData;
begin
Data := Sender.GetNodeData(Node);
//Owned: boolean;
Stream.Read(Data.Owned, SizeOf(boolean));
//Symbol: string;
Stream.Read(PChar(Data.Symbol)^, Length(Data.Symbol) * SizeOf(Char));
//AvgTarget: currency;
Stream.Read(Data.AvgTarget, SizeOf(currency));
//PE: double;
Stream.Read(Data.PE, SizeOf(double));
end;
谢谢你的帮助。
当您编写字符数据时,您需要确保以加载时再次读取多少的方式编写字符数据。 您目前正在编写字符数据,因此您不知道以后需要多少次阅读。 相反,你认为Symbol
的长度已经是正确的了,现在我已经指出了这一点,你可能认为这是一个无效的假设。
当你编写字符串时,首先写下它的长度,以便在加载时可以读取:
var
SymbolLen: Integer;
SymbolLen := Length(Data.Symbol);
Stream.Write(SymbolLen, SizeOf(SymbolLen));
Stream.Write(PChar(Data.Symbol)^, Length(Data.Symbol) * SizeOf(Data.Symbol[1]));
然后你可以阅读它:
Stream.Read(SymbolLen, SizeOf(SymbolLen));
SetLength(Data.Symbol, SymbolLen);
Stream.Read(PChar(Data.Symbol)^, SymbolLen * SizeOf(Data.Symbol[1]));
链接地址: http://www.djcxy.com/p/35069.html
上一篇: Saving VirtualStringTree Node Data
下一篇: How to select all root or all child nodes in VirtualStringTree?