Visual Basic'teki olay modeli, kullanıcı eylemlerine yanıt vermek için kontrollerle bağlantılı olay işleyicilerini kullanır. Bu, her bir öğenin kendi olaylarını tetikleyebileceği GUI (grafik kullanıcı arayüzü) olan uygulamalar için kritik öneme sahiptir.
Klasik VB6'da olay işleme, kontrol - yöntem statik bağlaması ile gerçekleştirilirdi. VB.NET ve WinForms'ta bu model daha esnek hale geldi: şimdi bir olaya birden fazla işleyici bağlanabilir, dinamik bağlama AddHandler/RemoveHandler ile desteklenir.
Tipik bir zorluk, dinamik olarak kontroller eklemek ve olaylarını yönetmektir. Olaylardan aboneliği iptal etmezseniz veya işleyiciyi yanlış bağlarsanız, bellek sızıntıları, çağrıların yinelenmesi ve UI davranışı üzerinde kontrol kaybı gibi sorunlar ortaya çıkabilir.
Dinamik olarak kontroller oluştururken, abonelik için AddHandler ve işleyicinin düzgün bir şekilde kaldırılması için RemoveHandler kullanın. Kontrollerin yaşam süresine dikkat edin — kontrol yok ediliyorsa, işleyicilerden abonelik iptal edilmeli, aksi takdirde "sarkmış" referanslar kalır.
Kod örneği:
Dim btn As New Button() AddHandler btn.Click, AddressOf ButtonClickHandler ' ... RemoveHandler btn.Click, AddressOf ButtonClickHandler Sub ButtonClickHandler(sender As Object, e As EventArgs) MessageBox.Show("Butona tıklandı!") End Sub
Anahtar özellikler:
Eğer bir olay işleyicisi aynı öğeye birkaç kez bağlanırsa ne olur?
İşleyici, AddHandler ile kaç kez eklenmişse o kadar kez çağrılır, bu da beklenmedik bir şekilde mantığın birden fazla kez çalıştırılmasına neden olabilir.
AddHandler btn.Click, AddressOf Handler AddHandler btn.Click, AddressOf Handler ' Butona tıklandığında Handler 2 kez çağrılacak
Olayın imzasından farklı parametrelerle bir yöntem kullanılabilir mi?
Hayır, işleyici yönteminin imzası olayın delegesine tam olarak uymalıdır (örneğin, Sub Handler(sender As Object, e As EventArgs)). Aksi takdirde derleyici hata verir.
RemoveHandler, işleyici birkaç kez eklenmişse, tüm eşleşmeleri kaldırır mı?
Hayır, RemoveHandler her çağrıda yalnızca bir aboneliği kaldırır. Eğer işleyici birkaç kez eklenmişse, o kadar kez kaldırmak gerekir, aksi halde bir örnek bağlı kalır.
RemoveHandler'in unutulması, bellek sızıntılarına yol açarBir döngü içinde dinamik olarak 100 buton oluşturuluyor ve hepsine işleyici atanıyor, ancak RemoveHandler çağrılmıyor. Form kapatıldığında olay "yaşıyor" olmaya devam ediyor, bu da sıkça çökmesine neden oluyor.
Artılar:
Eksiler:
Koleksiyondaki her dinamik kontrol için atanan isimli bir işleyici var ve kontrol kaldırıldığında açık bir döngü ile tüm işleyicilerden abonelik iptali yapılıyor.
Artılar:
Eksiler: