Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо