У меня есть простой потомок Delphi VCL TCombobox для особой демонстрации клиентов. В нем всего 2 функции (разделительные строки, многострочные элементы), которых я не нашел в готовом к использованию компоненте. Работает нормально, но я не могу контролировать размер выпадающей области / всплывающего меню ниже. Я сделал то, что нашел в гугле:
procedure TMyownCombobox.DropDown;
begin
inherited;
var iDropdownHeight:=360;
// does NOT work, as it affects the width, not the height of the flyout
// according to WinAPI documentation, there is no equivalent of CB_SETDROPPEDWIDTH for the height ("CB_SETDROPPEDHEIGHT")
SendMessage(Self.Handle, CB_SETDROPPEDWIDTH,Width,MakeLParam(iDropdownHeight,0));
end;
К сожалению, размер всегда составляет около 100 пикселей, независимо от того, сколько элементов. Настройка свойства DropdownCount не влияет. Рендеринг элементов работает отлично, но пользователям приходится много прокручивать. При рендеринге моих элементов есть процедура MeasureItem(), которую я реализовал сам, но я не смог найти ничего подобного для всплывающего меню.
Сообщение CB_SETDROPPEDWIDTH используется для установки ширины выпадающего списка:
Приложение отправляет сообщение
CB_SETDROPPEDWIDTH
, чтобы установить минимально допустимую ширину в пикселях списка поля со списком со стилемCBS_DROPDOWN
илиCBS_DROPDOWNLIST
.
Следовательно, на высоту это не повлияет.
Чтобы установить высоту, вы используете сообщение CB_SETMINVISIBLE:
Устанавливает минимальное количество видимых элементов в раскрывающемся списке поля со списком.
Например,
procedure TForm1.FormCreate(Sender: TObject);
begin
SendMessage(ComboBox1.Handle, CB_SETDROPPEDWIDTH, 200, 0);
SendMessage(ComboBox1.Handle, CB_SETMINVISIBLE, 50, 0);
end;
Обратите внимание, что единицей ширины являются пиксели, а единицей высоты — элементы.
Однако VCL уже предоставляет вам интерфейс для этих сообщений в своих свойствах DropDownWidth
и DropDownCount
:
procedure TForm1.FormCreate(Sender: TObject);
begin
ComboBox1.DropDownWidth := 200;
ComboBox1.DropDownCount := 50;
end;
Таким образом, вам не нужно отправлять какие-либо сообщения в явном виде.
Если это не работает для вас в вашем конкретном приложении, то в этом приложении происходят какие-то странные вещи, которые мы не можем видеть.
Одной из очень распространенных причин сбоев в работе графического интерфейса VCL является то, что программист использует стили (или темы) VCL, чтобы придать приложению нестандартный вид.