![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
procedure of object [D6, XP]
webpauk © (2008-04-03 15:49:00)Есть несколько ComboBox на нескольких формах. У всех одинаково определено событие OnDrawItem.
Подскажите как правильно 1 раз определить процедуру, чтобы у всех ComboBox при создании формы записать:Combo.OnDrawItem:=MyDrawItem
webpauk (2008-04-04 11:54:00) [1]
> {RASkov} © (03.04.08 18:34) [14]
спасибо
clickmaker (2008-04-04 09:46:00) [2]а вообще да, там self просто будет типа "класс"
clickmaker (2008-04-04 09:34:00) [3]
> [14] {RASkov} © (03.04.08 18:34)
проверял?
{RASkov} (2008-04-03 18:34:00) [4]> [13] clickmaker © (03.04.08 18:13)
TMyClass = class
class procedure DrawItem(Sender: TObject......);
end;
ну и:
MyCombo.OnDrawItem := TMyClass.DrawItem;
без создания экземпляра TMyClass
clickmaker (2008-04-03 18:13:00) [5]
> class method и не создавать экземпляр класса
?
guav (2008-04-03 18:09:00) [6]> [11] Сергей М. © (03.04.08 17:56)
> В этих условиях очевидно простейшее решение - описать/реализовать
> любой класс с этим обработчиком, создать экз-р этого класса
> в секции иниц-ции любого юнита и записать ссылку на этот
> экз-р в глобальную переменную.
Если так, есть решение ещё проще - class method и не создавать экземпляр класса
Сергей М. (2008-04-03 17:56:00) [7]Тут, похоже, засада в другом - автор желает, чтобы метод-обработчик был единый, но при этом никак не оговаривает время жизни объекта, чей метод-обработчик должен фигурировать в качестве единого централизованого обработчика для любых комбобоксов.
В этих условиях очевидно простейшее решение - описать/реализовать любой класс с этим обработчиком, создать экз-р этого класса в секции иниц-ции любого юнита и записать ссылку на этот экз-р в глобальную переменную.
Тогда при создании любой формы:
MyCombo.OnDrawItem := MyGlobalObject.MyDrawItem
Apollon (2008-04-03 17:50:00) [8]
> {RASkov} © (03.04.08 17:47) [8]
ну значит сделать ее методом класса... долго ли :)
MBo (2008-04-03 17:47:00) [9]>Apollon
А где учтено " of object" ?
{RASkov} (2008-04-03 17:47:00) [10]> [7] Apollon © (03.04.08 17:45)
Не верно. Не откомпилится....) метод класса нужен, а не просто процедура...
Apollon (2008-04-03 17:45:00) [11]
procedure MyDrawItem(Control: TWinControl; Index: Integer Rect: TRect; State: TOwnerDrawState);
begin
<код отрисовки>
end;
в каждой форме при создании
Combo.OnDrawItem := MyDrawItem;
Reindeer Moss Eater (2008-04-03 17:42:00) [12]Встаем на поле OnDrawIntem любого из комбо.
Рисуем в нем имя OnAnyComboDrawItem и жмем enter
(Либо вообще без ввода имени даблкликом.)
Для остальных комбо просто выбираем созданный обработчик из списка.
Ega23 (2008-04-03 16:18:00) [13]
> а вот как описать процедуру?
А чего непонятно-то? Как процедуру вместо метода использовать?
webpauk (2008-04-03 16:18:00) [14]вот код, который мне нужен.
как его запихнуть в:
type TDrawItemEvent = procedure(Control: TWinControl; Index: Integer Rect: TRect; State: TOwnerDrawState) of object;
with TComboBox(Control).Canvas do
begin
Font.Color:=clBlack;
Brush.Color:=cColors[Index mod 2 = 1];
if odSelected in state then
begin
Font.Color:=clHighlightText;
Brush.Color:=clHighlight;
end;
FillRect(Rect);
TextOut(Rect.Left+5, Rect.Top, TComboBox(Control).Items[Index]);
end;
clickmaker (2008-04-03 16:16:00) [15]
> а вот как описать процедуру?
а в [1] что?
я уж не говорю о том, что можно даблкликом шаблон сгенерить
webpauk (2008-04-03 16:10:00) [16]
> Ega23 © (03.04.08 16:00) [1]
это и козе понятно.
а вот как описать процедуру?
Ega23 (2008-04-03 16:00:00) [17]
type TDrawItemEvent = procedure(Control: TWinControl; Index: Integer Rect: TRect; State: TOwnerDrawState) of object;