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/