我正在尝试使用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')
和MyTree.LoadFromFile('C:/Test.dat')
,但是当它被加载回来时,树视图不包含数据,只包含一个空行。
答案 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;