Как добавить новое событие в компонент?
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.
Комментарии