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

Categories

-

Vb.Net Delegates ve Events 3 !!!

System.EventArgs Sinifi : GUI kontrollerinde dikkat ettiyseniz kontrollerin çalistirdigi metodlarda System.Object türünde sender ve System.EventArgs türünde e isimli iki tane parametre kullanilir. Bu format, önceki sayfada yazdigim gibi System.EventHandler isimli delegate’ten gelmektedir. Buradaki sender parametresi, eventi tetikleyen objeyi temsil eder. e parametresi ise o obje ile ilgili detaylari bildirir. Bu parametreler, eventi üreten kontrolü ögrenmek ve ona ait ek özellikleri kullanmak için kolayliklar saglar.

Örnegin mouse ile Form’a tiklandiginda (MouseDown) mouse’in sag mi yoksa sol mu tiklandigini e parametresinden anlariz.

Friend WithEvents Button1 As System.Windows.Forms.Button
 
Private Sub Button1_MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles Button1.MouseDown
    If e.Button = MouseButtons.Left Then
        MsgBox("Sol tusu tikladiniz.")
    End If
End Sub

MouseDown için MouseEventHandler sinifi kullanilmistir. Nitekim MouseEventArgs sinifi da System.EventArgs sinifindan inherit edilmistir.

Simdi de görmeye alistigimiz bu formati kendi class’larimiz için nasil olustururuz ona bakalim. Öncelikle EventArgs sinifintan türetilmis bir sinif olusturalim. Sonra bu sinifi parametre olarak kullanan bir delegate tanimlariz. Sonraki süreci zaten biliyoruz.

'LogMesajEventArgs sinifi
Public Class LogMesajEventArgs
    Inherits EventArgs
    'Degiskenleri public yapmak yerine Property de kullanabilirdik.
    Public Tarih As Date
    Public Mesaj As String
 
    Sub New(ByVal Tarih As Date, ByVal Mesaj As String)
        Me.Tarih = Tarih
        Me.Mesaj = Mesaj
    End Sub
End Class
 
'CustomControl sinifi
Public Class CustomControl
    Public Delegate Sub MesajDelege(ByVal sender As Object, ByVal e As LogMesajEventArgs)
    Public Event MesajEvent As MesajDelege
 
    Sub New(ByVal Tarih As Date, ByVal Mesaj As String)
        AddHandler MesajEvent, AddressOf LogMesajYaz
        RaiseEvent MesajEvent(Me, New LogMesajEventArgs(Tarih, Mesaj))
    End Sub
 
    Sub LogMesajYaz(ByVal sender As Object, ByVal e As LogMesajEventArgs)
        Console.WriteLine("Gönderen: " & sender.ToString())
        Console.WriteLine("Tarih: " & e.Tarih)
        Console.WriteLine("Mesaj: " & e.Mesaj)
    End Sub
End Class
 
'Main Program
Module ArgsEventOrnek
    Sub Main()
        Dim o1 As New CustomControl(#1/21/2006#, "Tüm joblar çalisti.")
        Console.ReadLine()
    End Sub
End Module

Gönderen: ArgsEventOrnegi.CustomControl
Tarih: 21.01.2006
Mesaj: Tüm joblar çalisti.


Dinamik Control Olusturma

Uygulama gelistirirken event handler mekanizmasini yogun kullandigimiz alanlardan biri de çalisma zamaninda dinamik kontroller olusturup onlarin event’lerini ilgili metod veya metodlara yönlendirmektir. Örnegin bir web sayfasinin veya bir windows formun içerisine birden fazla TextBox kontrolünü tasarim zamaninda degil sayfa çagrildigi zaman ekleyebilir ve onlarin TextChanged event’ini yönetebiliriz. Bunun için n tane TextBox nesnesi olusturup ilgili alana eklemek gerekir. Bu bölümde bununla ilgili küçük bir örnek yapacagiz. Bir Windows Application projesi yaratip form üzerine bir panel birakalim. Örnekte dinamik olarak asagidaki sekilde gösterildigi gibi 5’er Button ve TextBox olusturacagiz, kaçinci buton tiklanirsa onun karsisindaki TextBox’a butonun numarasini yazacak.

Kullanilan Panel Adi : pnlEkran

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim X As Integer
    Dim btn(4) As Button
    Dim txt(4) As TextBox
    For X = 0 To 4
        'Button olusturup ekleyelim.
        btn(X) = New Button
        btn(X).Text = (X + 1).ToString
        btn(X).Size = New Size(20, 20)
        btn(X).Location = New Point(10, (X + 1) * 25)
        'her butonun arasi 5 px olsun.
        AddHandler btn(X).Click, AddressOf btn_Click
        pnlEkran.Controls.Add(btn(X))
 
        'Textbox olusturup ekleyelim.
        txt(X) = New TextBox
        txt(X).Size = New Size(40, 20)
        txt(X).Tag = X + 1
        txt(X).Location = New Point(50, (X + 1) * 25)
        pnlEkran.Controls.Add(txt(X))
    Next
End Sub
 
Sub btn_Click(ByVal sender As Object, ByVal e As EventArgs)
    Dim btn As Button = CType(sender, Button)
    Dim HangiTxt As Integer = Convert.ToInt16(btn.Text)
    'Tag degeri, tiklanilan butonun textine esit olan textboxi bulacagiz.
    For X As Integer = 0 To pnlEkran.Controls.Count
        Try
            Dim txt As TextBox = CType(pnlEkran.Controls(X), TextBox)
            If txt.Tag = HangiTxt Then
                txt.Text = HangiTxt
            End If
        Catch
            'msgbox(X)
        End Try
 
    Next
End Sub

Sizler de ayni yöntemleri kullanarak basit bir hesap makinasi (Calculator) örnegi yazabilirsiniz.

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

Örnek çalismayi buradan indirebilirsiniz.

  • 0
  • 783
  • 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