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ż:
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;