|
Вопрос # 3 018/ вопрос открыт / |
|
Здравствуйте, уважаемые эксперты!
Подскажите как правильно описать события в классе. Где и как присваивать продедуру событию? - в конструкторе?
То есть как сделать так, чтобы те, кто будут работать с классом должны были только описать процедуру OnMyevent как это делается в для всех событий компонентов?
 |
Вопрос задал: Roman Novikov (статус: Посетитель)
Вопрос отправлен: 21 июля 2009, 15:02
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
Ну, допустим, ты написал класс:
interface
type
// Для примера - пользовательский тип события
TMyEvent2 = procedure (Sender: TObject; const SomeParam: Integer) of object;
TMyClass = class
private
// Поля событий
FOnMyEvent1: TNotifyEvent;
FOnMyEvent2: TMyEvent2;
public
// Методы
procedure Method1;
procedure Method2;
// События
property OnMyEvent1: TNotifyEvent read FOnMyEvent1 write FOnMyEvent1;
property OnMyEvent2: TMyEvent2 read FOnMyEvent2 write FOnMyEvent2;
end;
implementation
procedure TMyClass.Method1;
begin
if (условие_вызова_события_1) and Assigned(FOnMyEvent1)
then FOnMyEvent1(Self); // <--- передача в обработчик указателя на экземпляр класса, который вызвал события
end;
procedure TMyClass.Method2;
var
Param: Integer;
begin
Param:= 100; // <--- число, которое требуется передать обработчику
if (условие_вызова_события_2) and Assigned(FOnMyEvent2)
then FOnMyEvent2(Self, Param); // <--- передача в обработчик указателя на экземпляри параметра
end;
end.
После создания экземпляра класса, надо назначить его событиям обработчики.
Обработчики обязательно должны быть методами какого-либо класса.
Например, пусть обработчики будут методами формы:
interface
type
TMyForm = class(TForm)
private
FMyClass: TMyClass; // Твой экземпляр объекта
// Обработчик для TMyClass.OnMyEvent1
procedure MyClassEvent1(Sender: TObject);
// Обработчик для TMyClass.OnMyEvent2
procedure MyClassEvent2(Sender: TObject; const SomeParam: Integer);
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
end;
implementation
constructor Create(AOwner: TComponent); override;
begin
// создаём экземпляр объекта
FMyClass:= TMyClass.Create();
// Назначаем его событиям обработчики
FMyClass.OnMyEvent1:= MyClassEvent1;
FMyClass.OnMyEvent2:= MyClassEvent2;
end;
destructor Destroy; override;
begin
// При убиении формы убиваем экземпляр объекта
FMyClass.Free();
end;
procedure MyClassEvent1(Sender: TObject);
begin
// Обработчик для TMyClass.OnMyEvent1
ShowMessage('Возникло событие FMyClass.OnMyEvent1');
end;
procedure MyClassEvent2(Sender: TObject; const SomeParam: Integer);
begin
// Обработчик для TMyClass.OnMyEvent2
ShowMessage('Возникло событие FMyClass.OnMyEvent2'#13#10'Значение SomeParam = '
+ IntToStr(SomeParam));
end;
Надеюсь, я понятно объяснил.
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 21 июля 2009, 15:30
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 4 августа 2009, 16:36; участников в обсуждении: 2.
|
Ученый (статус: 8-ой класс), 21 июля 2009, 15:59 [#1]:
to Roman Novikov. Ответ на этот вопрос есть в любом учебнике по Делфи.
to min@y™. отличный примерчик )
|
|
Roman Novikov (статус: Посетитель), 4 августа 2009, 16:36 [#2]:
>Ответ на этот вопрос есть в любом учебнике по Делфи.
Ученый, Не в любом. У меня учебник Глушакова, Клевцова - "Delphi 2007. Эффективное руководство". Сама теория есть как описать события, а вот где и как скрывают обработчики событий в не сказано, поэтому и уточнил. Не понятно куда их сама среда проставляла когда для компонента прописываю обработчик события.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|