Programowanie w języku Delphi » FAQ

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

  • 2007-07-06 19:04
  • 1 komentarz
  • 1096 odsłon
  • Oceń ten tekst jako pierwszy
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ż:

1 komentarz

Autre 2008-01-05 02:38

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;