Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 181

/ вопрос открыт /

Доброго времени суток, уважаемые эксперты! Как создавать собственные события в новом (созданным) компоненте?

Leonardo Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

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" и др.
Приглашаю Вас на наш IRC-канал: #delphiintru в сети DalNet.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 2 апреля 2023, 05:32
Выполнено за 0.03 сек.
Рейтинг@Mail.ru