怎样判断treeview当前节点为treeview显示出来的第一个节点和最后一个节点?

http://www.photoshopsky.net/it/view-42454-1.html

楼主d_fang()

问题点数:20、回复次数:18


1 楼OopsWare(Oops!)回复于 2000-12-31 02:10:00 得分 0

TTreeView.Selected为当前选中节点。   
  TTreeView.Items[0]为第一个节点   
  TTreeView.Items[TTreeView.Items.Count-1]为最后一个节点   
    
 


2 楼d_fang()回复于 2000-12-31 12:54:00 得分 0

我说的是能够看见的节点,如果treeview滚动了,itmes[0]就不是能够看见的节点的第一个了


3 楼OopsWare(Oops!)回复于 2001-01-01 13:00:00 得分 0

TTreeView.GetNodeAt(x,   y);   
  按坐标位置获得节点!


4 楼Kingron(单身走我路……)回复于 2001-01-14 18:14:00 得分 0

treeview.TopItem.........


5 楼d_fang()回复于 2001-01-14 21:15:00 得分 0

我说的是可视的节点!


6 楼Kingron(单身走我路……)回复于 2001-01-14 21:24:00 得分 0

当然是的了,topitem是指在TreeView中显示出来的最上面的那个节点,符合你的要求,至于最下面的那个节点,可以计算出来的,我想不用我来写代码了吧?请看Delphi对TopItem的帮助:   
  Specifies   the   topmost   node   that   appears   in   the   tree   view.     
    
  property   TopItem:   TTreeNode;   
    
  Description   
    
  When   TopItem   is   changed,   the   tree   view   scrolls   vertically   so   that   the   specified   node   is   topmost   in   the   list   view.


7 楼d_fang()回复于 2001-01-14 21:48:00 得分 0

我说的是可视,就是看得见   的不是存在的!!!


8 楼Kingron(单身走我路……)回复于 2001-01-15 08:24:00 得分 0

你建立一个测试程序看看,在上面放一个treeview,并建立一个目录树,然后放一个button,输入一下代码,在运行看看!   
  procedure   TForm1.button1Click(sender:tobject);   
  begin   
    caption:=treeview1.TopItem.Text;   
  end;  


9 楼aceplus(飞狼0723)回复于 2001-01-15 09:13:00 得分 0

同意   OopsWare(Oops!):   
            items是TTreeNode型数组,不管是否可视! 


10 楼d_fang()回复于 2001-02-03 02:58:00 得分 0

可视的第一个节点就是topitem,kingron,sorry,随后给分!!   
  怎样判断可视的最后一个节点?


11 楼d_fang()回复于 2001-02-03 10:41:00 得分 0

可视的第一个节点就是topitem,kingron,sorry,随后给分!!   
  怎样判断可视的最后一个节点?  


12 楼d_fang()回复于 2001-02-08 21:31:00 得分 0

可视的第一个节点就是topitem,kingron,sorry,随后给分!!   
  怎样判断可视的最后一个节点?  


13 楼Java_SCU(Java)回复于 2001-02-08 23:10:00 得分 0

我看了看TTreeView的源代码,暂时这样解决吧(已调试通过):   
    
  function   GetNode(ItemId:   HTreeItem):   TTreeNode;   
  var   
      Item:   TTVItem;   
  begin   
      with   Item   do   
      begin   
          hItem   :=   ItemId;   
          mask   :=   TVIF_PARAM;   
      end;   
      if   TreeView_GetItem(Form1.TreeView1.Handle,   Item)   then   Result   :=   TTreeNode(Item.lParam)   
      else   Result   :=   nil;   
  end;   
    
  function   GetLastVisible():   TTreeNode;   
  var   
      hItem,   t:   HTreeItem;   
  begin   
      t:=   Form1.TreeView1.TopItem.ItemId;   
      while   t   <>   nil   do   
      begin   
          hItem:=   t;   
          t:=   HTreeItem(   SendMessage(Form1.TreeView1.Handle,   TVM_GETNEXTITEM,   
          TVGN_NEXTVISIBLE   ,   Longint(t))   );   
      end;   
          Result:=   GetNode(hItem)   
  end;   
    
  procedure   TForm1.Button2Click(Sender:   TObject);   
  var   
      Item:   TTreeNode;   
  begin   
      Item:=   GetLastVisible();   
      Label1.Caption:=   Item.Text;   
  end;


14 楼Java_SCU(Java)回复于 2001-02-08 23:20:00 得分 0

不好意思,我看错了,上面的代码还是有点问题,我改改就好,wait!


15 楼OopsWare(Oops!)回复于 2001-02-08 23:33:00 得分 0

未免小题大做了吧!


16 楼Java_SCU(Java)回复于 2001-02-08 23:48:00 得分 0

to   OopsWare(Oops!):   
    
      我也不想这么复杂呀,可是小弟我才疏学浅,希望OopsWare兄给我一条明路,让我脱离苦海,谢谢先!


17 楼Java_SCU(Java)回复于 2001-02-09 00:50:00 得分 20

这下差不多了:   
  uses   commctrl;   
    
  function   GetNode(ItemId:   HTreeItem):   TTreeNode;   
  var   
      Item:   TTVItem;   
  begin   
      with   Item   do   
      begin   
          hItem   :=   ItemId;   
          mask   :=   TVIF_PARAM;   
      end;   
      if   TreeView_GetItem(Form1.TreeView1.Handle,   Item)   then   Result   :=   TTreeNode(Item.lParam)   
      else   Result   :=   nil;   
  end;   
    
  function   GetLastVisible():   TTreeNode;   
  var   
      hItem,   t:   HTreeItem;   
      prc:   TRect;   
  begin   
      hItem:=   nil;   
      t:=   Form1.TreeView1.TopItem.ItemId;   
      while   true   do   
      begin   
          hItem:=   t;   
          t:=   TreeView_GetNextVisible(Form1.TreeView1.Handle,   t);   
          if   not   Bool(TreeView_GetItemRect(Form1.TreeView1.Handle,   t,   prc,   true))   then   
                break;   
          if   prc.Top   >   Form1.TreeView1.ClientRect.Bottom   then   
              break;   
      end;   
      if   hItem   <>   nil   then   
          Result:=   GetNode(hItem)   
      else   
          Result:=   nil;   
  end;   
    
  procedure   TForm1.Button2Click(Sender:   TObject);   
  var   
      Item:   TTreeNode;   
  begin   
      Item:=   GetLastVisible();   
      Label1.Caption:=   Item.Text;   
  end;  


18 楼Kingron(单身走我路……)回复于 2001-02-16 18:02:00 得分 0

爱,呵呵,几天没来,给人抢了分数了。

好的代码像粥一样,都是用时间熬出来的
原文地址:https://www.cnblogs.com/jijm123/p/13412722.html