如何保存和加载我的svTree数据结构?

时间:2011-09-12 17:01:34

标签: delphi data-structures virtualtreeview tvirtualstringtree

我正在尝试使用VirtualStringTree组件实现一个简单的联系人管理器。我将它设置为看起来像列表视图组件,只有三列将包含文本:

Layout

对于数据结构,我正在使用Linas的svTree,这是在另一个Stack Overflow问题中提到的。

我已经宣布了这样的记录:

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'),但是当它被加载回来时,树视图不包含数据,只包含一个空行。

2 个答案:

答案 0 :(得分:3)

您需要为TSVTree设置OnLoadNode和OnSaveNode过程并在此处实现您的逻辑。您可以在Demos文件夹中查看Project2。 E.g:

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')即可。在我的演示和这个例子中,我使用了另一个单元(uSvHelpers),它实现了TStream帮助器以获得更多的OO流支持。您当然可以使用自己的方式将数据信息写入流中。

答案 1 :(得分: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;