delphi自动调整combobox下拉列表宽度(PostMessage CB_SETDROPPEDWIDTH)

在combobox所在的窗口的Formshow事件里调用即可

[delphi] view plain copy

  1. procedure SetComboBoxListWidth( AComboBox: TComboBox );
  2. var
  3. i: Integer;
  4. nMaxLen, nMinWidth: integer;
  5. nFontWidth: Integer;
  6. nCboLeft: integer;
  7. ctlCustom: TControl;
  8. begin
  9. nCboLeft := AComboBox.Left;
  10. ctlCustom := AComboBox;
  11. with AComboBox do
  12. begin
  13. nFontWidth := Round( Abs(Font.Height / 2 ) );
  14. nMaxLen:= 0;
  15. for i:=0 to Items.Count-1 do
  16. begin
  17. if length(Items[i])* nFontWidth > nMaxLen then
  18. nMaxlen:= length(Items[i])* nFontWidth+5;
  19. end;
  20. if Items.Count > DropDownCount then
  21. nMaxLen := nMaxLen + 20;
  22. if nMaxLen > Width then
  23. begin
  24. if Items.Count>DropDownCount then
  25. begin
  26. SendMessage( Handle, CB_SETHORIZONTALEXTENT, nMaxLen+5, 0 );
  27. {解决分辨率小导致的ComboboxList的宽度超出屏幕}
  28. //while 部分是用来取出combobox控件相对与窗体的横坐标
  29. while not (ctlCustom.Parent is TForm) do
  30. begin
  31. nCboLeft := nCboLeft + ctlCustom.Parent.Left;
  32. ctlCustom := ctlCustom.Parent;
  33. end;
  34. nMinWidth := Min(400, nMaxLen);                      // 使用不大于nMaxLen的数做比较
  35. if (nCboLeft + nMinWidth) > Screen.Width-25 then     // 不超出屏幕,并保留窗口滚动条宽度,约25
  36. nMinWidth := Screen.Width-25-nCboLeft;
  37. nMinWidth := Max(nMinWidth, Width);                  // 不小于控件自身宽度
  38. PostMessage(Handle, CB_SETDROPPEDWIDTH, nMinWidth, 0);
  39. end
  40. else
  41. PostMessage(Handle, CB_SETDROPPEDWIDTH, nMaxLen , 0);
  42. ShowHint := True;
  43. end
  44. else
  45. begin
  46. SendMessage( Handle, CB_SETHORIZONTALEXTENT, 0, 0 );
  47. PostMessage(Handle, CB_SETDROPPEDWIDTH, Width , 0);
  48. end;
  49. end;
  50. end;

http://blog.csdn.net/youthon/article/details/8179348

时间: 2024-08-03 20:53:00

delphi自动调整combobox下拉列表宽度(PostMessage CB_SETDROPPEDWIDTH)的相关文章

发掘ListBox的潜力(一):自动调整横向滚动条宽度

<自绘ListBox的两种效果>一文帖出之后,从反馈信息来看,大家对这种小技巧还是很认同.接下来我将继续围绕ListBox写一系列的文章,进一步发掘ListBox的潜力,其中包括:自动调整横向滚动条宽度.即时提示(Tips).拖放插入点提示等,并在最后制作一个在滚动区内的ListBox组. 自动调整横向滚动条宽度 网上可以找到很多让Listbox产生横向滚动条的文章,其中的方法基本一样,就是定义一个函数,遍历Items取得最大的TextWidth值,然后发Listbox发消息LB_SETHOR

Excel随着表格内容自动调整高度或宽度

Excel随着表格内容自动调整高度或宽度 在使用excel的时候,有时我们需要根据输入内容的多少调整表格的高度和宽度,如何让EXCEL自动调整呢.因本人目前实用的Office为2013版本,因此暂时先介绍此版本实现方法,其他2003版EXCEL.WPS版EXCEL的设置也大致相同,有时间再补上.2013版本实现方法如写下: 1.实现自动调整宽度.选中全部表格(Ctrl+A),如图选择开始--格式--自动调整列宽即可.另附上设置前后的效果图. 2.实现自动调整高度.分两步设置,首先选中全部表格(C

EasyUI combobox下拉列表实现搜索过滤(模糊匹配)

项目中的某个下拉列表长达200多个项,这么巨大的数量一个一个找眼镜都得看花,于是就得整了个搜索功能.看网上别人帖子有只能前缀匹配的方案,但只能前缀匹配的话用起来也不是很方便.于是就记录一下模糊匹配的方案. 实现效果: 这里使用的是combobox组合框,对于combobox的创建可以使用<input>输入框,也可以使用<select>下拉选.我使用的是<select>: HTML代码 <label>关联课程</label> <select

Extjs 3实现Combobox下拉列表的拼音过滤

下拉列表是我们常用的表单元素,能够通过选项的方式代替手动输入,提高输入效率和准确率.但有时侯,如果下拉列表中选项过多,在选择中就会造成不便,降低输入效率. 比如12306火车票订票系统中,发站和到站框中,从下拉列表中选择就非常困难.在日常使用中经常使用输入文字拼音首字母(简拼.音序)的方式进行可选项的过滤,现在我们尝试在Extjs3中使用这种方式,Extjs其他版本可参考. 要通过汉字得到对应的拼音,方式是多种多样的.第一种是在数据库中加字段保存可选项的简拼,这种方式需要操作人员手动维护可选项的

Delphi之ComboBox

手动添加数据到ComboBox jcsqueryResult.First; while not jcsdqryvehiclebydriverid.Eof do //从TJsonClientDataSet中取出数据,存到ComboBox中 begin v := Vehicle.Create();//这个类有vehicleno和id2个属性. v.vehicleno :=jcsqueryResult.FieldByName('vehicleno').AsString; v.id := jcsquer

下拉框设置下拉列表宽度

panelWidth: 100,

转:DataGridView列的宽度、行的高度自动调整

注意:DataGridView控件是从.NET Framework 2.0版本开始追加的. 介绍一下DataGridView列的宽度和行的高度,根据单元格或Header的内容(一般是内容全部被表示)自动调整的方法. 内容变更时自动调整 列的宽度自动调整 DataGridView列的宽度自动调整,可以使用DataGridView.AutoSizeColumnsMode属性实现. 下面的代码就是列的宽度根据Header和所有单元格的内容自动调整的. [C#] //根据Header和所有单元格的内容自

ExtJs_关于combobox的那些分页二三事

近来项目需求,在新增或查询的时候有一个标签对象需要使用下拉菜单,但是数据可多可少的.少了的时候看起来还不错,紧凑一点.但是一旦躲起来看着就那么别扭了.人说百度不可靠,我发现这话真没错,想着做个分页来解决这玩意儿,没想到百度出来的结果催人泪下啊.好多不负责任的博主什么的直接复制粘贴给链接就结束了,弄得我一愣一愣的.靠天靠地不如靠自己这真是老祖宗的至理名言.为了方便以后检阅自己的成果,记录一下. 先是JS内  var shop_store=new Ext.data.Store(); 1 shop_s

GridControl列自动匹配宽度

//自动调整所有字段宽度this.gridView1.BestFitColumns(); //调整某列字段宽度this.gridView1.Columns[n].BestFit(); 大多是网上零散找到的,小部分是自己使用的时候自己遇到的. XtraGrid的关键类就是:GridControl和GridView.GridControl本身不显示数据,数据都是显示在GridView/CardView/XXXXView中.GridControl是各种View的容器.所以要控制显示,要从GridVie