在使用listbox时,当item数多于可显示的行数时,listbox可以立即添加一个垂直滚动条,当item数少于可显示的行数时,垂直滚动条则立即消失。我想看看他是怎么实现的,代码应该在哪里找呢?如果我想让它也能自动地实现一个类似的水平滚动条的话该怎么做呢?

解决方案 »

  1.   

    你想看源代码:按下Ctrl,同时点击代码编辑器中的TListBox这个词
                 就会转到源代码出了/你想加水平滚动条:有没有Delphi开发人员指南,组件制作那个章中有这个例子
      

  2.   

    Delphi 的 TListBox元件自动实现了垂直的滚动条,当ListBox不能显示全部的菜单(Item)时,这个垂直的滚动条就会出现。然而,当菜单的宽度比ListBox宽时水平的滚动条却不会出现。以下的程序就是处理这个问题的。在你的Form的OnCreate事件中添加以下代码:
    procedure TForm1.FormCreate(Sender: TObject);
    var
      i, MaxWidth: integer;
    begin
      MaxWidth := 0;
      for i := 0 to ListBox1.Items.Count - 1 do
      if MaxWidth < ListBox1.Canvas.TextWidth(ListBox1.Items.Strings[i]) then
        MaxWidth := ListBox1.Canvas.TextWidth(ListBox1.Items.Strings[i]);
      SendMessage(ListBox1.Handle, LB_SETHORIZONTALEXTENT, MaxWidth+2, 0);
    end;
    以上的代码首先得到ListBox中最长Item的长度,然后用LB_SETHORIZONTALEXTENT消息设置ListBox的水平滚动的宽度,宽度加2是为了给右面留2个点的边。
      

  3.   

    还有用STRINGGRID,把边去掉简直和LISTBOX一模一样。
    至少我经常这么干,试试看 
      

  4.   

    按住Ctrl,单击任意函数名,过程名,单元名,就会显示相应解释
      

  5.   

    to  princesd(中原) :首先谢谢您的解答,但是当item数少于可显示的行数时,垂直滚动条不会立即消失,总要等到下一个事件发生后,才会变。