Jak dopasować szerokość rozwijanej listy ComboBox do szerokości tekstu
TForm1 = class(TForm)
ComoBox: TComboBox;
...
w zdarzeniu OnDropDown dopisujemy
Zobacz też:
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ż:
- Co_zrobić_gdy_chcę_umieścić_ikonę_obok_pozycji_ComboBox
- Jak_wczytać_z_pliku_tekstowego_tekst_z_dwóch_kolumn_do_2-óch_komponentów_ComboBox
- OwnerDraw
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;