| 
| 
 | Вопрос # 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" и др.
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |