Карта сайтаСсылкиКонтакты

Как добавить новое событие в компонент?

PDF Печать
Статьи

Вы можете связываться с компонентами через свойства, методы и события.

Есть маленький пример, как добавить событие к DBGrid, когда пользователь щелкает правой кнопкой мыши.


type 
TExtDBGrid = class(TDBGrid) 
private 
   FOnRightClick : TNotifyEvent; 
   procedure WMRButtonDown(var Message : TWMRButtonDown); 
             message WM_RBUTTONDOWN; 
protected 
public 
published 
   property OnRightClick: TNotifyEvent read FOnRightClick 
                                       write FOnRightClick; 
end; 


procedure TExtDBGrid.WMRButtonDown(var Message: TWMRButtonDown); 
begin 
  if Assigned(FOnRightClick) then FOnRightClick(Self); 
end; 

Это всегда та же самая процедура. Мы должны добавить свойство для события(в секции Published, когда событие должно появиться под событиями в Инспекторе Объектов, иначе - в секции Public) типа, который определяет параметры события. В вышеупомянутом примере мы использовали TNotifyEvent,


type TNotifyEvent = procedure (Sender: TObject) of object;

который объявлен в модуле Classes и поэтому всегда доступен.

Когда Вы хотите генерировать событие, Вы должны убедиться, что главная программа назначила процедуру (инструкция Assign), тогда Вы можете вызывать это, используя


FOnEventName(Self, Params...);

В этом примере мы хотим воздействовать на правую кнопку мыши - это работает с зарезервированным словом message и константой Windows для этого события: WM_RBUTTONDOWN.

Конечно, мы можем также определять заказные события с различными параметрами. Надо напомнить, что Вы можете использовать Var-параметры, так, чтобы компонент мог получать ввод из главной программы. Например:


type TMyEvent = procedure (Sender: TObject; 
                           VAR aAbort: boolean) of object; 

procedure TMyComp.AnyFunc; 
var abort: boolean; 
begin 
  while (...) do 
  begin 
    if Assigned(FMyEvent) then FMyEvent(Self, abort); 
    if abort then exit; 
  end; 
end; 

В этом случае событие генерируется каждый шаг через цикл и главная программа может прервать его, назначив aAbort в False

По материалам http://delphi.3000.com


 

Добавить комментарий


Защитный код
Обновить