Delegeler ve Olaylar (Delegates and Events) – III

System.EventArgs Sınıfı
GUI kontrollerinde dikkat ettiyseniz kontrollerin çalıştırdığı metodlarda System.Object türünde sender ve System.EventArgs türünde e isimli iki tane parametre kullanılır. Bu format, önceki sayfada yazdığım gibi System.EventHandler isimli delegate’ten gelmektedir. Buradaki sender parametresi, eventi tetikleyen objeyi temsil eder. e parametresi ise o obje ile ilgili detayları bildirir. Bu parametreler, eventi üreten kontrolü öğrenmek ve ona ait ek özellikleri kullanmak için kolaylıklar sağlar. Örneğin mouse ile Form’a tıklandığında (MouseDown) mouse’in sağ mı yoksa sol mu tıklandığını e parametresinden anlarız.

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 tuşu tıkladınız.")
    End If
End Sub
button1.MouseDown += new System.Windows.Forms.MouseEventHandler(button1_MouseDown);

private void button1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e){
	if(e.Button==MouseButtons.Left)
		MessageBox.Show("Sol tuşu tıkladınız.");
}

MouseDown için MouseEventHandler sınıfı kullanılmıştır. Nitekim MouseEventArgs sınıfı da System.EventArgs sınıfından inherit edilmiştir.
Şimdi de görmeye alıştığımız bu formatı kendi class’larımız için nasıl oluştururuz ona bakalım. Öncelikle EventArgs sınıfıntan türetilmiş bir sınıf oluşturalım. Sonra bu sınıfı parametre olarak kullanan bir delegate tanımlarız. Sonraki süreci zaten biliyoruz.

'LogMesajEventArgs sınıfı
Public Class LogMesajEventArgs
    Inherits EventArgs
    'Değişkenleri 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 sınıfı
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 çalıştı.")
        Console.ReadLine()
    End Sub
End Module
//LogMesajEventArgs sınıfı
class LogMesajEventArgs : EventArgs
{
    public DateTime Tarih;
    public string Mesaj;

    public LogMesajEventArgs(DateTime Tarih, string Mesaj)
    {
        this.Tarih = Tarih;
        this.Mesaj = Mesaj;
    }
}//LogMesajEventArgs

//CustomControl sınıfı
class CustomControl
{
    public delegate void MesajDelege(object sender, LogMesajEventArgs e);
    public event MesajDelege MesajEvent;

    public CustomControl(DateTime Tarih, string Mesaj)
    {
        MesajEvent += new MesajDelege(LogMesajYaz);
        MesajEvent(this, new LogMesajEventArgs(Tarih, Mesaj));
    }

    void LogMesajYaz(object sender, LogMesajEventArgs e)
    {
        Console.WriteLine("Gönderen: " + sender.ToString());
        Console.WriteLine("Tarih: " + e.Tarih);
        Console.WriteLine("Mesaj: " + e.Mesaj);
    }
}//CustomControl

//Main Program
class ArgsEventOrnek
{
    public static void Main()
    {
        new CustomControl(DateTime.Parse("21/1/2006"), "Tüm joblar çalıştı.");
        Console.ReadLine();
    }
}//ArgsEventOrnek

Gönderen: ArgsEventOrnegi.CustomControl
Tarih: 21.01.2006
Mesaj: Tüm joblar çalıştı.

Dinamik Control Oluşturma
Uygulama geliştirirken event handler mekanizmasını yoğun kullandığımız alanlardan biri de çalışma zamanında dinamik kontroller oluşturup onların event’lerini ilgili metod veya metodlara yönlendirmektir. Örneğin bir web sayfasının veya bir windows formun içerisine birden fazla TextBox kontrolünü tasarım zamanında değil sayfa çağrıldığı zaman ekleyebilir ve onların TextChanged event’ini yönetebiliriz. Bunun için n tane TextBox nesnesi oluşturup ilgili alana eklemek gerekir. Bu bölümde bununla ilgili küçük bir örnek yapacağız. Bir Windows Application projesi yaratıp form üzerine bir panel bırakalım. Örnekte dinamik olarak aşağıdaki şekilde gösterildiği gibi 5’er Button ve TextBox oluşturacağız, kaçıncı buton tıklanırsa onun karşısındaki TextBox’a butonun numarasını yazacak.

Kullanılan Panel Adı : 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 oluşturup 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 arası 5 px olsun.
        AddHandler btn(X).Click, AddressOf btn_Click
        pnlEkran.Controls.Add(btn(X))

        'Textbox oluşturup 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 değeri, tıklanılan butonun textine eşit olan textboxı bulacağız.
    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

private void Form1_Load(object sender, System.EventArgs e)
{
int X;
Button[] btn=new Button[5];
TextBox[] txt=new TextBox[5];
for (X=0;X
Sizler de aynı yöntemleri kullanarak basit bir hesap makinası (Calculator) örneği yazabilirsiniz.

Delegeler ve Olaylar (Delegates and Events) – III” üzerine bir düşünce

  1. Oğuzhan

    Faydalı bir yazı olmuş. Teşekkürler. Yazılarınızın devamını bekliyorum/bekliyorlar/bekliyoruz.

    Cevapla
  2. deniz çelik

    Hocam makale için teşekkürler.Zaten aynısı kitabınızda da vardı ama tekrar okudum.Çok güzel olmuş.
    Acaba ASP.net kitabınızı önümüzdeki 100 yıl içerisinde çıkma ihtimali var mı?:):)
    Bir de hocam .net bilen bir bilgisayar mühendisinin çalışmaya başlayabileceği firmaları tecrübelerinizden faydalanarak sıralayabilir misiniz?(kendimizi geliştirmek adına.)Çünkü bir araştırma yaptım Microsoft dışındaki büyük firmalar(IBM,Oracle..).net kullanmıyor java kullanıyorlar.(Bunlara Tubitak gibi yerler de dahil.)
    Hep orta ve küçük ölçekli firmalar ve projeler .net kullanıyor.Aklımın bir köşesinde hep java mı?der gibiyim:)
    .net ile çalışabilecek iyi firmalar hangileri olabilir acaba?(Microsoft dışında)benim açımdan sektöre girmeye az bir zaman kalmışken.?Tesekk.

    Cevapla

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Time limit is exhausted. Please reload CAPTCHA.