3

VirtualStringTreeコンポーネントを使用して単純な連絡先マネージャーを実装しようとしています。すべてテキストを含む3列のみのリストビューコンポーネントのように設定しました。

レイアウト

データ構造には、別のStackOverflowの質問で言及されたLinasのsvTreeを使用しています。

私はこのような記録を宣言しました:

type
  TMainData = record
    Name, Email, Password: string;
  end;

フォームのOnCreateには、次のものがあります。

procedure TForm1.FormCreate(Sender: TObject);
begin
  MyTree := TSVTree<TMainData>.Create(False);
  MyTree.VirtualTree := vst1;
end;

TEditsからのデータを次のように追加しています。

procedure TForm1.BuildStructure;
var
  svNode: TSVTreeNode<TMainData>;
  Data: TMainData;
begin
  MyTree.BeginUpdate;
  try
    Data.Name := edtname.Text;
    Data.Email := edtEmail.Text;
    Data.Password := edtPassword.Text;
    svNode := MyTree.AddChild(nil, Data);
  finally
    MyTree.EndUpdate;
  end;
  Label1.Caption := 'Count: '+IntToStr(MyTree.TotalCount);
end;

これをストリームまたはファイルに保存してロードバックするにはどうすればよいですか?MyTree.SaveToFile('C:/Test.dat')とを使用してみMyTree.LoadFromFile('C:/Test.dat')ましたが、ロードバックすると、ツリービューにデータが含まれず、空白行のみが含まれます。

4

2 に答える 2

3

TSVTreeのOnLoadNodeおよびOnSaveNodeプロシージャを設定し、ここでロジックを実装する必要があります。Project2はDemosフォルダーにあります。例えば:

uses
  uSvHelpers;

MyTree.OnSaveNode := DoSave;
MyTree.OnLoadNode := DoLoad;

procedure TForm1.DoLoad(Sender: TSVTree<TMainData>; Node: TSVTreeNode<TMainData>; Stream: TStream);
var
  obj: TMainData;
begin
  //
  if Assigned(Node) then
  begin
    //read from stream
    //read in correct order
    obj.Name := Stream.AsString;
    obj.Email := Stream.AsString;
    obj.Password := Stream.AsString;
    Node.FValue := obj;
  end;
end;

procedure TForm1.DoSave(Sender: TSVTree<TMainData>; Node: TSVTreeNode<TMainData>; Stream: TStream);
begin
  if Assigned(Node) then
  begin
    //read from stream
    Stream.WriteString(Node.FValue.Name);
    Stream.WriteString(Node.FValue.Email);
    Stream.WriteString(Node.FValue.Password);
  end;
end;

その後、MyTree.SaveToFile('C:/Test.dat')またはに電話することができますMyTree.LoadFromFile('C:/Test.dat')。私のデモとこの例では、より多くのOOストリームサポートのためにTStreamヘルパーを実装する別のユニット(uSvHelpers)を使用しました。もちろん、独自の方法でデータ情報を書き込んでストリーミングすることもできます。

于 2011-09-12T18:42:00.497 に答える
1

OnSaveNodeイベントとOnLoadNodeイベントを実装する必要があるようです。

procedure TForm.VTLoadNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Stream: TStream);
begin
  // Load Node Data record from the stream
end;

procedure TForm.VTSaveNode(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Stream: TStream);
begin
  // Save Node Data record to the stream
end;
于 2011-09-12T18:40:39.780 に答える