Форум — Ответы ( К темам )
? | 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) //--------------------------------------------------------------------------- |