在给ComboBox增加了水平的滚动条之后,当Items.Cout很小时(比如2),出现了问题:
由于下拉框列表的高度并没有包含水平滚动条的高度,所以造成了列表中内容显示的不完整性,
请问该如何增加下拉列表的高度呢?在跟踪之后,发现Delphi中是如下实现的:
  SetWindowPos(Handle, 0, 0, 0, Width, ItemHeight * ItemCount +
      Height + 2, SWP_NOMOVE + SWP_NOZORDER + SWP_NOACTIVATE + SWP_NOREDRAW +
      SWP_HIDEWINDOW);可是,决定高度的参数却只可以减小,不可以增大,即时给高度一个较大的值,而实际显示的
结果仍然是ItemHeight * ItemCount + Height + 3…………恳请各位鼎立相助,不胜感激!!!

解决方案 »

  1.   

    在combobox的最后一行加一个空行:
    combobox1.items.add('');
      

  2.   

    to: syl790这样是可以,而且实现滚动条的ComboBox也是通过继承TComboBox来实现的,这样做改动不大,但问题是
    这样做有可能会影响到程序中其他的地方,多出了一行,会牵扯到实际的应用,从而造成不必要的问题
    并出现不可预期的bug谢谢你的支持
      

  3.   

    在closeup事件中加入以下代码试试:
    if combobox1.itemindex = combobox1.items.count - 1 then
      combobox1.itemindex := combobox1.item.count - 2;
    不知道这样可不可以。
      

  4.   

    手动设置Combobox的长度
    使用SETDROPPEDWIDTH
    Eg
    procedrue Tform1.FormShow(Sender : Tobjects)
    begin
      comboBox1.Perform(CB_SETDROPPEDWIDTH, 100, 0);
    end;
    其中的100你可以用Combobox下拉中最大长度代替
      

  5.   

    使用SETDROPPEDWIDTH时有一个bug,那就是如果控件的位置在最左边时,那么下拉列表的会被遮住.
      

  6.   

    谢谢楼上的两位,从侧面替我考虑问题,由于现时所限,目前只能考虑通过增加下拉列表的高度来
    解决问题.另外,为什么通过SetWindowPos来重置他的高度(大于标准高度)时会无效呢?难道有最大值
    的限制吗?如果有,是delphi还是window改变的呢?
      

  7.   

    试试这个
    procedure TForm1.ComboBox1DropDown(Sender: TObject);
    begin
         // self.DropDownWidth(sender);
         SendMessage(ComboBox1.handle,CB_SETITEMHEIGHT, 0, 30);
    //30为Items之间的间隔
         end;