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.