| 
| 
 | Вопрос # 1 711/ вопрос решён / | 
 |  Здравствуйте!На форме есть ImageList и ComboBox. Нужно в зависимости от названий элементов заполнить ComboBox разными рисунками, вместе с подписями. Как это сделать? Спасибо.
 
|  |   Вопрос задал: Евгений Eklmn (статус: Посетитель)Вопрос отправлен: 20 июня 2008, 17:02
 Состояние вопроса: решён, ответов: 2.
 |  Ответ #1. Отвечает эксперт: Feniks Здравствуйте, Трофимов Евгений!Делается это при помощи стиля ownerdraw, который присутствует в TComboBox. Нас интересуют два свойства этого стиля:
 
 csOwnerDrawFixed - используется, если все битмапы имеют одинаковую высоту
 csOwnerDrawVariable - используется для битмапов с разной высотой
 После того как стиль будет установлен на один из вышеперечисленных, то можно воспользоваться событием onDrawItem. Это событие возникает каждый раз, когда приложению необходимо нарисовать пункт в выпадающем списке (combo box). Событие определяется следующим образом:
 
 
 procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index: Integer; 
Rect: TRect; State: TOwnerDrawState) Если выпадающему списку был присвоен стиль csOwnerDrawFixed, то всё, что надо сделать, это написать процедуру, которая будет рисовать битмап и текст в событии onDrawItem.
 
 Для выпадающего списка со стилем csOwnerDrawVariable необходимо пройти ещё одну дополнительную стадию. Заключается эта стадия в создании обработчика для события onMeasureItem. Это событие вызывается перед DrawItem, для того, чтобы Вы могли установить фактическую высоту для каждого элемента списка. Вот его определение:
 
 
 procedure TForm1.ComboBox1MeasureItem(Control: TWinControl; Index: Integer; 
var Height: Integer); 
 Пример:
 
 procedure TForm1.ComboBox1DrawItem(Control: TWinControl; Index:Integer;  Rect: TRect; State: TOwnerDrawState);
begin
(* Заполняем прямоугольник *)
combobox1.canvas.fillrect(rect);  
(* Рисуем сам битмап *)
imagelist1.Draw(comboBox1.Canvas,rect.left,rect.top,Index);
(* Пишем текст после картинки *)
combobox1.canvas.textout(rect.left+imagelist1.width+2,rect.top,
                         combobox1.items[index]);
end;Желаю удачи.
 
|  | Ответ отправил: Feniks (статус: Бакалавр)Время отправки: 20 июня 2008, 17:34
 Оценка за ответ: 5
 |  Ответ #2. Отвечает эксперт: Вадим К Здравствуйте, Трофимов Евгений!Можно всё сделать встроенными компонентами и не отрисовывать вручную. Используем компонент ComboBoxEx с вкладки Win32.
 Надо только их связать через свойство Images.
 Код добавления выглядит где то так
 
 procedure TFormX.Button2Click(Sender: TObject);
  var i:integer;
begin
  for i := 0 to 100 - 1 do
    ComboBoxEx1.ItemsEx.AddItem('test', i, -1, -1, 0, nil);
end;Параметры метода AddItem такие.- текст
 - номер картинки
 - номер картинки в случае, если элемент выделен
 - номер картинки для оверлея.
 - отступ. Правильно выбирая его, можно делать  что то в виде структуры каталогов
 - место для хранения указателя на допданные.
 
|  | Ответ отправил: Вадим К (статус: Академик)Время отправки: 20 июня 2008, 21:49
 Оценка за ответ: 5
 |  
 Мини-форум вопросаВсего сообщений: 0. 31 января 2011, 19:31: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5) Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |