在combobox所在的窗口的Formshow事件里调用即可
procedure SetComboBoxListWidth( AComboBox: TComboBox );
var
i: Integer;
nMaxLen, nMinWidth: integer;
nFontWidth: Integer;
nCboLeft: integer;
ctlCustom: TControl;
begin
nCboLeft := AComboBox.Left;
ctlCustom := AComboBox;
with AComboBox do
begin
nFontWidth := Round( Abs(Font.Height / 2 ) );
nMaxLen:= 0;
for i:=0 to Items.Count-1 do
begin
if length(Items[i])* nFontWidth > nMaxLen then
nMaxlen:= length(Items[i])* nFontWidth+5;
end;
if Items.Count > DropDownCount then
nMaxLen := nMaxLen + 20;
if nMaxLen > Width then
begin
if Items.Count>DropDownCount then
begin
SendMessage( Handle, CB_SETHORIZONTALEXTENT, nMaxLen+5, 0 );
{解决分辨率小导致的ComboboxList的宽度超出屏幕}
//while 部分是用来取出combobox控件相对与窗体的横坐标
while not (ctlCustom.Parent is TForm) do
begin
nCboLeft := nCboLeft + ctlCustom.Parent.Left;
ctlCustom := ctlCustom.Parent;
end;
nMinWidth := Min(400, nMaxLen); // 使用不大于nMaxLen的数做比较
if (nCboLeft + nMinWidth) > Screen.Width-25 then // 不超出屏幕,并保留窗口滚动条宽度,约25
nMinWidth := Screen.Width-25-nCboLeft;
nMinWidth := Max(nMinWidth, Width); // 不小于控件自身宽度
PostMessage(Handle, CB_SETDROPPEDWIDTH, nMinWidth, 0);
end
else
PostMessage(Handle, CB_SETDROPPEDWIDTH, nMaxLen , 0);
ShowHint := True;
end
else
begin
SendMessage( Handle, CB_SETHORIZONTALEXTENT, 0, 0 );
PostMessage(Handle, CB_SETDROPPEDWIDTH, Width , 0);
end;
end;
end;