Virtual TreeView最新示例

来源:互联网 发布:人工智能在智慧物流 编辑:程序博客网 时间:2024/04/29 16:42


{*------------------------------------------------------------------------------
  Virtual TreeView使用示例

  @author  屈剑峰  email: qujianfeng@gmail.com
  @version 2008/10/16 1.0 Initial revision.
  @todo
  @comment
-------------------------------------------------------------------------------}          
unit Unit4;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, VirtualTrees, ImgList, Menus, AdvMenus, StdCtrls;

type
  {*------------------------------------------------------------------------------
    首先,先自己定义一个结点所对应的数据结构。
    这一般是一个结构体,内容根据你的需要自己定义
  -------------------------------------------------------------------------------}  
  TMyRec=record
    Text:string;//结点显示的文本
    ImageIndex:Integer;//结点显示的图片索引。注意:要在结点显示图片必须TreeOptions.MiscOptions包含toCheckSuppot
    Id:string;//数据Id,可以为数据库记录的Id
    CheckType:TCheckType; //选择框类型
    CheckState:TCheckState;//选择框状态
    //...你还可以自己加
  end;
  {*------------------------------------------------------------------------------
    定义一个上面结构体的指针类型,后面要用到这个东东
  -------------------------------------------------------------------------------}  
  PMyRec=^TMyRec;
 
  TForm4 = class(TForm)
    vsttree: TVirtualStringTree;
    il1: TImageList;
    advpmn1: TAdvPopupMenu;
    N1: TMenuItem;
    Button2: 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 vsttreeGetImageIndex(Sender: TBaseVirtualTree; Node: PVirtualNode;
      Kind: TVTImageKind; Column: TColumnIndex; var Ghosted: Boolean;
      var ImageIndex: Integer);
    procedure N1Click(Sender: TObject);
    procedure vsttreeFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
    procedure vsttreeGetPopupMenu(Sender: TBaseVirtualTree; Node: PVirtualNode;
      Column: TColumnIndex; const P: TPoint; var AskParent: Boolean;
      var PopupMenu: TPopupMenu);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }

  public
    { Public declarations }
  end;

var
  Form4: TForm4;
   RootNode,RootNode2,ChileNode:PVirtualNode;
implementation

{$R *.dfm}

procedure TForm4.Button2Click(Sender: TObject);
var
  CurrentNode,TempNode:PVirtualNode;
  Data:PMyRec;
  Checked:string;
begin
  {示例取点击结点的数据。
  注意:TreeOptions.SelectionOptions必须包含toRightClickSelect
  }
  //取得当前选中结点
  CurrentNode:=vsttree.GetFirst;

  while Assigned(CurrentNode) do
  begin
    Data:= vsttree.GetNodeData(CurrentNode);
    if CurrentNode.CheckState=csCheckedNormal then
    begin
      Checked:='是';
    end
    else
    begin
      Checked:='否';
    end;
    ShowMessage('当前结点:'+#13
      +'Id='+Data^.Id+#13
      +'Text='+Data^.Text+#13
      +'是否选中='+Checked+#13
      +'根总数='+inttostr(vsttree.RootNodeCount)+#13
      +'子总数='+inttostr(vsttree.ChildCount[RootNode]));

      //显示子节点数据
        if CurrentNode.ChildCount>0 then
        begin
        TempNode:=CurrentNode;
        CurrentNode:=CurrentNode.FirstChild;
        while Assigned(CurrentNode) do
        begin
          Data:= vsttree.GetNodeData(CurrentNode);
          if CurrentNode.CheckState=csCheckedNormal then
             begin
             Checked:='是';
          end
          else
          begin
            Checked:='否';
          end;
          ShowMessage('当前结点:'+#13
            +'Id='+Data^.Id+#13
            +'Text='+Data^.Text+#13
            +'是否选中='+Checked+#13
            +'根总数='+inttostr(vsttree.RootNodeCount)+#13
            +'子总数='+inttostr(vsttree.ChildCount[RootNode]));
          CurrentNode:=CurrentNode.NextSibling;
           end;
    CurrentNode:=TempNode;
    end;




    CurrentNode:=CurrentNode.NextSibling;
  end;




end;

procedure TForm4.FormCreate(Sender: TObject);
var

  Data:PMyRec;
