Jumat, 11 Maret 2011

Penggunaan delegate dan event dalam c#


Apa itu delegate...??? apa pula event...???

Nah dalam kesempatan kali ini saya akan menjelaskan apa itu delegate & event, beserta salah satu contoh penggunaannya.

Dalam bahasa pemrograman C# dikenal sebuah keyword yang bernama "delegate", delegate secara pengertian sering disebut sebagai "Pointer of a Method". yaitu suatu cara untuk memanggil suatu method dalam suatu class jika tidak memungkinkan untuk dilakukan dengan cara pemanggilan biasa. 
Hhmmm aneh juga ya masa suatu method tidak bisa dipanggil...???
Salah satu contoh kondisi diatas adalah seperti ini, misal ada suatu object yang memiliki object lain atau dengan istilah keren compotition. Misal dalam class mobil memiliki object roda, maka tidak akan jadi masalah jika class mobil tersebut memanggil method2 dengan identifier public milik class roda, akan tetapi bagaimana jika class roda yang butuh untuk memanggil method2 yang berada dalam class mobil...???? Disinilah delegate tersebut mengambil perannya.


Untuk kasus konkritnya saya membuat contoh program yang memiliki dua buah Form, yaitu MainForm dan ChildForm. Dalam program ini class ChildForm diinstansiasi dari class MainForm (sekedar tahu saja, dalam bahasa C# UI Form direpresentasikan sebagai suatu class, jadi jika kita membuat dua buah form, maka kita memiliki 2 buah object yang berbeda). Tugas ChildForm disini adalah mengirim suatu text yang nantinya akan ditampilkan pada MainForm.
Nah inilah screenshoot dari program tersebut

Dengan kata lain, dalam kasus ini delegate berguna untuk mengirimkan data yang berupa text dari ChildForm menuju MainForm yang merupakan Form induknya. 

Agar lebih mudah, hal ini bisa kita analogikan sebagai pengiriman barang. Untuk bisa mengirim "barang kita memerlukan beberapa perangkat, yaitu : 
  1. Barang yang dikirim
  2. Pengirim barang
  3. Penerima barang
  4. Alamat penerima
  5. Jasa pengirim barang
  6. Jalur antara penerima dan pengirim
  7. Kardus untuk packing barang

Nah, mari kita cocokan analogi diatas dengan program yang kita buat :

Langkah Pertama
Kita harus mem-packing barang yang kita kirim dalam kardus. Sebagai implementasinya kita harus membuat suatu class yang bisa digunakan sebagai sarana pengirim barang kita. Dalam C# agar bisa melaksanakan tugasnya class tersebut harus menginherit System.EventArgs dan biasanya class tersebut tidak saya buat menjadi satu file sendiri akan tetapi saya embed dalam class yang menjadi pengirim barang. Kurang lebih seperti inilah class tersebut
public class ChildEventArgs : System.EventArgs
    {
        private string text;

        public ChildEventArgs(string text)
        {
            this.text = text;
        }
        public string Text
        {
            get { return text; }
            set { text = value; }
        }
    }

class yang berguna sebagai kardus pack diatas berupa entity class yang akan membawa data data apa saja yang akan kita kirim, dimana dalam hal ini hanya membawa data berupa string yaitu text;


Langkah Kedua
Kita harus menentukan siapa yang bertugas untuk mengirim barang tersebut dalam class yang akan mengirim barang.
Secara lengkap seperti inilah kurang lebihnya class ChildForm
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Windows.Forms;

namespace DelegateEvent
{
    public partial class ChildForm : Form
    {
        public delegate void ChildFormUpdateHandler(object sender, ChildEventArgs e);
        public event ChildFormUpdateHandler ChildFormUpdate;
        public ChildForm()
        {
            InitializeComponent();
        }

        private void sendButton_Click(object sender, EventArgs e)
        {
            ChildEventArgs args = new ChildEventArgs(text.Text);
            ChildFormUpdate(this, args);
            text.ResetText();
        }
    }
    public class ChildEventArgs : System.EventArgs
    {
        private string text;

        public ChildEventArgs(string text)
        {
            this.text = text;
        }
        public string Text
        {
            get { return text; }
            set { text = value; }
        }
    }
}
Dalam class ChildForm diatas terdapat baris code seperti ini :
public delegate void ChildFormUpdateHandler(object sender, ChildEventArgs e);
Dimana, code ini berfungsi untuk menginisialisasi delegate yang akan kita buat. Delegate ini berupa void yang artinya tidak memberi return value dan juga berisi ChildEventArgs yang merupakan Pack yang berisi barang yang akan kita kirim.

Akan tetapi delegate diatas belum dapat langsung digunakan, dia harus diinstansiasi dulu seperti dibawah ini dalam sebuah event yang akan bertugas menjadi jalan bagi dua buah object berbeda
public event ChildFormUpdateHandler ChildFormUpdate;

Nah cara mengirimkan barang tersebut adalah seperti dibawah ini. ketika button send di click maka ia akan menginstansiasi sebuah object dari class ChildEventArgs dengan diisi text yang akan dikirim.
Setelah object yang akan dikirim selesai dibuat, maka sekarang kita tinggal memasukan dalam  event yang bertugas mengirimkannya beserta dengan identitas pengirim, yaitu dengan memberi keyword "this"
private void sendButton_Click(object sender, EventArgs e)
        {
            ChildEventArgs args = new ChildEventArgs(text.Text);
            ChildFormUpdate(this, args);
            text.ResetText();
        }

Langkah Ketiga
Apakah sudah selesai...?? tentu saja belum,karena kita belum mendefinisikan penerima dalam proses diatas. Penerima barang, akan didefinisikan dalam MainForm seperti dibawah ini :
private void ChildForm_Click(object sender, ChildEventArgs e)
        {
            this.richText.AppendText("Child Form Say : " + e.Text + "\n");
        }

method diatas dibuat untuk menangkap barang berupa ChildEventArgs yang dikirim dari object lain dan juga memproses akan diapakan barang tersebut. Akan tetapi si pengirim belum mengetahui bahwa yang akan menerima kirimannya adalah method diatas, maka method tersebut akan dikenalkan dalam event yang bertugas mengirim seperti dibawah ini :

private void childButton_Click(object sender, EventArgs e)
        {
            ChildForm childForm = new ChildForm();
            childForm.ChildFormUpdate+=new ChildForm.ChildFormUpdateHandler(ChildForm_Click);
            childForm.Owner = this;
            childForm.Show();
        }

Proses pengenalan, dilakukan setelah kita menginstansiasi class ChildForm seperti diatas.

Untuk program secara lengkap bisa didownload disini 

*Sumber : Yohanda's Web Blog

Tidak ada komentar:

Posting Komentar