Visual Basic 6'da olay mekanizması WithEvents anahtar kelimesine dayanır. Bu sayede bir değişken, bir nesneye referans alabilir ve bu nesnenin olaylarını, olay işleyicinin tanımlandığı form veya sınıfa otomatik olarak yönlendirebilir. İşleyici prosedürünün adı özel bir şablona uymalıdır: <Nesne adı>_<Olay adı>. Bir işleyici ayarlamak için, WithEvents ile bir değişken tanımlamak ve kodda gerekli prosedürleri uygulamak yeterlidir.
VB6'da WithEvents'in tanımı ve kullanımı örneği:
Private WithEvents myButton As CommandButton Private Sub Form_Load() Set myButton = Me.Controls.Add("VB.CommandButton", "btn1") myButton.Caption = "Bana tıkla!" End Sub Private Sub myButton_Click() MsgBox "Buton tıklandı!" End Sub
VB6'da özellikle başlatma sırası ve nesnenin manuel olarak kaldırılması (örneğin Set myButton = Nothing ile) kaynakların doğru bir şekilde serbest bırakılması ve işleyicilerin donmasını önlemek için dikkat edilmelidir.
Soru: "Eğer WithEvents değişkeni Nothing ise bir nesnenin olayını işlemeye çalışırsak ne olur ve bu programın çalışmasını nasıl etkiler?"
Cevap: Eğer WithEvents değişkeni bir nesneye işaret etmiyorsa (yani Nothing ise), bu nesnenin olayı üretilip işleyiciye iletilemez. İşleyici çağrılmaz: herhangi bir hata olmayacak, ancak beklenen program mantığı çalışmayacak, bu da 'sessiz' hata ve zor hata ayıklama ile sonuçlanabilir.
Örnek:
Private WithEvents myObj As SomeClass ' ... Set myObj = Nothing ' Bunun ardından myObj_Event olayı çağrılmayacak
Hikaye
Büyük bir sipariş takip sisteminde bir geliştirici dinamik olarak form nesneleri oluşturuyordu ve olaylara WithEvents ile abone oluyordu. Alt formların programlı olarak yok edilmesinin ardından değişkenlerin sıfırlanmasını unuttular — olaylar bellekte "asılı kalıyor" ve beklenmedik yan etkilerle birlikte bellek sızıntısına neden oluyordu. Hatayı düzeltmek için işleyicilerin doğru bir şekilde devreden çıkmasını ve sonlandırılmasını manuel olarak gerçekleştirmek zorunda kaldılar.
Hikaye
Üretim otomasyonu modüllerinden birinde, bir nesnenin olayı "kayboldu" — işleyici tetiklenmedi. Meğerse WithEvents değişkeni, olayın meydana gelmesinden önce Nothing olarak atanıyormuş. Hatanın düzeltilmesi için nesne ile işleyici arasında yaşam döngüsünün dikkatlice oluşturulması ve bellek serbest bırakma sırasının kontrol edilmesi gerekti.
Hikaye
Tıbbi otomasyon projesinde, WithEvents aracılığıyla buton işleyicilerine, dış veritabanlarıyla senkronizasyon mantığı bağlanıyordu. Form yeniden açıldığında yeni bir nesne oluşturuluyordu ve eski referanslar kaldırılmıyordu — bu da rekabet eden işleyicilere yol açıyor ve güncellenmiş mantığın iki veya üç kez çalışmasına neden oluyordu. Hatanın tespiti yapıldıktan sonra, pencere kapatıldığında işleyicilerin temizlenmesi için sıkı bir kontrol uygulandı.