Текущий архив: 2008.04.27;
Скачать: CL | DM;
Вниз
procedure of object Найти похожие ветки
← →
webpauk © (2008-04-03 15:49) [0]Есть несколько ComboBox на нескольких формах. У всех одинаково определено событие OnDrawItem.
Подскажите как правильно 1 раз определить процедуру, чтобы у всех ComboBox при создании формы записать:Combo.OnDrawItem:=MyDrawItem
← →
Ega23 © (2008-04-03 16:00) [1]
type TDrawItemEvent = procedure(Control: TWinControl; Index: Integer Rect: TRect; State: TOwnerDrawState) of object;
← →
webpauk © (2008-04-03 16:10) [2]
> Ega23 © (03.04.08 16:00) [1]
это и козе понятно.
а вот как описать процедуру?
← →
clickmaker © (2008-04-03 16:16) [3]
> а вот как описать процедуру?
а в [1] что?
я уж не говорю о том, что можно даблкликом шаблон сгенерить
← →
webpauk © (2008-04-03 16:18) [4]вот код, который мне нужен.
как его запихнуть в:
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;
← →
Ega23 © (2008-04-03 16:18) [5]
> а вот как описать процедуру?
А чего непонятно-то? Как процедуру вместо метода использовать?
← →
Reindeer Moss Eater © (2008-04-03 17:42) [6]Встаем на поле OnDrawIntem любого из комбо.
Рисуем в нем имя OnAnyComboDrawItem и жмем enter
(Либо вообще без ввода имени даблкликом.)
Для остальных комбо просто выбираем созданный обработчик из списка.
← →
Apollon © (2008-04-03 17:45) [7]
procedure MyDrawItem(Control: TWinControl; Index: Integer Rect: TRect; State: TOwnerDrawState);
begin
<код отрисовки>
end;
в каждой форме при создании
Combo.OnDrawItem := MyDrawItem;
← →
{RASkov} © (2008-04-03 17:47) [8]> [7] Apollon © (03.04.08 17:45)
Не верно. Не откомпилится....) метод класса нужен, а не просто процедура...
← →
MBo © (2008-04-03 17:47) [9]>Apollon
А где учтено " of object" ?
← →
Apollon © (2008-04-03 17:50) [10]
> {RASkov} © (03.04.08 17:47) [8]
ну значит сделать ее методом класса... долго ли :)
← →
Сергей М. © (2008-04-03 17:56) [11]Тут, похоже, засада в другом - автор желает, чтобы метод-обработчик был единый, но при этом никак не оговаривает время жизни объекта, чей метод-обработчик должен фигурировать в качестве единого централизованого обработчика для любых комбобоксов.
В этих условиях очевидно простейшее решение - описать/реализовать любой класс с этим обработчиком, создать экз-р этого класса в секции иниц-ции любого юнита и записать ссылку на этот экз-р в глобальную переменную.
Тогда при создании любой формы:
MyCombo.OnDrawItem := MyGlobalObject.MyDrawItem
← →
guav © (2008-04-03 18:09) [12]> [11] Сергей М. © (03.04.08 17:56)
> В этих условиях очевидно простейшее решение - описать/реализовать
> любой класс с этим обработчиком, создать экз-р этого класса
> в секции иниц-ции любого юнита и записать ссылку на этот
> экз-р в глобальную переменную.
Если так, есть решение ещё проще - class method и не создавать экземпляр класса
← →
clickmaker © (2008-04-03 18:13) [13]
> class method и не создавать экземпляр класса
?
← →
{RASkov} © (2008-04-03 18:34) [14]> [13] clickmaker © (03.04.08 18:13)
TMyClass = class
class procedure DrawItem(Sender: TObject......);
end;
ну и:
MyCombo.OnDrawItem := TMyClass.DrawItem;
без создания экземпляра TMyClass
← →
clickmaker © (2008-04-04 09:34) [15]
> [14] {RASkov} © (03.04.08 18:34)
проверял?
← →
clickmaker © (2008-04-04 09:46) [16]а вообще да, там self просто будет типа "класс"
← →
webpauk © (2008-04-04 11:54) [17]
> {RASkov} © (03.04.08 18:34) [14]
спасибо
Страницы: 1 вся ветка
Текущий архив: 2008.04.27;
Скачать: CL | DM;
Память: 0.5 MB
Время: 0.019 c