Thứ Năm, 16 tháng 5, 2013

Cách dùng Delegate (cơ bản)

Delegate hiểu theo 1 cách đơn giản đó là đóng gói phương thức, có nghĩa là bạn có thể gọi phương thức bất kì nơi nào, từ đối tượng này sang đối tượng kia, form này sang form kia... Đơn giản vậy thôi :))

1. KHAI BÁO
[modifier] delegate return-type Identifier ([formal-parameters]);
  • [modifier]          : phạm vi truy xuất (public, private, proteted, internal)
  • delegate            : từ khóa
  • return-type         : kiểu dữ liệu trả về
  • Identifier          : tên của delegate
  • [formal-parameters] : danh sách tham số
Ví dụ: Khai báo 1 delegate có tên MyDelegate:
public delegate int DoSomeThing(int MyNumber1, int MyNumber2);
Bạn có thể dùng delegate này để đại diện cho bất kì phương thức nào yêu cầu tham số truyền vào và kiểu trả về giống như vậy.

2. KHỞI TẠO
Giả sử ta có phương thức sau:
int PhepCong(int a, int b)
{
    return a + b;
}
Ta có thể đóng gói phương thức này bằng cách sau:
DoSomeThing MyDelegate = PhepCong;
hoặc
DoSomeThing MyDelegate = new DoSomeThing(PhepCong);

3. THỰC THI
Ta coi MyDelegate là một hàm và dùng như bình thường.
Ví dụ:
MyDelegate(5,3) => kết quả trả về sẽ là 8.

4. BÀI TẬP
Thiết kế Form1 gồm 2 button btnShow, btnTest như hình sau:


Thiết kế Form 2 gồm 1 button btnDisEna :

Yêu cầu:
- Khi chạy chương trình thì Form1 mở lên trước.
- Nhấn vào button Show thì hiện ra Form2.
- Trên Form2, khi nhấn nút Disable thì button Test ở Form1 Disable và text của button trên Form2 đổi thành Enable. Khi nhấn vào button Enable thì button Test trên Form1 Enable và button trên Form2 đổi thành Disable.

Hướng dẫn:
Bên Form1 code như sau:
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public void DisEna()
        {
            if (btnTest.Enabled == false)
            {
                btnTest.Enabled = true;
            }
            else
            {
                btnTest.Enabled = false;
            }
        }

        private void btnShow_Click(object sender, EventArgs e)
        {
            Form2 f2 = new Form2();
            f2.MyDelegate = DisEna;
            f2.Show();
        }
    }

Bên Form2 bạn code như sau:
public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        public delegate void DoSomeThing(); //Khai báo delegate DoSomaThing
        public DoSomeThing MyDelegate; //Khởi tạo

        private void btnDisEna_Click(object sender, EventArgs e)
        {
            MyDelegate(); //Gọi hàm MyDelegate (đây chính là hàm DisEna bên Form1)
            if (btnDisEna.Text == "Disable")
            {
                btnDisEna.Text = "Enable";
            }
            else
            {
                btnDisEna.Text = "Disable";
            }
        }
    }

Không có nhận xét nào:

Đăng nhận xét