link5680 link5681 link5682 link5683 link5684 link5685 link5686 link5687 link5688 link5689 link5690 link5691 link5692 link5693 link5694 link5695 link5696 link5697 link5698 link5699 link5700 link5701 link5702 link5703 link5704 link5705 link5706 link5707 link5708 link5709 link5710 link5711 link5712 link5713 link5714 link5715 link5716 link5717 link5718 link5719 link5720 link5721 link5722 link5723 link5724 link5725 link5726 link5727 link5728 link5729 link5730 link5731 link5732 link5733 link5734 link5735 link5736 link5737 link5738 link5739 link5740 link5741 link5742 link5743 link5744 link5745 link5746 link5747 link5748 link5749 link5750 link5751 link5752 link5753 link5754 link5755 link5756 link5757 link5758 link5759 link5760 link5761 link5762 link5763 link5764 link5765 link5766 link5767 link5768 link5769 link5770 link5771 link5772 link5773 link5774 link5775 link5776 link5777 link5778 link5779 link5780 link5781 link5782 link5783 link5784 link5785 link5786 link5787 link5788 link5789 link5790 link5791 link5792 link5793 link5794 link5795 link5796 link5797 link5798 link5799 link5800 link5801 link5802 link5803 link5804 link5805 link5806 link5807 link5808 link5809 link5810 link5811 link5812 link5813 link5814 link5815 link5816 link5817 link5818 link5819 link5820 link5821

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