Trang 1 trên tổng số 6 123... Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 51 kết quả

Đề tài: Cách dùng delegate trong lập trình C#

  1. #1
    Ngày gia nhập
    09 2007
    Bài viết
    724

    Mặc định Cách dùng delegate trong lập trình C#

    Chào các bạn, nay mình xin làm một bài về tạo một delegate trong C#.
    - Delegate là gì? Nó có nghĩa là “ủy quyền”, hay là “ủy thác” nó tựa tựa như là con trỏ hàm trong C/C++ vậy.
    - Dùng nó khi mà ta đang ở chổ này, mà cần làm 1 việc gì đó ở chổ khác. Ví dụ đơn giản thế này. Bạn đang ở nhà của nhỏ bạn của bạn, nhỏ đó nhờ bạn sửa bài đồ án cuối kỳ cho nhỏ đó, bạn biết trước được như vậy nên trước khi đi bạn đưa chìa khóa phòng cho nhỏ em gái của mình nhờ nó ”mày cầm chìa khóa phòng anh nè”, xong tự dưng máy của nhỏ bạn đó bị cháy nguồn, giờ phải về phòng bạn làm bài, phòng bạn hết sức là lầy, nhiều rác, tô mì ăn cả tuần chưa rửa . Bạn alo gọi nhỏ em, “mày qua dẹp phòng cho anh đi, nhỏ bạn mà thây lầy quá nó chán anh thì toi ”. trong trường hợp này bạn không thể nào tự dẹp phòng mình được, phải nhờ con em nó làm cho vậy bạn đã ủy quyền cho nó 1 hành động nào đó có, bạn không biết là hành động nào trước để mà chuẩn bị, lúc này bạn phải nhờ người khác làm giùm.
    - Cũng tương tự như vậy trong lập trình, bạn không thể nào biết được trước trong một số trường hợp là phải tạo thuộc tính nào cho đối tượng của mình (ví dụ bạn tạo 1 usercontrol bạn không thể nào biết được hành động nào ứng với event click chuột vào đó, giả sử click chuột vào đó ở formA bạn cho ra 1 MessageBox, cũng event click chuột lên cái Usercontrol đó ở form khác thì bạn Set cái đoạn text của Usercontrol đó lên form đó).
    - Nói dài dòng quá giờ ví dụ cho các bạn luôn:
    Ví dụ khá đơn giản và đã post lên 4rum 1 lần rồi, nay mình post lại 1 lần nữa.
    Trên form1 có 2 lable, và 2 button, click vào button1 show form2 lên, form2 có 2 text box, 2textbox của form2 gõ gì, thì 2 lable của form1 show lên cái đó.
    Đây là hình của chương trình lúc chưa run.
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		delegate01.jpg
Lần xem:	754
Size:		17.8 KB
ID:		4992

    Bên form 1 bạn code như sau:

    Visual C# Code:
    1. public partial class Form1 : Form
    2. {
    3. public Form1()
    4. {
    5. InitializeComponent();
    6. }
    7.  public void GetValue(String str1, String str2)
    8. {// khai báo 1 hàm với 2 tham số đầu vào là str1, và str2 nó sẽ đưa dữ liệu vào 2 lable
    9.  label1.Text = str1;
    10. label2.Text = str2;
    11. }
    12. private void button1_Click(object sender, EventArgs e)
    13. {
    14.   Form2 f2 = new Form2();
    15. // ké thằng GetValue của form1 vào form2
    16.    f2.MyGetData = new Form2.GetString(GetValue);
    17.   f2.Show();
    18.  }
    19.    
    20.           private void button2_Click(object sender, EventArgs e)
    21.           {
    22.               Application.Exit();
    23.           }
    24.       }

    Bên form 2 bạn code như sau:


    Visual C# Code:
    1.   public partial class Form2 : Form
    2.       {
    3.           public Form2()
    4.           {
    5.               InitializeComponent();
    6.           }
    7.    
    8.   // khai báo 1 hàm delegate
    9.           public delegate void GetString(String MyString1, String MyString2);
    10.   // khai báo 1 kiểu hàm delegate
    11.           public GetString MyGetData;      
    12.    
    13.           private void button1_Click(object sender, EventArgs e)
    14.           {
    15.              
    16.               this.Close();
    17.           }
    18.          
    19.           private void textBox1_TextChanged(object sender, EventArgs e)
    20.           {
    21.               if (MyGetData != null)
    22.               {// tại đây gọi nó
    23.                   MyGetData(textBox1.Text, textBox2.Text);
    24.               }
    25.           }
    26.    
    27.           private void textBox2_TextChanged(object sender, EventArgs e)
    28.           {
    29.               if (MyGetData != null)
    30.               {// tại đây cũng gọi nó
    31.                   MyGetData(textBox1.Text, textBox2.Text);
    32.               }
    33.           }
    34.       }
    Đây là kết quả.
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		delegate02.jpg
Lần xem:	723
Size:		20.1 KB
ID:		4993
    Attached Files Attached Files
    Đã được chỉnh sửa lần cuối bởi zkday2686 : 06-12-2008 lúc 05:00 AM. Lý do: upload file demo

  2. #2
    Ngày gia nhập
    09 2006
    Bài viết
    5

    Mạn phép góp chút ý kiền nha các bạn !

    - Theo mình hiểu thì delgate là cơ chế tự động gọi lại 1 hoặc nhiều method. Về hình thức, Delegate là 1 khuôn mẫu mà các method đc gọi lại thông qua Delegate phải theo. VD ta có 1 delegate
    public delegate void myDelegate(String, Int16);
    Các method muốn đc gọi thông qua phải theo khuôn mẫu mà Delegate đã đặt ra (bao gồm giá trị trả về và danh sách tham số - ko bao gồm tên và modifier). VD:
    public void methodToCallBack(String str, Int16 n) {}
    Về bản chất, Delegate là 1 class, kế thừa từ MulticastDelegate, nên bạn có thể khai báo 1 Delegate ở bất cứ đâu bạn có thể khai báo 1 class.

    - Các method đc gọi lại thông qua Delegate có thể là 1 instance method, cũng có thể là 1 class method.VD:
    Visual C# Code:
    1. class MethodClass
    2. {
    3.     public void InstanceMethod((String str, Int16 n)  {} // (1)
    4.     static void ClassMethod((String str, Int16 n)  {} //(2)
    5. }
    - Delegate cũng có thể đc xem là 1 trình bọc (wrapper quanh 1 hoặc nhìu method sẽ đc gọi lạ). Trong 1 class nào đó bạn có thể khai báo delegate như sau:
    - Với method (1) bạn tạo 1 wrapper đến method như sau :
    Visual C# Code:
    1. MethodClass onj = new MethodClass ();
    2. myDelegate monoDelegate = new myDelegate(obj.InstanceMethod);
    - Với method (2) bạn tạo 1 wrapper đến method như sau :
    Visual C# Code:
    1. myDelegate monoDelegate = new myDelegate(MethodClass.ClassMethod);
    Hoặc có thể để 1 Delegate bao quanh nhiều method tương tự như sau:
    Visual C# Code:
    1. myDelegate delegate = null;
    2. multiDelegate += new myDelegate(obj.InstanceMethod);
    3. multiDelegate += new myDelegate(MethodClass.ClassMethod);
    - Khi 1 Delegate đc tạo để bao nhiều method thì khi đc gọi, lần lượt các method đã đc bao sẽ đc gọi.
    VD ta có lệnh gọi :
    mutiDelegate(“abc”, 10);
    thì lần lượt các method InstanceMethod, ClassMethod sẽ đc gọi với cùng tham số đa truyền vào lệnh gọi đến Delegate (ở đây là 1 String “abc” và 1 Int16 10)

    - Theo mình biết thì Delegate thường dùng để gọi lại các method từ 1 method bên khác, thường dùng để tạo các hàm xử lý sự kiện như trong VD của bạn chủ topic

    Chút ít ý kiến. Có j sai sót mọng nhận đc ý kiến của các bạn !

    Lưu ý để code vào tag code
    Đã được chỉnh sửa lần cuối bởi ZCoder87 : 20-12-2008 lúc 11:04 AM.

  3. #3
    Ngày gia nhập
    02 2008
    Bài viết
    88

    Mình thì lại thấy dùng Delegate để truyền dữ liệu như trên quá là rườm rà.
    Bây giờ ví dụ trên form mình lại có thêm những đối tượng khác, chẳng lẽ cứ muốn truyền dữ liệu cho cái nào thì phải tạo một cái delegate tương ứng hay sao?
    Mình từ Caulacbovb qua)
    Giã từ VB6 đến với VB.Net, C# và Java.

  4. #4
    Ngày gia nhập
    09 2007
    Bài viết
    724

    Mình thì lại thấy dùng Delegate để truyền dữ liệu như trên quá là rườm rà.
    Bây giờ ví dụ trên form mình lại có thêm những đối tượng khác, chẳng lẽ cứ muốn truyền dữ liệu cho cái nào thì phải tạo một cái delegate tương ứng hay sao?
    hì. đúng như anhtuyenbk nói
    nó hơi rườm rà nhưng nó khỏe hơn trong 1 số trường hợp

    như nếu dùng UserControl thì mình thấy trong 1 số trường hợp, chúng ta dùng delegate thì code sẽ dễ hơn, uyển chuyển hơn... rất nhiều so với dùng properties.

  5. #5
    Ngày gia nhập
    11 2007
    Nơi ở
    Biết để làm gì?
    Bài viết
    827

    Ngoài sử dụng delegate và properties thì vẫn còn 1 số cách để truyền dữ liệu giữa 2 form.Tùy trường hợp mà ta sử dụng thôi.Tham khảo các cách khác ở đây
    Ref Link Code:
    Cánh Chym ứ mỏi

  6. #6
    Ngày gia nhập
    09 2006
    Bài viết
    5

    Mặc định Cách dùng delegate trong lập trình C#

    chắc zkday2686 muốn nêu ví dụ đó mà. Chứ thường người ta dùng Delegate để thiết kế event hoặc dùng cho remoting thôi, chứ truyền dữ liệu như vậy thì mệt thiệt

  7. #7
    Ngày gia nhập
    02 2008
    Bài viết
    88

    Nhanh nhất là truyền thẳng cái đối tượng Form1 vào constructor của Form2.
    Thế là truy xuất thoải mái.
    Mình từ Caulacbovb qua)
    Giã từ VB6 đến với VB.Net, C# và Java.

  8. #8
    Ngày gia nhập
    01 2009
    Bài viết
    201

    Code:
    public partial class Form1 : Form
    {
    public Form1()
    {
    InitializeComponent();
    }
     public void GetValue(String str1, String str2)
    {// khai báo 1 hàm với 2 tham số đầu vào là str1, và str2 nó sẽ đưa dữ liệu vào 2 lable
     label1.Text = str1;
    label2.Text = str2;
    }
    private void button1_Click(object sender, EventArgs e)
    {
      Form2 f2 = new Form2();
    // ké thằng GetValue của form1 vào form2
       f2.MyGetData = new Form2.GetString(GetValue);
      f2.Show();
     }
       
              private void button2_Click(object sender, EventArgs e)
              {
                  Application.Exit();
              }
          }
    xin hỏi các bạn là tại sao hàm GetValue có tận 2 tham số vậy mà khi khai báo trong new Form2.GetString(GetValue); thì nó không còn tham số nào ,bạn có thể giải thích cho mìinh được không,cảm ơn bạn nhiều

  9. #9
    Ngày gia nhập
    07 2007
    Nơi ở
    TP.HCM
    Bài viết
    199

    tại vì hàm Form2.GetString(...) nhận 1 tham số kiểu delegate. Còn GetValue trong Form2.GetString(GetValue); đóng vai trò là tham số truyền vào thôi chứ không phải là một lời gọi hàm đơn thuần.

    Có lẽ bạn chưa hiểu về Delegate, mình lấy ví dụ thế này cho bạn dễ hiểu nhé.
    Ta có một method FindMax tìm số lớn nhất như sau:
    Visual C# Code:
    1. void int FindMax(int[] myArray);
    2. {
    3.         int max = myArray[0];
    4.  
    5.         foreach (int i in myArray)
    6.         {
    7.             if (i > max)
    8.                 max = i;
    9.         }
    10.         return max;
    11. }

    Nhưng sau này bạn muốn tìm chuỗi lớn nhất thì sao nhỉ, bạn có thể nghĩ tới việc viết 1 hàm FindMax tổng quát cho một mảng array (bao gồm các object):
    Visual C# Code:
    1. void int FindMax(Array myArray)
    nhưng khổ nỗi lại không biết so sánh các object như thế nào, không thể viết objectA > objectB được, vì thế bạn nghĩ tới việc sẽ ủy quyền việc so sánh 2 phần tử cho 1 hàm delegate nào đó, nó sẽ như thế này:
    Visual C# Code:
    1.     static object FindMax(Array myArray, CompareHandler compare)
    2.     {
    3.         object max = myArray.GetValue(0);
    4.  
    5.         foreach (object obj in myArray)
    6.         {
    7.             if (compare(obj, max) > 0)
    8.                 max = obj;
    9.         }
    10.         return max;
    11.     }
    và hàm compare là một delegate có dạng CompareHandler . Đó là 1 delegate so sánh 2 phần tử, vì thế nó phải có dạng hàm như sau:
    Code:
    delegate int CompareHandler(object a, object b);
    Dạng hàm này trả về số int > 0 nếu a = b, < 0 nếu a < b, và > 0 nếu a > b.

    Như vậy là bạn đã làm xong hàm FindMax tìm phần tử lớn nhất trong 1 mảng tổng quát.

    Vậy sau này khi dùng ta chỉ cần định nghĩa 1 hàm compare cho kiểu dữ liệu mảng tương ứng đó thôi.

    Visual C# Code:
    1.     static int CompareInt(object a, object b)
    2.     {
    3.         return (int)a - (int)b;
    4.     }
    5.     static int CompareString(object a, object b)
    6.     {
    7.         return ((string)a).CompareTo((string)b);
    8.     }
    9.  
    10.     static void Main()
    11.     {
    12.         CompareHandler compareDelegate = null;
    13.  
    14.         int[] arrInt = { 1, 2, 5, 10, 3, 6 };
    15.         compareDelegate = CompareInt;
    16.         int maxInt = (int)FindMax(arrInt, compareDelegate);
    17.         Console.WriteLine("max = {0}", maxInt);
    18.  
    19.         string[] arrStr = { "1", "2", "5", "10", "3", "6" };
    20.         compareDelegate = CompareString;
    21.         string maxStr = (string)FindMax(arrStr, compareDelegate);
    22.         Console.WriteLine("max = {0}", maxStr);
    23.     }

  10. #10
    Ngày gia nhập
    03 2009
    Bài viết
    52

    cho mình hỏi là mình dùng cái này vào trong việc login được không?
    Nghĩa là khi login xong thì tên người login sẽ được hiển thị trên các form khác ý?
    học học nữa học mãi đúp học lại

Các đề tài tương tự

  1. Cơ bản Delegate trong lập trình C#
    Gửi bởi Yin Yang trong diễn đàn Tutorials và Thủ thuật lập trình C#, ASP.NET
    Trả lời: 11
    Bài viết cuối: 07-11-2012, 01:22 AM
  2. this.Invoke((MethodInvoker)delegate hàm này dùng làm gì
    Gửi bởi trankien trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 6
    Bài viết cuối: 27-05-2012, 04:06 AM
  3. Dùng delegate để truyền dữ liệu giữa 2 form C++.NET?
    Gửi bởi MrPhuongDeE trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 01-11-2011, 10:42 AM
  4. C# truyền dữ liệu 2 Form dùng Delegate, xin trợ giúp.
    Gửi bởi qhhqnavy trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 11
    Bài viết cuối: 12-07-2011, 10:03 AM
  5. Delegate trong C#, help me!
    Gửi bởi MaiLinh trong diễn đàn Nhập môn lập trình C#, ASP.NET
    Trả lời: 3
    Bài viết cuối: 23-10-2009, 09:27 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn