Từ 1 tới 8 trên tổng số 8 kết quả

Đề tài: Dùng delagate để từ form main gọi hàm thực thi của từng form con.

  1. #1
    Ngày gia nhập
    08 2010
    Nơi ở
    bình dương
    Bài viết
    275

    Mặc định Dùng delagate để từ form main gọi hàm thực thi của từng form con.

    Em mới học tìm hiểu về delegate nên còn nhiều cái chưa rõ, em có đọc bài viết http://diendan.congdongcviet.com/thr...inh-csharp.cpp hướng dẫn cách từ form 2 thay đổi text của form 1. Nhưng giờ em muốn làm như sau mà chưa biết cách nào làm, có ai rành chỉ em với nếu có demo ví dụ thì càng tốt.
    Em có một cái form main, form con.ở form con sẽ có một label , và một hàm để set text cho label này. Trên cái form main có một cái button, khi bấm vào button thì sẽ tạo ra 1 thể hiện mới của form con (tạo ra n cái form con). có một ô textbox để nhập text, khi nhập text thì sẽ gọi hàm thay đổi text của các form con kia, hoặc có thể thay đổi text của một form nào đó bất kỳ ví dụ như em có một biến i = 0, mỗi khi ấn button tạo form thì nó lấy giá trị của i này để đặt tên cho form con được tạo ra, rồi tăng giá trị của i tăng lên, lúc em muốn set text của form 1 hoặc 2 thì thông qua cái tên đó.
    Theo em là mỗi lần tạo form sẽ đăng ký một delegate, sau đó ở hàm main sẽ có một list lưu lại danh sách các delegate này , khi muốn thao tác với form nào thì sẽ dùng cái delegate đăng ký đó để gọi hàm, mà chưa biết các làm hay xử lý như thế nào.

    Em cảm ơn mọi người

  2. #2
    Ngày gia nhập
    08 2012
    Bài viết
    574

    Cái này theo mình nghĩ là đâu cần đến hàm ủy nhiệm. Mà có lẽ cũng không phải cần đến cái trường i để đếm.
    Bạn chỉ cần lưu tập hợp các form con thôi, rồi dùng nó để gọi gán văn bản cho nhãn của các form con.

    ---- Cập nhật ----
    Diễn thử:

    Form Manager:
    Hình:
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		Manager.png
Lần xem:	1
Size:		16.0 KB
ID:		15346
    Mã:
    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Windows.Forms;
    4.  
    5. namespace TestAndDemo {
    6.     public partial class Manager : Form {
    7.  
    8.         List<Child> CS;
    9.  
    10.         public Manager() {
    11.             CS = new List<Child>();
    12.             InitializeComponent();
    13.         }
    14.  
    15.         private void btnNewChild_Click(object sender, EventArgs e) {
    16.             Child C = new Child(); // Child mới
    17.             string T = "Child form " + CS.Count; // Tên
    18.             clbChilds.Items.Add(T, true); // Thêm vào CheckListBox
    19.             C.Text = T; // Đổi tiêu đề form Child
    20.             C.Disposed += new EventHandler(Child_Disposed); // Đăng kí sự kiện khi đóng nó
    21.             C.Show(); // Hiện
    22.             CS.Add(C); // Thêm vào danh sách quản lý
    23.         }
    24.  
    25.         private void btnSetChildText_Click(object sender, EventArgs e) {
    26.             Child T = null;
    27.             for (int i = 0; i < clbChilds.CheckedIndices.Count; i++) {
    28.                 T = CS[clbChilds.CheckedIndices[i]];
    29.                 if (T != null)
    30.                     T.SetLabelText(txtChildText.Text); // Nếu được chọn thì thay đổi nhãn
    31.             }
    32.         }
    33.  
    34.         // Dùng hàm ủy nhiệm với mục đích phụ là khi form Child đóng thì sẽ loại bỏ nó khỏi CheckListBox
    35.         // Không dùng cũng chẳng sao
    36.         private void Child_Disposed(object sender, EventArgs e) {
    37.             for (int i = 0; i < CS.Count; i++) {
    38.                 if (CS[i] == sender) {
    39.                     clbChilds.Items.RemoveAt(i);
    40.                     CS.RemoveAt(i);
    41.                     break;
    42.                 }
    43.             }
    44.         }
    45.     }
    46. }

    Form Child:
    Hình:
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		Child.png
Lần xem:	1
Size:		15.0 KB
ID:		15345
    Mã:
    Visual C# Code:
    1. using System.Windows.Forms;
    2.  
    3. namespace TestAndDemo {
    4.     public partial class Child : Form {
    5.         public Child() {
    6.             InitializeComponent();
    7.         }
    8.  
    9.         public void SetLabelText(string V) {
    10.             lblText.Text = V; // Nhãn
    11.         }
    12.     }
    13. }
    Đã được chỉnh sửa lần cuối bởi SITUVNX : 27-06-2014 lúc 01:24 AM.
    Ctrl + Space is your friend!
    Exception is your teacher!

    Java: http://docs.oracle.com/javase/7/docs/api/overview-summary.html
    .NET: http://msdn.microsoft.com/en-us/library/gg145045(v=vs.110).aspx

  3. #3
    Ngày gia nhập
    08 2010
    Nơi ở
    bình dương
    Bài viết
    275

    Trích dẫn Nguyên bản được gửi bởi SITUVNX Xem bài viết
    Cái này theo mình nghĩ là đâu cần đến hàm ủy nhiệm. Mà có lẽ cũng không phải cần đến cái trường i để đếm.
    Bạn chỉ cần lưu tập hợp các form con thôi, rồi dùng nó để gọi gán văn bản cho nhãn của các form con.

    ---- Cập nhật ----
    Diễn thử:

    Form Manager:
    Hình:
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		Manager.png
Lần xem:	1
Size:		16.0 KB
ID:		15346
    Mã:
    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Windows.Forms;
    4.  
    5. namespace TestAndDemo {
    6.     public partial class Manager : Form {
    7.  
    8.         List<Child> CS;
    9.  
    10.         public Manager() {
    11.             CS = new List<Child>();
    12.             InitializeComponent();
    13.         }
    14.  
    15.         private void btnNewChild_Click(object sender, EventArgs e) {
    16.             Child C = new Child(); // Child mới
    17.             string T = "Child form " + CS.Count; // Tên
    18.             clbChilds.Items.Add(T, true); // Thêm vào CheckListBox
    19.             C.Text = T; // Đổi tiêu đề form Child
    20.             C.Disposed += new EventHandler(Child_Disposed); // Đăng kí sự kiện khi đóng nó
    21.             C.Show(); // Hiện
    22.             CS.Add(C); // Thêm vào danh sách quản lý
    23.         }
    24.  
    25.         private void btnSetChildText_Click(object sender, EventArgs e) {
    26.             Child T = null;
    27.             for (int i = 0; i < clbChilds.CheckedIndices.Count; i++) {
    28.                 T = CS[clbChilds.CheckedIndices[i]];
    29.                 if (T != null)
    30.                     T.SetLabelText(txtChildText.Text); // Nếu được chọn thì thay đổi nhãn
    31.             }
    32.         }
    33.  
    34.         // Dùng hàm ủy nhiệm với mục đích phụ là khi form Child đóng thì sẽ loại bỏ nó khỏi CheckListBox
    35.         // Không dùng cũng chẳng sao
    36.         private void Child_Disposed(object sender, EventArgs e) {
    37.             for (int i = 0; i < CS.Count; i++) {
    38.                 if (CS[i] == sender) {
    39.                     clbChilds.Items.RemoveAt(i);
    40.                     CS.RemoveAt(i);
    41.                     break;
    42.                 }
    43.             }
    44.         }
    45.     }
    46. }

    Form Child:
    Hình:
    Click vào hình ảnh để lấy hình ảnh lớn

Tên:		Child.png
Lần xem:	1
Size:		15.0 KB
ID:		15345
    Mã:
    Visual C# Code:
    1. using System.Windows.Forms;
    2.  
    3. namespace TestAndDemo {
    4.     public partial class Child : Form {
    5.         public Child() {
    6.             InitializeComponent();
    7.         }
    8.  
    9.         public void SetLabelText(string V) {
    10.             lblText.Text = V; // Nhãn
    11.         }
    12.     }
    13. }
    Cảm ơn bạn, thật ra mình đang học về delegate nên mình muốn dùng nó để làm, chứ không phải theo các list form con này. Cảm ơn bạn nha

  4. #4
    Ngày gia nhập
    08 2010
    Nơi ở
    bình dương
    Bài viết
    275

    Mặc định hic

    Trích dẫn Nguyên bản được gửi bởi haidn_1108 Xem bài viết
    Quan tâm bài viết của bạn, bài viết của bạn có mấy cái tui cần! Có gì còn chưa rõ tui liên hệ nhờ bạn giúp ha! Cảm ơn bạn!
    Mà mình vẫn chưa làm được

  5. #5
    Ngày gia nhập
    08 2012
    Bài viết
    574

    Trích dẫn Nguyên bản được gửi bởi tuanngocpt Xem bài viết
    Mà mình vẫn chưa làm được
    Thằng đó Spam đó.

    Nếu bạn học hàm ủy nhiệm thì mình sẽ làm cho bạn.

    Hình thì cũng như cũ, nhưng theo yêu cầu của bạn thì Manager sẽ chỉ có 1 Nút bấm (Button) và 1 Ô nhập chữ (TextBox).
    Ô nhập chữ với Bổ từ truy cập là public hoặc internal. Thuộc tính Modifiers trong phần Thiết kế giao diện đồ họa là Public hoặc Internal. Cái này đáng lẽ mình không chỉ, bạn nên biết nó.
    Manager:
    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Windows.Forms;
    4. using System.Drawing;
    5.  
    6. namespace TestAndDemo {
    7.     public partial class Manager : Form {
    8.  
    9.         int CC = 0;
    10.  
    11.         public Manager() {
    12.             InitializeComponent();
    13.         }
    14.  
    15.         private void btnNewChild_Click(object sender, EventArgs e) {
    16.             Child C = new Child(this); // Child mới
    17.             C.Text = "Child form " + (CC++); // Tên theo số.
    18.             C.Show(); // Hiện
    19.         }
    20.     }
    21. }

    Child:
    Visual C# Code:
    1. using System.Windows.Forms;
    2. using System;
    3.  
    4. namespace TestAndDemo {
    5.     public partial class Child : Form {
    6.         public Child(Manager P) {
    7.             InitializeComponent();
    8.             // Đăng kí sự kiện khi ô nhập chữ có thay đổi.
    9.             P.txtChildText.TextChanged += new EventHandler(txtChildText_TextChanged);
    10.         }
    11.  
    12.         private void txtChildText_TextChanged(object sender, EventArgs e) {
    13.             // Gán giá trị mới từ ô nhập sang nhãn ở form này.
    14.             this.lblText.Text = ((TextBox)sender).Text;
    15.         }
    16.     }
    17. }
    Đã được chỉnh sửa lần cuối bởi SITUVNX : 27-06-2014 lúc 10:39 PM.
    Ctrl + Space is your friend!
    Exception is your teacher!

    Java: http://docs.oracle.com/javase/7/docs/api/overview-summary.html
    .NET: http://msdn.microsoft.com/en-us/library/gg145045(v=vs.110).aspx

  6. #6
    Ngày gia nhập
    08 2010
    Nơi ở
    bình dương
    Bài viết
    275

    Mặc định Dùng delagate để từ form main gọi hàm thực thi của từng form con.

    Trích dẫn Nguyên bản được gửi bởi SITUVNX Xem bài viết
    Thằng đó Spam đó.

    Nếu bạn học hàm ủy nhiệm thì mình sẽ làm cho bạn.

    Hình thì cũng như cũ, nhưng theo yêu cầu của bạn thì Manager sẽ chỉ có 1 Nút bấm (Button) và 1 Ô nhập chữ (TextBox).
    Ô nhập chữ với Bổ từ truy cập là public hoặc internal. Thuộc tính Modifiers trong phần Thiết kế giao diện đồ họa là Public hoặc Internal. Cái này đáng lẽ mình không chỉ, bạn nên biết nó.
    Manager:
    Visual C# Code:
    1. using System;
    2. using System.Collections.Generic;
    3. using System.Windows.Forms;
    4. using System.Drawing;
    5.  
    6. namespace TestAndDemo {
    7.     public partial class Manager : Form {
    8.  
    9.         int CC = 0;
    10.  
    11.         public Manager() {
    12.             InitializeComponent();
    13.         }
    14.  
    15.         private void btnNewChild_Click(object sender, EventArgs e) {
    16.             Child C = new Child(this); // Child mới
    17.             C.Text = "Child form " + (CC++); // Tên theo số.
    18.             C.Show(); // Hiện
    19.         }
    20.     }
    21. }

    Child:
    Visual C# Code:
    1. using System.Windows.Forms;
    2. using System;
    3.  
    4. namespace TestAndDemo {
    5.     public partial class Child : Form {
    6.         public Child(Manager P) {
    7.             InitializeComponent();
    8.             // Đăng kí sự kiện khi ô nhập chữ có thay đổi.
    9.             P.txtChildText.TextChanged += new EventHandler(txtChildText_TextChanged);
    10.         }
    11.  
    12.         private void txtChildText_TextChanged(object sender, EventArgs e) {
    13.             // Gán giá trị mới từ ô nhập sang nhãn ở form này.
    14.             this.lblText.Text = ((TextBox)sender).Text;
    15.         }
    16.     }
    17. }
    Cảm ơn bạn nha. Giờ mình muốn hỏi thêm chút nữa, giờ mình muốn khi text ở form Manager thay đổi thì chỉ form child nào mình chọn sẽ thay đổi thì làm sao bạn. Theo mình hiểu thì cái này nó là multicast đúng không bạn, chứ không phải nó lưu từng cái delegate của từng form rồi gọi lại

  7. #7
    Ngày gia nhập
    08 2012
    Bài viết
    574

    Có 2 cách:
    - Bạn tạo CheckListBox quản lí cái nào được phép thay đổi.
    - Bạn làm CheckBox ở Child để đánh dấu nó được thay đổi không.

    Multicast Delegates thì ở trên mình có làm đấy. Một hàm ủy nhiệm mà có nhiều phương thức đăng kí.
    Mỗi lần P.txtChildText.TextChanged += new EventHandler(txtChildText_TextChanged); là mỗi lần thêm phương thức vào hàm ủy nhiệm, nó ra multicast rồi đó.

    Còn trường hợp bạn không muốn cho nó thay theo Manager thì bạn bỏ nó đi. Thêm thì += còn bỏ thì -=.
    Ctrl + Space is your friend!
    Exception is your teacher!

    Java: http://docs.oracle.com/javase/7/docs/api/overview-summary.html
    .NET: http://msdn.microsoft.com/en-us/library/gg145045(v=vs.110).aspx

  8. #8
    Ngày gia nhập
    08 2010
    Nơi ở
    bình dương
    Bài viết
    275

    Trích dẫn Nguyên bản được gửi bởi SITUVNX Xem bài viết
    Có 2 cách:
    - Bạn tạo CheckListBox quản lí cái nào được phép thay đổi.
    - Bạn làm CheckBox ở Child để đánh dấu nó được thay đổi không.

    Multicast Delegates thì ở trên mình có làm đấy. Một hàm ủy nhiệm mà có nhiều phương thức đăng kí.
    Mỗi lần P.txtChildText.TextChanged += new EventHandler(txtChildText_TextChanged); là mỗi lần thêm phương thức vào hàm ủy nhiệm, nó ra multicast rồi đó.

    Còn trường hợp bạn không muốn cho nó thay theo Manager thì bạn bỏ nó đi. Thêm thì += còn bỏ thì -=.
    Thanks bạn nha, mình đã hiểu rồi

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