unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, VirtualTrees, ImgList, StdCtrls, Menus, ComCtrls;type
{*------------------------------------------------------------------------------
首先,先自己定义一个结点所对应的数据结构。
这一般是一个结构体,内容根据你的需要自己定义
-------------------------------------------------------------------------------}
TMyRec=record
Text:string;//结点显示的文本
end;
{*------------------------------------------------------------------------------
定义一个上面结构体的指针类型,后面要用到这个东东
-------------------------------------------------------------------------------}
PMyRec=^TMyRec; TForm1 = class(TForm)
il1: TImageList;
vsttree: TVirtualStringTree;
Button1: TButton;
Button2: TButton;
Button3: TButton;
VirtualStringTree1: TVirtualStringTree;
TreeView1: TTreeView;
Button4: TButton;
Button5: TButton;
procedure FormCreate(Sender: TObject);
procedure vsttreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
procedure vsttreeInitNode(Sender: TBaseVirtualTree; ParentNode,
Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
procedure vsttreeFreeNode(Sender: TBaseVirtualTree;
Node: PVirtualNode);
procedure Button1Click(Sender: TObject);
procedure vsttreeSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
Stream: TStream);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure vsttreeLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
Stream: TStream);
private
{ Private declarations }
public
{ Public declarations }
procedure saveNode(stream:Tstream);
end;var
Form1: TForm1;
RootNode,ChileNode:PVirtualNode;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
var Data:PMyRec;
begin
//指定结点数据大小
vsttree.NodeDataSize:=SizeOf(TMyRec); //添加根节点
RootNode:= vsttree.AddChild(nil);
Data:=vsttree.GetNodeData(RootNode);
Data^.Text:='根结点'; //添加一个子结点
ChileNode:=vsttree.AddChild(RootNode);
Data:=vsttree.GetNodeData(ChileNode);
Data^.Text:='子结点1';
//再添加一个子结点
ChileNode:=vsttree.AddChild(RootNode);
Data:=vsttree.GetNodeData(ChileNode);
Data^.Text:='子结点2';
//默认展开一级结点,这句话要写在初始的最后
vsttree.Expanded[RootNode]:=True;
end;procedure TForm1.vsttreeGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
var
Data:PMyRec;
begin
Data:=Sender.GetNodeData(Node); CellText:=Data^.Text;
end;procedure TForm1.vsttreeInitNode(Sender: TBaseVirtualTree; ParentNode,
Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
Data:PMyRec;
begin
Data:=Sender.GetNodeData(Node);
end;procedure TForm1.vsttreeFreeNode(Sender: TBaseVirtualTree;
Node: PVirtualNode);
var
Data:PMyRec;
begin
Data:=Sender.GetNodeData(Node);
Finalize(Data^);
end;procedure TForm1.Button1Click(Sender: TObject);
var
RootNode,ChileNode,node:PVirtualNode;
Data,data1:PMyRec;
i:integer;
begin
//指定结点数据大小
vsttree.NodeDataSize:=SizeOf(TMyRec);
for i:=1 to 10 do
begin
//添加根节点
RootNode:= vsttree.AddChild(nil);
Data:=vsttree.GetNodeData(RootNode);
Data^.Text:='根结点'+Inttostr(i); end; Node:= vsttree.GetFirst;
while Assigned(Node) do
begin
Data:= vsttree.GetNodeData(Node);
if data^.Text='根结点1' then
begin
for i:=1 to 10 do
begin
ChileNode:=vsttree.AddChild(Node);
Data1:=vsttree.GetNodeData(ChileNode);
Data1^.Text:='子结点1'; end;
end;
Node := vsttree.GetNext(Node);
end;
end;procedure Tform1.saveNode(stream:Tstream);
begin
end;procedure TForm1.vsttreeSaveNode(Sender: TBaseVirtualTree;
Node: PVirtualNode; Stream: TStream);
var
size:integer;
Data:PMyRec;
begin
data:=sender.GetNodeData(node);
stream.Write(data,SizeOf(data));
size:=Length(data^.Text)+1;
stream.Write(pchar(data^.Text)^,size);
end;procedure TForm1.Button4Click(Sender: TObject);
begin
vsttree.SaveToFile('c:\a.txt');
end;procedure TForm1.Button5Click(Sender: TObject);
begin vsttree.LoadFromFile('c:\a.txt');
end;procedure TForm1.vsttreeLoadNode(Sender: TBaseVirtualTree;
Node: PVirtualNode; Stream: TStream);
var
Size: Integer;
StrBuffer: PChar;
Data:PMyRec;
begin
data:=sender.GetNodeData(node);
Stream.Read(size, SizeOf(size)); // length of the string
StrBuffer := AllocMem(Size); // get temporary memory
Stream.Read(StrBuffer^, size); // read the string
data^.Text := StrBuffer;
FreeMem(StrBuffer);
end;end.
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, VirtualTrees, ImgList, StdCtrls, Menus, ComCtrls;type
{*------------------------------------------------------------------------------
首先,先自己定义一个结点所对应的数据结构。
这一般是一个结构体,内容根据你的需要自己定义
-------------------------------------------------------------------------------}
TMyRec=record
Text:string;//结点显示的文本
end;
{*------------------------------------------------------------------------------
定义一个上面结构体的指针类型,后面要用到这个东东
-------------------------------------------------------------------------------}
PMyRec=^TMyRec; TForm1 = class(TForm)
il1: TImageList;
vsttree: TVirtualStringTree;
Button1: TButton;
Button2: TButton;
Button3: TButton;
VirtualStringTree1: TVirtualStringTree;
TreeView1: TTreeView;
Button4: TButton;
Button5: TButton;
procedure FormCreate(Sender: TObject);
procedure vsttreeGetText(Sender: TBaseVirtualTree; Node: PVirtualNode;
Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
procedure vsttreeInitNode(Sender: TBaseVirtualTree; ParentNode,
Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
procedure vsttreeFreeNode(Sender: TBaseVirtualTree;
Node: PVirtualNode);
procedure Button1Click(Sender: TObject);
procedure vsttreeSaveNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
Stream: TStream);
procedure Button4Click(Sender: TObject);
procedure Button5Click(Sender: TObject);
procedure vsttreeLoadNode(Sender: TBaseVirtualTree; Node: PVirtualNode;
Stream: TStream);
private
{ Private declarations }
public
{ Public declarations }
procedure saveNode(stream:Tstream);
end;var
Form1: TForm1;
RootNode,ChileNode:PVirtualNode;
implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
var Data:PMyRec;
begin
//指定结点数据大小
vsttree.NodeDataSize:=SizeOf(TMyRec); //添加根节点
RootNode:= vsttree.AddChild(nil);
Data:=vsttree.GetNodeData(RootNode);
Data^.Text:='根结点'; //添加一个子结点
ChileNode:=vsttree.AddChild(RootNode);
Data:=vsttree.GetNodeData(ChileNode);
Data^.Text:='子结点1';
//再添加一个子结点
ChileNode:=vsttree.AddChild(RootNode);
Data:=vsttree.GetNodeData(ChileNode);
Data^.Text:='子结点2';
//默认展开一级结点,这句话要写在初始的最后
vsttree.Expanded[RootNode]:=True;
end;procedure TForm1.vsttreeGetText(Sender: TBaseVirtualTree;
Node: PVirtualNode; Column: TColumnIndex; TextType: TVSTTextType;
var CellText: WideString);
var
Data:PMyRec;
begin
Data:=Sender.GetNodeData(Node); CellText:=Data^.Text;
end;procedure TForm1.vsttreeInitNode(Sender: TBaseVirtualTree; ParentNode,
Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
Data:PMyRec;
begin
Data:=Sender.GetNodeData(Node);
end;procedure TForm1.vsttreeFreeNode(Sender: TBaseVirtualTree;
Node: PVirtualNode);
var
Data:PMyRec;
begin
Data:=Sender.GetNodeData(Node);
Finalize(Data^);
end;procedure TForm1.Button1Click(Sender: TObject);
var
RootNode,ChileNode,node:PVirtualNode;
Data,data1:PMyRec;
i:integer;
begin
//指定结点数据大小
vsttree.NodeDataSize:=SizeOf(TMyRec);
for i:=1 to 10 do
begin
//添加根节点
RootNode:= vsttree.AddChild(nil);
Data:=vsttree.GetNodeData(RootNode);
Data^.Text:='根结点'+Inttostr(i); end; Node:= vsttree.GetFirst;
while Assigned(Node) do
begin
Data:= vsttree.GetNodeData(Node);
if data^.Text='根结点1' then
begin
for i:=1 to 10 do
begin
ChileNode:=vsttree.AddChild(Node);
Data1:=vsttree.GetNodeData(ChileNode);
Data1^.Text:='子结点1'; end;
end;
Node := vsttree.GetNext(Node);
end;
end;procedure Tform1.saveNode(stream:Tstream);
begin
end;procedure TForm1.vsttreeSaveNode(Sender: TBaseVirtualTree;
Node: PVirtualNode; Stream: TStream);
var
size:integer;
Data:PMyRec;
begin
data:=sender.GetNodeData(node);
stream.Write(data,SizeOf(data));
size:=Length(data^.Text)+1;
stream.Write(pchar(data^.Text)^,size);
end;procedure TForm1.Button4Click(Sender: TObject);
begin
vsttree.SaveToFile('c:\a.txt');
end;procedure TForm1.Button5Click(Sender: TObject);
begin vsttree.LoadFromFile('c:\a.txt');
end;procedure TForm1.vsttreeLoadNode(Sender: TBaseVirtualTree;
Node: PVirtualNode; Stream: TStream);
var
Size: Integer;
StrBuffer: PChar;
Data:PMyRec;
begin
data:=sender.GetNodeData(node);
Stream.Read(size, SizeOf(size)); // length of the string
StrBuffer := AllocMem(Size); // get temporary memory
Stream.Read(StrBuffer^, size); // read the string
data^.Text := StrBuffer;
FreeMem(StrBuffer);
end;end.
vsttree.LoadFromFile('c:\a.txt');你在按钮5的事件里面添一句,我试过可以