Универсальный DrawItem для нескольких ListBox/ComboBox

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Универсальный DrawItem для нескольких ListBox/ComboBox

Сообщение Nik » 12.09.2010 14:38:34

В программе есть куча ListBox/ComboBox, которые используют DrawItem с практически одинаковым кодом. В целях небольшого сокращения кода задался целью использовать для отрисовки всех схожих контролов одну универсальную функцию примерно такого вида:

Код: Выделить всё
procedure TMainForm.BillBoxDraw(Sender: TObject; Index: Integer; ARect: TRect; State: TOwnerDrawState);
begin
...
with (Sender as TListBox) do
  begin
   txt:=Items[Index];
   Canvas.FillRect(ARect);
   ...
end;
...
end;


Вызывать её, соответственно, предполагал примерно так:

Код: Выделить всё
procedure TMainForm.BillBoxDrawItem(Control: TWinControl; Index: Integer; ARect: TRect; State: TOwnerDrawState);
begin
BillBoxDraw(BillBox, Index, ARect, State);
end;


Код, вроде как, вполне логичный и компилируется без проблем. Но при запуске программы открытие ComboBox вызывает ошибку: RunError (219) (отладчик останавливается на строке with (Sender as TListBox) do). Что за ошибка - не понятно, из-за чего вылазит - тоже.
Кто-нибудь из вас, уважаемые коллеги, сталкивался с такой проблемой? Может есть другие пути использования универсальной DrawItem?
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Универсальный DrawItem для нескольких ListBox/ComboBox

Сообщение Mr.Smart » 12.09.2010 15:17:56

Так ведь TComboBox не наследуется от TListBox и являются "дальними" родственниками с общим предком TWinControl. Отсюда и траблы.
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Универсальный DrawItem для нескольких ListBox/ComboBox

Сообщение Nik » 12.09.2010 15:23:53

Функции для ComboBox и ListBox - разные. Код, который приведён в первом посте, используется только для ListBox, но всё равно вызывает ошибку.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров

Re: Универсальный DrawItem для нескольких ListBox/ComboBox

Сообщение Odyssey » 12.09.2010 15:51:06

219 Invalid typecast
Оператор as
Оператор as приводит объект к указанному типу или генерирует ошибку, если приведение невозможно. Поэтому:

1) Если нужно перебрать несколько типов без ошибок, и выполнить для каждого типа свой код -- тип нужно проверять, например так:
Код: Выделить всё
if Sender is TListBox then
  with TListBox(Sender) do
В текущем коде такой проверки типа не видно.

2) Если подразумевается, что в выбранном куске кода Sender по-любому должен быть TListBox'ом, иначе это ошибка, можно оставить as. Но тогда получается что в этот код по ошибке передаётся ссылка на другой компонент. Чтобы понять на какой, можно прямо перед приведением типа вывести в консоль или лог Sender.ClassName, и если это наследник от Component, то посмотреть ещё и TComponent(Sender).Name. А потом искать каким путём этот объект передаётся в ваш код, и что нужно исправить, чтобы вместо него передавался TListBox.
Odyssey
энтузиаст
 
Сообщения: 580
Зарегистрирован: 29.11.2007 17:32:24

Re: Универсальный DrawItem для нескольких ListBox/ComboBox

Сообщение Vadim » 12.09.2010 15:53:49

Nik
Ошибка 219 - это классическая ошибка приведения типов. В связке с классом означает невозможность применения каких-то методов приводимого типа к тому из которого осуществляется привод.
Вы лучше вместо TObject поставьте TWinControl и напишите потом, что будет. :)
Vadim
долгожитель
 
Сообщения: 4112
Зарегистрирован: 05.10.2006 08:52:59
Откуда: Красноярск

Re: Универсальный DrawItem для нескольких ListBox/ComboBox

Сообщение Mr.Smart » 12.09.2010 16:13:27

Nik писал(а):Функции для ComboBox и ListBox - разные. Код, который приведён в первом посте, используется только для ListBox, но всё равно вызывает ошибку.


Вы же сами написали в первом посте :wink:
Nik писал(а):...
Но при запуске программы открытие ComboBox вызывает ошибку: RunError (219) (отладчик останавливается на строке with (Sender as TListBox) do). Что за ошибка - не понятно, из-за чего вылазит - тоже.
...
Mr.Smart
долгожитель
 
Сообщения: 1796
Зарегистрирован: 29.03.2008 01:01:11
Откуда: из леса!

Re: Универсальный DrawItem для нескольких ListBox/ComboBox

Сообщение Nik » 12.09.2010 17:18:11

В после напутал немного, извиняюсь :) Проблема решилась пересборкой Lazarus из последнего ночного билда.
Аватара пользователя
Nik
энтузиаст
 
Сообщения: 573
Зарегистрирован: 04.02.2006 00:08:09
Откуда: Киров


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

Рейтинг@Mail.ru