begin
  //指定结点数据大小
  vsttree.NodeDataSize:=SizeOf(TMyRec);
  //指定树里要用的图片列表
  vsttree.Images:=il1;
 
  //添加根节点
  RootNode:= vsttree.AddChild(nil);
  Data:=vsttree.GetNodeData(RootNode);
  Data^.Text:='根结点';
  Data^.Id:='RootID';
  Data^.ImageIndex:=0;
  Data^.CheckType:=ctTriStateCheckBox;
  Data^.CheckState:=csUncheckedNormal;

      //再添加根节点
  RootNode2:= vsttree.AddChild(nil);
  Data:=vsttree.GetNodeData(RootNode2);
  Data^.Text:='根结点2';
  Data^.Id:='RootID2';
  Data^.ImageIndex:=0;
  Data^.CheckType:=ctTriStateCheckBox;
  Data^.CheckState:=csUncheckedNormal;

  //添加一个子结点
  ChileNode:=vsttree.AddChild(RootNode);
  Data:=vsttree.GetNodeData(ChileNode);
  Data^.Text:='子结点1';
  Data^.Id:='ChildId1';
  Data^.ImageIndex:=1;
  Data^.CheckType:=ctTriStateCheckBox;
  Data^.CheckState:=csUncheckedNormal;

  //再添加一个子结点
  ChileNode:=vsttree.AddChild(RootNode);
  Data:=vsttree.GetNodeData(ChileNode);
  Data^.Text:='子结点2';
  Data^.Id:='ChildId2';
  Data^.ImageIndex:=1;
  Data^.CheckType:=ctTriStateCheckBox;
  Data^.CheckState:=csUncheckedNormal;

   //再添加一个子结点
  ChileNode:=vsttree.AddChild(RootNode);
  Data:=vsttree.GetNodeData(ChileNode);
  Data^.Text:='子结点3';
  Data^.Id:='ChildId3';
  Data^.ImageIndex:=1;
  Data^.CheckType:=ctTriStateCheckBox;
  Data^.CheckState:=csUncheckedNormal;



  //添加一个子结点
  ChileNode:=vsttree.AddChild(RootNode2);
  Data:=vsttree.GetNodeData(ChileNode);
  Data^.Text:='子结点4';
  Data^.Id:='ChildId4';
  Data^.ImageIndex:=1;
  Data^.CheckType:=ctTriStateCheckBox;
  Data^.CheckState:=csUncheckedNormal;

  //再添加一个子结点
  ChileNode:=vsttree.AddChild(RootNode2);
  Data:=vsttree.GetNodeData(ChileNode);
  Data^.Text:='子结点5';
  Data^.Id:='ChildId5';
  Data^.ImageIndex:=1;
  Data^.CheckType:=ctTriStateCheckBox;
  Data^.CheckState:=csUncheckedNormal;

   //再添加一个子结点
  ChileNode:=vsttree.AddChild(RootNode2);
  Data:=vsttree.GetNodeData(ChileNode);
  Data^.Text:='子结点6';
  Data^.Id:='ChildId6';
  Data^.ImageIndex:=1;
  Data^.CheckType:=ctTriStateCheckBox;
  Data^.CheckState:=csUncheckedNormal;

  //默认展开一级结点,这句话要写在初始的最后
  vsttree.Expanded[RootNode]:=True;
  vsttree.Expanded[RootNode2]:=True;
  {
     注:在这里把数据添加进树后,树里并不能显示出结点
     要在几个事件里写代码才行:
     OnInitNode:在这个事件里初始化结点,如指定复选框以及状态
     OnGetText:在这个事件里指定结点的显示文本
     OnGetPopupMenu:在这个事件里指定下拉菜单
     OnGetImageIndex:指定结点的图片索引
     OnFreeNode:释放结点时您要做的一些释放动作

     通过这些事件,才能把结点的显示情况描述清楚。而您的
     结构体是用来持有您每个结点的数据的。
  }
end;
//弹出菜单的点击事件
procedure TForm4.N1Click(Sender: TObject);
var
  CurrentNode:PVirtualNode;
  Data:PMyRec;
  Checked:string;
begin
  {示例取点击结点的数据。
  注意:TreeOptions.SelectionOptions必须包含toRightClickSelect
  }
  //取得当前选中结点
  CurrentNode:=vsttree.FocusedNode;
  if Assigned(CurrentNode) then
  begin
    Data:= vsttree.GetNodeData(CurrentNode);
    if CurrentNode.CheckState=csCheckedNormal then
    begin
      Checked:='是';
    end
    else
    begin
      Checked:='否';
    end;
    ShowMessage('当前结点:'+#13
      +'Id='+Data^.Id+#13
      +'Text='+Data^.Text+#13
      +'是否选中='+Checked);
  end;
end;

procedure TForm4.vsttreeFreeNode(Sender: TBaseVirtualTree; Node: PVirtualNode);
var
  Data:PMyRec;
begin
  Data:=Sender.GetNodeData(Node);
  Finalize(Data^);
end;

procedure TForm4.vsttreeGetImageIndex(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Kind: TVTImageKind; Column: TColumnIndex;
  var Ghosted: Boolean; var ImageIndex: Integer);
var
  Data:PMyRec;
begin
  Data:=Sender.GetNodeData(Node);
  ImageIndex:=Data^.ImageIndex;
end;

procedure TForm4.vsttreeGetPopupMenu(Sender: TBaseVirtualTree;
  Node: PVirtualNode; Column: TColumnIndex; const P: TPoint;
  var AskParent: Boolean; var PopupMenu: TPopupMenu);
begin
  if Assigned(Node) then
  begin
    PopupMenu:=advpmn1;
  end
  else
  begin
    PopupMenu:=nil;
  end;    
end;

procedure TForm4.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 TForm4.vsttreeInitNode(Sender: TBaseVirtualTree; ParentNode,
  Node: PVirtualNode; var InitialStates: TVirtualNodeInitStates);
var
  Data:PMyRec;
begin
  Data:=Sender.GetNodeData(Node);
  Node.CheckType:=Data^.CheckType;
  Node.CheckState:=Data^.CheckState;
end;

end.
原创粉丝点击