2

プロジェクトを 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;

助けてくれてありがとう。

4

1 に答える 1

8

文字データを書き込むときは、ロード中にどれだけ読み直せばよいかがわかるような方法で書き込む必要があります。現在、文字データだけを書いているので、後でもう一度読み取る必要があるかどうかはわかりません。代わりに、それがすでに適切な長さであると想定しています。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]));
于 2013-02-05T18:26:18.550 に答える