|
Вопрос # 1 181/ вопрос открыт / |
|
Доброго времени суток, уважаемые эксперты! Как создавать собственные события в новом (созданным) компоненте?
 |
Вопрос задал: Leonardo (статус: Посетитель)
Вопрос отправлен: 6 декабря 2007, 17:08
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Да как два байта обнулить!
Допустим, имеем класс:
type
TMyClass = class(...)
end;
Чтобы создать простое событие, типа TNotifyEvent, делай поле и свойство этого типа:
type
TMyClass = class(...)
private
FOnMyEvent: TNotifyEvent;
public // или published, если это компонент (для отображения в Object Inspector)
property OnMyEvent: TNotifyEvent read FOnMyEvent write FOnMyEvent;
end;
Если требуется создать событие нового типа, то надо такой тип вначале создать. Например:
type
TMyEvent2 = procedure (Sender: TObject; const Value: Integer) of object; // обязательно of object!
TMyClass = class(...)
private
FOnMyEvent: TNotifyEvent;
FOnMyEvent2: TMyEvent2;
public // или published, если это компонент (для отображения в Object Inspector)
property OnMyEvent: TNotifyEvent read FOnMyEvent write FOnMyEvent;
property OnMyEvent2: TMyEvent2 read FOnMyEvent2 write FOnMyEvent2;
end;
Затем рекомендую создать, так называемые, методы диспетчеризации событий. Эти методы будут проверять, присвоен ли свойству-событию объекта/компонента обработчик и вызывать этот обработчик.
interface
type
TMyEvent2 = procedure (Sender: TObject; const Value: Integer) of object; // обязательно of object!
TMyClass = class(...)
private
FOnMyEvent: TNotifyEvent;
FOnMyEvent2: TMyEvent2;
protected
// Методы диспетчеризации
procedure DoOnMyEvent;
procedure DoOnMyEvent2(const Value: Integer);
public // или published, если это компонент (для отображения в Object Inspector)
property OnMyEvent: TNotifyEvent read FOnMyEvent write FOnMyEvent;
property OnMyEvent2: TMyEvent2 read FOnMyEvent2 write FOnMyEvent2;
end;
implementation
procedure TMyClass.DoOnMyEvent;
begin
if Assigned(FOnMyEvent) // Обработчик присвоен?
then FOnMyEvent(Self); // Вызов обработчика
end;
procedure TMyClass.DoOnMyEvent2(const Value: Integer);
begin
if Assigned(FOnMyEvent2) // Обработчик присвоен?
then FOnMyEvent2(Self, Value); // Вызов обработчика с дополнительным параметром
end;
end;
Вот и все дела. Ещё вопросы есть?
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 7 декабря 2007, 08:31
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 1; последнее сообщение — 6 декабря 2007, 17:41; участников в обсуждении: 1.
|
Amidamaru (статус: 4-ый класс), 6 декабря 2007, 17:41 [#1]:
Здраствуйте, Leonardo.
Для начала нужно определить какое именно событие вы хотите создать и какие данные вы будете передавать в обработчик события.
Если это простое уведомляющее событие, то можно использовать стандартный тип TNotifyEvent.
События добавляются как и свойства:
property OnEvent:TEventType read FEvent write FEvent;
с одним лишь отличием: тип поля - это процедура или функция объекта. Например объявлени TNotifyEvent выглядит так:
TNotifyEvent = procedure (Sender: TObject) of object;
в скобках вы можете добавить любое количество параметров - все они будут передоваться в обработчик события.
В коде для вызова обработчика события используйте
If Assigned(FEvent) then
FEvent(...);
1я строка проверяет задан ли обработчик события.
во 2й строке в скобках необходимо указать все параметры указанные в описании типа события. Для TNotifyEvent это будет FEvent(Self);
Замечание: в описании типа можно использовать всё то, что используется в обычных заголовках процедур и функций, т.е. "var", "const", "out" и др.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|