发信人: teleme() 
整理人: teleme(2000-12-05 19:09:57), 站内信件
 | 
 
 
简单收集一些tips:
 
 
 
 
 一. 如何初始化一个TreeView?
  
 
 弄一个窗口,放上一个TreeView和一个Button,分别取名为TV1和Btn1。如果需要 在每个节点前有个图,请在窗口上放上一个ImageList,取名为ImageList1,双击 它,加入六个图标。还要记得记得将TV1的Images属性改为ImageList1噢。双击按 钮Btn1,在里面填入以下代码,然后按F9运行,点击Btn1就可以看到效果了。
 
  
 procedure TForm1.Btn1Click(Sender: TObject);
 Const
    MyDocDir = 'C:\My Documents';
    PersonDir = '3hSoft';
 Var
    I : Word;
    SubNodeName : array [1..5] of ShortString;
    RootNode, SubNode : TTreeNode;
    P : PString;
 begin
    SubNodeName[1] := '便笺';
    SubNodeName[2] := '发件箱';
    SubNodeName[3] := '联系人';
    SubNodeName[4] := '任务';
    SubNodeName[5] := '日记';
    TV1.Items.Clear;
    TV1.Items.BeginUpdate;
    New(P);
    P^ := MyDocDir + '\' + PersonDir;
    RootNode := TV1.Items.AddObject(Nil, '个人文件夹', P);
    // 此 Node 的图标已对 Images 属性中取第 0 个了。
    For I := 1 to 5 do
       begin
       New(P);
       P^ := MyDocDir + '\' + PersonDir + '\' + SubNodeName[I];
       SubNode := TV1.Items.AddChildObject(RootNode, SubNodeName[I], P) ;
       // 如果不想使用图标的话请删除以下两行
       SubNode.ImageIndex := I;
       SubNode.SelectedIndex := I;
       end;
    TV1.Items.EndUpdate;
 end; 
 
 
 
 二.在TreeView中如何设置选中结点
  
 
   var 
     i:integer;		{i为设置的选中结点的索引值}
 
 
 begin
     if i>treeview1.items.count then
         treeview1.items[i].selected:=true;
 
 或
 treeview1.selected:=treeview1.items[i];
  
 三。设置TreeView结点的图形
  
 
   1.  设置TreeView的images属性为已存在的images对象
 
     treeview1.images:=imagelist1;
 
 
 2.  在加入结点后执行:
 
     var
         anode:TTreeNode;
 begein
     anode:=Treeview1.add(nil,'item1');
     anode.imageindex:=0;      {结点未选中时显示的图标}
     anode.selectedindex:=1;   {结点选中时显示的图标}
 end
 3.  如果结点图形在改变后未发生变化,可以执行:
     treeview1.refresh;
  
 
 四。如何批量处理TreeView结点
  
 
   使用TreeView的items属性的BeginUpdate和EndUpdate方法,例:
 
 
     TreeView1.items.BeginUpdate;
     for i:=0 to TreeView1.items.count-1 do
     begin
         //将每个结点的文字改成为小写字母
         TreeView1.items[i].text:=lowercase(TreeView1.items[i].text);
     end;
     TreeView1.items.EndUpdate;
  
 五。实现TreeView结点拖拽的实例
  
 
   下面的程序片段演示了如何实现拖拽treeview构件结点的例子
 
 {鼠标按下时执行的语句}
 procedure TForm1.Treeview1MouseDown(Sender: TObject;
   Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
 begin
 
 {判断左键按下并且鼠标点在一个结点上开始实现拖拽}
   if ( Button = mbLeft ) and
      ( htOnItem in Treeview1.GetHitTestInfoAt( X, Y ) ) then
   begin
     Treeview1.BeginDrag( False );
   end;
 end;
 
 {鼠标拖动执行语句}
 procedure TForm1.Treeview1DragOver( Sender, Source: TObject;
   X, Y: Integer; State: TDragState; var Accept: Boolean);
 var
   Node : TTreeNode;
 begin
   if Source = Treeview1 then
   begin
     Node := Treeview1.GetNodeAt( X, Y );    {取当前结点}
     if Node <> nil then    {当前结点不为空才能实现拖拽,accept:=true}
        Accept := true;
   end;
 end;
 
 {鼠标释放时执行的语句}
 procedure TForm1.Treeview1DragDrop( Sender, Source: TObject;
                                            X, Y : Integer );
 var
   TempNode : TTreeNode;
   AttachMode : TNodeAttachMode;
 begin
   if Treeview1.Selected = nil then
     Exit;
 
   AttachMode := naAddChild;    {设置结点移动模式,设移动结点为子结点}
  
   { 注意在这里存在一个bug,当移动结点时,如果目标结点没有子结点,}
   {       则加入的新的子结点会失败,所以先在当前目标结点的下面  }
   {       加入一个临时子结点,移动完毕后,再将临时结点删除      }
 
   Treeview1.Items.BeginUpdate;
   try
     TempNode := Treeview1.Items.AddChild( Treeview1.DropTarget,
                                         'Temp' );
     try
       { 移动选中的结点到目标结点 }
       Treeview1.Selected.MoveTo( Treeview1.DropTarget, AttachMode );
     finally
       TempNode.Free;    { 不要忘了释放临时结点 }
     end;
   finally
     Treeview1.Items.EndUpdate;
   end;
 end; 
 
  -- ※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.106.104.36]
  | 
 
 
 |