3

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

布局

对于数据结构,我使用的是 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')and MyTree.LoadFromFile('C:/Test.dat'),但是当它加载回来时,树视图不包含数据,只有一个空白行。

4

2 回答 2

3

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

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 流支持。您当然可以使用自己的方式将数据信息写入流。

于 2011-09-12T18:42:00.497 回答
1

Looks like you need to implement the OnSaveNode and OnLoadNode events:

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 回答