Форум — Ответы     (  К темам )
 ?  Eugene: Создание новых событий у компонент (02-04-2003 00:48:50)
Для того, чтобы какой-то объект класса формировал событие, необходимо чтобы он был компонентой?

Дайте пример создания компоненты, имеющей событие.
Например, компонента со свойством Index, при условии Index>5 возникает событие OnEvent.

Что надо исправить в следующем коде, чтобы формировалось событие OnEvent и запускался обработчик события?
class Comp : public TComponent
{
private:
int FIndex;
TNotifyEvent FOnEvent;
protected:
public:
__fastcall Comp(TComponent* Owner);
void __fastcall SetIndex(int Value)
{
FIndex=Value;

}
__published:
__property TNotifyEvent OnEvent = {read=FOnEvent, write=FOnEvent};
__property int Index = {read=FIndex, write=SetIndex, default = 0};
};
Так же еще желательно привести тот же пример, у которого событие не простое, а с параметрами.
 Andrew (07-04-2003 11:49:30)
//Специальные типы для событий. Должны быть описаны как __closure
//Синтаксис срисовал с объявления событий в Buildere (типа OnMouse...)
typedef void __fastcall (__closure *MTStrEvent)(System::TObject* Sender, AnsiString SVal);
typedef void __fastcall (__closure *MTDblEvent)(System::TObject* Sender, double DVal);
//Для пустого события тип описывать не надо, есть уже :)
__property TNotifyEvent OnEvent= { read = FOnEvent, write = FOnEvent };//
__property MTDblEvent OnDEvent= { read = FOnDEvent, write = FOnDEvent };//
__property MTStrEvent OnSEvent= { read = FOnSEvent, write = FOnSEvent };//
//п/п уведомления о событиях
void __fastcall SendEvent(TObject *Sender);//
void __fastcall SendDEvent(TObject *Sender, double value);//
void __fastcall SendSEvent(TObject *Sender, AnsiString value);//
//Поля свойств событий
TNotifyEvent FOnEvent; //Зарезервированный тип
MTDblEvent FOnDEvent; //твои тип
MTStrEvent FOnSEvent; //твои тип

//Реализация
void __fastcall MyClass::SendEvent(TObject *Sender)//
{ //
if (OnEvent){ //Если обработчик события имеется, то
try { //Возможный источник исключения
FOnEvent(Sender); //Посылаем сообщение
} //try
__finally { //Код зачистки
//Если обработчик был не определен, а OnEvent не NULL
} //__finally
} //if (OnEvent)
} //SendEvent(void)
//---------------------------------------------------------------------------
void __fastcall MyClass::SendDEvent(TObject *Sender, double value)//
{ //Аналогично SendEvent
if (OnDEvent){ //
try { //
FOnDEvent(Sender, value); //
} //try
__finally { //
} //__finally
} //if (OnDEvent)
} //SendDEvent(void)
//---------------------------------------------------------------------------
void __fastcall MyClass::SendSEvent(TObject *Sender, AnsiString value)//
{ //Аналогично SendEvent
if (OnSEvent){ //
try { //
FOnSEvent(Sender, value); //
} //try
__finally { //
} //__finally
} //if (OnSEvent)
} //SendSEvent(void)
//---------------------------------------------------------------------------
void __fastcall MyClass::SetIndex(int value)//
{ //
if (FIndex != value){ //
if (FIndex >= 5){ //
SendEvent(this); //Сообщение получит тот, кто висит на MyClass->OnEvent
SendDEvent(this, FIndex); //Сообщение получит тот, кто висит на MyClass->OnDEvent
SendEvent(this, "Ops!"); //Сообщение получит тот, кто висит на MyClass->OnSEvent
} //if (FIndex >= 5)
} //if (FIndex != value)
} //SetIndex(int value)
//---------------------------------------------------------------------------