" Umut, hiç görmeyen birine gökkuşağını anlatmak kadar zor ve imkansız... "

Categories

-

Vb.Net Delegates ve Events 2 !!!

Olaylar(Events) : Olaylar, mouse ile tiklama, klavyeden tusa basma gibi kullanicinin isletim sistemi üzerinden gerçeklestirdigi faaliyetlerdir. Bu sekilde, uygulamamiz içerisinde meydana gelen durum degisikliklerine karsi hassas olan ve bu degisiklikler dogrultusunda yönlendirilebilen programlama modeline olay güdümlü programlama (event driven programming) denir. Bu modeldeki programlar, bir seyler yapmak için bazi seylerin gerçeklesmesini beklerler. Bir bilesen üzerinde meydana gelen olaylarin takipçisi olup onlari yakalayan mekanizmaya olay yöneticisi (event handler) denir. Olay tutucusu veya isleyicisi olarak ta tanimlanan event handler, ilgili olay gerçeklestigi zaman tetiklenir. Olay yöneticilerinin yönlendirilmesi bizim tarafimizda kodlanir, olay yöneticisinin olay gerçeklestikten sonra hangi islemleri yapacagini delegatelerle tanimlariz. Yani olay yöneticileri, delegatelerle temsil edilir.

Eventleri aktif olarak Windows programlamada control’ler için kullaniriz. Örnegin kullanicinin mouse ile tiklamasi Click event’inin, klavyede tusa basmasi KeyPress event’inin olusmasina neden olur. Bize düsen, Click, KeyPress gibi event’lerin altini doldurmaktir yani bu eventleri delegate araciligiyla metodlarla iliskilendirmektir.

Bu bölümde derleme zamaninda olay yönetimini ve çalisma zamaninda olay yönetimini(dinamik olay yönetimi) isleyecegiz.

VB.NET Eventleri iki farkli yöntemle tanimlayabiliriz. Ilk yöntem, bir delegate olusturmak ve event’i bu delegate türünden tanimlamaktir. Ikinci yöntem ise delegate tanimlamadan dogrudan event’i, formatiyla birlikte tanimlamaktir. Bu yöntem delegate kullanilmadigi anlamina gelez çünkü derleyici bu durumda da event için bir delegate yaratir.
C# Bir eventi tanimlamadan önce o event’i temsil edecek delegate’in tanimlanmasi gerekir.
Yeni bir event olusturmak için “event” sözcügü kullanilir. Olusturulan eventleri tetiklemek için VB.NET’te RaiseEvent sözcügü kullanilirken C# tarafinda event’in ismi kullanilir.

'Eventin türünü belirleyen delegate
Public Delegate Sub ClickEventHandler(ByVal Mesaj As String)
 
Public Class CustomControl
    'Bu Class için bir event tanimlayalim.
    Public Event Click As ClickEventHandler
    'Public Event Click(ByVal Mesaj As String)
 
    'Click eventini tetikleyecek metod (Event raising method)
    Sub OnClick(ByVal Mesaj As String)
        RaiseEvent Click(Mesaj)
    End Sub
End Class

Dogru sartlar gerçeklestikten sonra event tetiklenir ve bagli oldugu metodlari çalistirir. Bu metodlara Event Handler denilir. Event handling islemini dinamik olarak çalisma zamaninda yeniden implemente edebiliriz. Çalisma zamaninda bir eventi bir metoda baglamak için (hooking) VB.Net’te AddHandler sözcügü, C#’ta ise += operatörü kullanilir. Evente eklenmis metodu kaldirmak için de (unhooking) VB.Net’te RemoveHandler sözcügü, C#’ta da -= operatörü kullanilir. Burada dikkat edilmesi gereken konu, eventin baglanacagi metodlarin signature’leri event’in türü olan delegate ile ayni olmalidir.

Module EventOrnek
    Sub Main()
        Dim o1 As New CustomControl
        AddHandler o1.Click, AddressOf MesajYaz
        AddHandler o1.Click, AddressOf MesajBuyukYaz
 
        'eventin çalismasina sebep olan islem
        o1.OnClick("Tatli dil, her kapiyi açan sihirli bir anahtardir.")
        Console.WriteLine()
 
        'MesajYaz metodunu listeden çikariyoruz.
        RemoveHandler o1.Click, AddressOf MesajYaz
        o1.OnClick("Erdem , iyiyi elde etme gücüdür.")
 
        Console.ReadLine()
    End Sub
 
    Sub MesajYaz(ByVal Mesaj As String)
        Console.WriteLine(Mesaj)
    End Sub
 
    Sub MesajBuyukYaz(ByVal Mesaj As String)
        Console.WriteLine(Mesaj.ToUpper)
    End Sub
 
End Module

Tatli dil, her kapiyi açan sihirli bir anahtardir.
TATLI DIL, HER KAPIYI AÇAN SIHIRLI BIR ANAHTARDIR.
ERDEM , IYIYI ELDE ETME GÜCÜDÜR.


