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