Jak dopasować szerokość rozwijanej listy ComboBox do szerokości tekstu

bacterius

TForm1 = class(TForm)
ComoBox: TComboBox;
...

w zdarzeniu OnDropDown dopisujemy

procedure TForm1.ComboBoxDropDown(Sender: TObject);
var
  cbx : TComboBox;
  i, w, t: Integer;

  bmp : TBitmap;
begin
  cbx := TComboBox(Sender);

  //potrzebujemy tymczasowego obiektu TCanvas (bo nie można użyć ComboBox.Canvas), więc tworzymy bitmapę
  bmp := TBitmap.Create;
  //przypisujemy czcionkę z kontrolki combobox
  bmp.Canvas.Font := cbx.Font;

  w := 0;
  for i := 0 to cbx.Items.Count - 1 do
  begin
    t := bmp.Canvas.TextWidth(cbx.Items[i]);
    if t > w then w := t;
  end;

  bmp.Free();

  //dodajemy szerokość ramki i odstęp tekstu od ramki
  Inc(w, 1 + 2 + 2 + 1); //1 piksel na ramkę + 2 piksele na odstęp, razy 2 bo z lewej i prawej strony

  //jeśli pozycji na liście jest więcej niż się zmieści w okienku...
  if cbx.Items.Count > cbx.DropDownCount then
    Inc(w, GetSystemMetrics(SM_CXVSCROLL)); //...to rozszerzamy o szerokość pionowego suwaka

  SendMessage(cbx.Handle, CB_SETDROPPEDWIDTH, w, 0);
end;

Zobacz też:

FAQ

1 komentarz

Troche inaczej, ale również skutecznie
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
begin
for i:=0 to ComboBox1.items.Count do
begin
if (length(ComboBox1.Items.Strings[i])*10) > ComboBox1.Width then
begin
ComboBox1.Width:=length(ComboBox1.Items.Strings[i])*7;
ComboBox1.ItemIndex:=i;
end;
end;
end;