olay (C++ Bileşen Uzantıları)
event anahtar sözcüğü bir olay tanımlar, ve bu kayıtlı abonelere (olay işleyicileri) ilgi çekici bir şey gerçekleştiği bildirimidir.
C++/CX bir olay üyesi ya da bir olay bloğu bildirimini destekler. Bir olay üyesi bir olay bloğu bildirmenin kısayoludur. Varsayılan olarak, bir olay üyesi bir olay bloğu içinde açıkça bildirilen add(), remove() ve raise() işlevlerini bildirir. Bir olay üyesi içindeki işlevleri özelleştirmek için, bunun yerine bir olay bloğu bildirin ve ihtiyacınız olan işlevleri geçersiz kılın.
Sözdizimi
// event data member
modifier event delegate^ event_name;
// event block
modifier event delegate^ event_name
{
modifier return_value add(delegate^ name);
modifier void remove(delegate^ name);
modifier void raise(parameters);
}
Parametreler
modifier
Olay bildirimi ya da olay erişimci yöntemi üzerinde kullanılabilen bir değiştirici. Mümkün değerler static ve virtual değerleridir.temsilci
Olay işleyicisinin eşleşmesi gereken delegate imzası.event_name
Olayın adı.return value
Olay erişimci yönteminin dönüş değeri. Doğrulanabilir olması için, dönüş türü void olmalıdır.parametreler
(isteğe bağlı) delegate parametresinin imzası ile eşleşmesi gereken raise yönteminin parametreleri.
Notlar
Bir olay, bir temsilci ile olayın tetiklenmesine yanıt veren ve herhangi bir sınıftan istemcilerin temel temsilcinin imzası ve dönüş türüne uyan yöntemler kaydetmesine izin veren bir üye işlev (olay işleyicisi) arasındaki ilişkilendirmedir.
İki tür olay tanımı vardır:
olay veri üyesi
Derleyici olay için otomatik olarak temsilci türünden bir üye biçiminde depo oluşturur, ve iç add(), remove() ve raise() üye işlevlerini oluşturur. Bir olay üye verisi bir sınıf içinde bildirilmelidir. Temsilcinin dönüş türü olay işleyicisinin dönüş türü ile eşleşmelidir.olay bloğu
Bir olay bloğu add(), remove() ve raise() yöntemlerini açıkça bildirmenize ve davranışını özelleştirmenize olanak sağlar.
Bir olay işleyicisi eklemek ve kaldırmak için operators+= ve operator-= kullanabilirsiniz, ya da add() ve remove() yöntemlerini açıkça çağırabilirsiniz.
event bağlama duyarlı bir anahtar sözcüktür, daha fazla bilgi için bkz. Bağlama Duyarlı Anahtar Sözcükler (C++ Bileşen Uzantıları).
Daha fazla bilgi için, bkz. Olaylar (C++/CX).
Eğer bir olay işleyicisini ekleyip ardından kaldırmayı istiyorsanız, ekleme işlemi tarafından döndürülen EventRegistrationToken yapısını kaydetmelisiniz. Ardından kaldırma işlemi içinde, kaldırılacak olay işleyicisini belirlemek için kaydettiğiniz EventRegistrationToken yapısını kullanmalısınız.
Derleyici seçeneği: /ZW
event anahtar sözcüğü bir olay bildirmenizi sağlar. Bir olay bir sınıfın ilgi çekici bir şey gerçekleştiğinde bildirimler sağlamasının bir yoludur.
Sözdizimi
// event data member
modifier event delegate^ event_name;
// event block
modifier event delegate^ event_name
{
modifier return_value add(delegate^ name);
modifier void remove(delegate^ name);
modifier void raise(parameters);
}
Parametreler
modifier
Olay bildirimi ya da olay erişimci yöntemi üzerinde kullanılabilen bir değiştirici. Mümkün değerler static ve virtual değerleridir.temsilci
Olay işleyicisinin eşleşmesi gereken delegate imzası.event_name
Olayın adı.return value
Olay erişimci yönteminin dönüş değeri. Doğrulanabilir olması için, dönüş türü void olmalıdır.parametreler
(isteğe bağlı) delegate parametresinin imzası ile eşleşmesi gereken raise yönteminin parametreleri.
Notlar
Bir olay, bir temsilci ile olayın tetiklenmesine yanıt veren ve herhangi bir sınıftan istemcilerin temel temsilcinin imzası ve dönüş türüne uyan yöntemler kaydetmesine izin veren bir üye işlev (olay işleyicisi) arasındaki ilişkilendirmedir.
Temsilci kodunuz olayın gerçekleştiğini belirttiğinde çağırılacak bir ya da daha fazla ilişkili yönteme sahip olabilir. Bir program içindeki bir olay .NET Framework ortak dil çalışma zamanını hedefleyen diğer programlar tarafından kullanılır olabilir. Bir örnek için bkz. Farklı Bir Derleme İçinde Tanımlanmış Bir Olayı Harekete Geçirme.
İki tür olay tanımı vardır:
olay veri üyeleri
Olay için depo, temsilci türünde bir üye biçiminde, veri üyesi olayları için derleyici tarafından oluşturulur. Bir olay üye verisi bir sınıf içinde bildirilmelidir. Bu ayrıca basit bir olay olarak da bilinir (aşağıdaki kod örneğine bakın).olay blokları
Olay blokları add, remove ve raise yöntemlerini uygulayarak davranışlarını özelleştirmenizi sağlar. Add, remove ve raise yöntemlerinin imzaları temsilcinin imzasıyla eşleşmelidir. Olay bloğu olayları veri üyeleri değillerdir ve bir veri üyesi olarak kullanımları bir derleyici hatası üretir. Bir örnek için bkz. Olay Erişimci Yöntemleri Tanımlama.
Olay işleyicisinin dönüş türü temsilcinin dönüş türü ile eşleşmelidir.
.NET Framework içinde, bir veri üyesini sanki kendisinin bir yöntemi (yani, karşılık gelen temsilcinin Invoke yöntemi) gibi kullanabilirsiniz. Bir yönetilen olay veri üyesi bildirmek için temsilci türünü önceden tanımlamalısınız. Buna karşılık, bir yönetilen olay yöntemi karşılık gelen yönetilen temsilciyi eğer tanımlı değilse örtük olarak tanımlar. Bir örnek için bu konunun sonundaki kod örneğine bakın.
Bir yönetilen olay tanımlarken, olay işleyicileri += ve -= işleçleri kullanılarak eklendiğinde ya da kaldırıldığında çağırılacak add ve remove erişimcilerini belirtebilirsiniz. add, remove ve raise yöntemleri açık olarak çağırılabilir.
Visual C++ içinde olaylar oluşturmak ve kullanmak için aşağıdaki adımlar sırasıyla takip edilmelidir:
Bir temsilci oluşturun ya da tanımlayın. Eğer kendi olayınızı tanımlıyorsanız, event anahtar sözcüğü ile kullanmak için bir temsilciniz olduğundan da emin olmalısınız. Eğer olay önceden tanımlı ise, örneğin .NET Framework içinde, o halde olayı kullanacakların yalnızca temsilci adını bilmeleri gereklidir.
Aşağıdakileri içeren bir sınıf oluşturun:
Temsilciden oluşturulmuş bir olay.
(isteğe bağlı) Temsilcinin event anahtar sözcüğü ile bildirilmiş bir örneğinin mevcut olduğunu doğrulayan bir yöntem. Aksi halde, bu mantık olayı harekete geçiren kod içine yerleştirilmelidir.
Olayı çağıran yöntemler. Bu yöntemler bazı temel sınıf işlevselliğinin geçersiz kılınmaları olabilir.
Bu sınıf olayı tanımlar.
Olaya yöntemler bağlayan bir ya da daha fazla sınıf tanımlayın. Bu sınıfların her biri taban sınıf içinde olay ile bir ya da daha fazla yöntemi ilişkilendirir.
Olayı kullanın:
Olay bildirimini içeren sınıfın bir nesnesini oluşturun.
Olay tanımını içeren sınıfın bir nesnesini oluşturun.
C++/CLI olayları hakkında daha fazla bilgi için, bkz.
add, remove ve raise Yöntemlerinin Varsayılan Erişimini Geçersiz Kılma
Farklı Bir Derleme İçinde Tanımlı Bir Olayı Harekete Geçirme
Derleyici seçeneği: /clr
Örnek
Aşağıdaki kod örneği temsilci, olay ve olay çiftleri bildirmeyi; olay işleyicilerine abone olmayı (eklemeyi); olay işleyicilerini çağırmayı; ve ardından olay işleyicilerinden aboneliği iptal etmeyi (kaldırmayı) gösterir.
// mcppv2_events.cpp
// compile with: /clr
using namespace System;
// declare delegates
delegate void ClickEventHandler(int, double);
delegate void DblClickEventHandler(String^);
// class that defines events
ref class EventSource {
public:
event ClickEventHandler^ OnClick; // declare the event OnClick
event DblClickEventHandler^ OnDblClick; // declare OnDblClick
void FireEvents() {
// raises events
OnClick(7, 3.14159);
OnDblClick("Hello");
}
};
// class that defines methods that will called when event occurs
ref class EventReceiver {
public:
void OnMyClick(int i, double d) {
Console::WriteLine("OnClick: {0}, {1}", i, d);
}
void OnMyDblClick(String^ str) {
Console::WriteLine("OnDblClick: {0}", str);
}
};
int main() {
EventSource ^ MyEventSource = gcnew EventSource();
EventReceiver^ MyEventReceiver = gcnew EventReceiver();
// hook handler to event
MyEventSource->OnClick += gcnew ClickEventHandler(MyEventReceiver, &EventReceiver::OnMyClick);
MyEventSource->OnDblClick += gcnew DblClickEventHandler(MyEventReceiver, &EventReceiver::OnMyDblClick);
// invoke events
MyEventSource->FireEvents();
// unhook handler to event
MyEventSource->OnClick -= gcnew ClickEventHandler(MyEventReceiver, &EventReceiver::OnMyClick);
MyEventSource->OnDblClick -= gcnew DblClickEventHandler(MyEventReceiver, &EventReceiver::OnMyDblClick);
}
Çıktı
Örnek
Aşağıdaki kod örneği basit bir olayın raise yöntemini üretmek için kullanılan mantığı gösterir: Eğer olayın bir ya da daha fazla abonesi var ise, raise yöntemini çağırmak temsilciyi örtük ya da açık olarak çağırır. Eğer temsilcinin dönüş türü void değilse ve sıfır olay abonesi var ise, raise yöntemi temsilci türü için varsayılan değeri döndürür. Eğer hiç olay abonesi yok ise, raise yöntemini çağırmak sadece döndürür ve özel durum harekete geçirilmez. Eğer temsilci dönüş türü void değil ise, temsilci türü döndürülür.
// trivial_events.cpp
// compile with: /clr /c
using namespace System;
public delegate int Del();
public ref struct C {
int i;
event Del^ MyEvent;
void FireEvent() {
i = MyEvent();
}
};
ref struct EventReceiver {
int OnMyClick() { return 0; }
};
int main() {
C c;
c.i = 687;
c.FireEvent();
Console::WriteLine(c.i);
c.i = 688;
EventReceiver^ MyEventReceiver = gcnew EventReceiver();
c.MyEvent += gcnew Del(MyEventReceiver, &EventReceiver::OnMyClick);
Console::WriteLine(c.i);
}
Çıktı