gpt4 book ai didi

delphi - 保存 VirtualStringTree 节点数据

转载 作者:行者123 更新时间:2023-12-02 14:52:06 24 4
gpt4 key购买 nike

我正在尝试将项目从 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]));

关于delphi - 保存 VirtualStringTree 节点数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14713885/

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