Örnekte gerçek bir kontrol olmadigi için event’i OnClick ile tetikliyoruz. Görüldügü gibi birbirleriyle konusacak yapilarin signatureleri ayni biçime sahip. Örnegin bir metodu windows uygulamasinda bir butonun click eventine baglamak için metodun signature’i butonun click eventi ile ayni olmalidir. Butonlarin click eventinin formati su sekildedir;

Public Event Click As EventHandler
 
Public Delegate Sub EventHandler(ByVal sender As Object, ByVal e As EventArgs)
public event EventHandler Click;
 
public delegate void EventHandler(object sender, EventArgs e);

Metadata kodlarindan görüldügü gibi kontrollerin click event’i System.EventHandler isimli delegate türüne sahiptir. Dolayisiyla çalisacak metod da su sekilde tanimlanmalidir.

AddHandler Button1.Click, AddressOf Metod
 
Sub Metod(ByVal sender As System.Object, ByVal e As System.EventArgs)
    'Islemler
End Sub

Bunlara ek olarak VB.Net’te eventleri yakalamanin kolay bir yolu da WithEvents ve Handles ikilisini kullanmaktir. Bu sözcükler daha çok Windows GUI (Graphical User Interface-Grafik Ara Birimi) uygulamalarinda programlama, derleme zamaninda metodlari iliskilendirmek için kullanilir. WithEvents ifadesi, derleyiciye yaratilan nesnenin eventleriyle birlikte kullanilacagini ifade eder. Handles ifadesini kullanmak için nesneleri WithEvents ile tanimlamaliyiz. Asagidaki örnekte bu ifadelerin kullanimi gösterilmistir.

Friend WithEvents o1 As New CustomControl
 
Sub Main()
    o1.OnClick("Erdem , iyiyi elde etme gücüdür.")
    Console.ReadLine()
End Sub
 
'Handles sözcügü ile MesajYaz metodu, o1 nesnesinin Click eventine baglanmistir.
Sub MesajYaz(ByVal Mesaj As String) Handles o1.Click
    Console.WriteLine(Mesaj)
End Sub

Handles ifadesiyle birden fazla event’i ayni metoda baglayabiliriz. Bunun için event’leri virgül ile ayirmamiz yeterli olacaktir.

Friend WithEvents o1 As New CustomControl
Friend WithEvents o2 As New CustomControl
 
Sub Main()
    o1.OnClick("Erdem , iyiyi elde etme gücüdür.")
    o2.OnClick("Erdem , iyiyi elde etme gücüdür.")
End Sub
 
Sub MesajYaz(ByVal Mesaj As String) Handles o1.Click, o2.Click
    Console.WriteLine(Mesaj)
End Sub

Kaynak : http://www.ahmetkaymaz.com/2007/09/05/delegeler-ve-olaylar-delegates-and-events-ii/

Mesela bir örnek yapacak olursak, Menü formumuz olsun, burdan yemek seçimi yapalim ve seçtigimiz yemekleri listbox kontrolune aktaralim. Ödeme yapildiktan sonra Form2 form nesnemiz tetiklensin ve seçtigimiz yemek listesi form2deki form nesnemizdeki listbox kontrolumuze aktarilsin.

Form1.vb kodlarimiz;

Imports System
Public Class Form1

    Public Delegate Sub EventHandler(ByVal sender As Object, ByVal e As EventArgs)
    Public Delegate Sub MenüBas()
    Public Shared Event Sef As MenüBas
    Public Shared alinanlar As New ArrayList

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        ListBox1.Items.Add("Patates")
        alinanlar.Add("Patates")
    End Sub
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim Form2 As New Form2
        Form2.Show()
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        ListBox1.Items.Add("Köfte")
        alinanlar.Add("Köfte")
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        ListBox1.Items.Add("Kola")
        alinanlar.Add("Kola")
    End Sub

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        MessageBox.Show("Ödeme Tamamlandi", "Bilgilendirme")
        RaiseEvent Sef()
        ListBox1.Items.Clear()
        alinanlar.Clear()
    End Sub
End Class

Form2.vb kodlarimiz;

Public Class Form2

    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        AddHandler Form1.Sef, AddressOf topla
    End Sub

    Sub topla()
        'ListBox1.Items.Add(Form1.alinanlar)
        ListBox1.Items.AddRange(Form1.alinanlar.ToArray)
    End Sub

End Class

Örnek çalismayi buradan indirebilirsiniz.

  • 0
  • 769
  • 0

- BUNLARIDA GÖZDEN GEÇİREBİLİRSİNİZ -

HENÜZ YORUM YAPILMAMIŞ !

Yorum yazın

HAKKIMDA

KONULARI TAKİP EDİN

SOSYAL AĞLAR

  • Mesajınızı Gonderin