30/09/2018, 23:35

Hỏi về delegate và event trong winform C#

Đây là phần đăng ký sự kiện trong C#

Giờ em muốn coi phần thực thi cái delegate thì em phải làm sao mọi người
Tức là phần this.button1.Click(param1, param2);

Đỗ Trung Quân viết 01:41 ngày 01/10/2018

Lúc bạn đăng ký xong nó tự gen ra 1 cái hàm button1_Click cho bạn rồi chứ.
nếu không thì tự viết

  void Page_Load(Object sender, EventArgs e)
    {
        // Manually register the event-handling method for
        // the Click event of the Button control.
        Button1.Click += new EventHandler(this.GreetingBtn_Click);
    }

    void button1_Click (Object sender,
                           EventArgs e)
    {
        // When the button is clicked,
        // change the button text, and disable it.

        Button clickedButton = (Button)sender;
        clickedButton.Text = "...button clicked...";
        clickedButton.Enabled = false;

        // Display the greeting label text.
        GreetingLabel.Visible = true;
    }

Source

Lê Hải Sơn viết 01:43 ngày 01/10/2018

Bạn phải hiểu nguyên lí của delegate và event, theo ý hiểu của mình về câu hỏi của bạn thực chất cái bạn muốn xem không phải là xem cái delegate hay sự kiện j ở đây cả , mình nghĩ bạn muốn xem tại sao khi bạn click vào nút button thì n lại hiểu đk đấy là click và xử lí sự kiện ở đó, Nguyên lí chính cơ bản vẫn nằm ở cái lập tư duy lập trình thôi và cái bạn muốn xem n ko phải là delegate mà là các phương thức hoạt động trong class Button. Đại loại là như thế này . Giả định rằng trong class button ( bạn không thể xem code đk vì Microsoft winform là mã nguồn đóng, bạn chỉ có thể xem cấu trúc các chức năng thôi , muốn xem được bạn tải .Net reflector nhá) nó có một phương thức là runButton(), để nhận được sự kiện click thì có thể sử dụng 2 cách là cho một vòng lặp vô hạn ,mỗi đoạn cuối vòng lặp chương trình kiểm tra xem có ai nháy chuột vào ko thì xử lí, hoặc một cách xử lí sự kiện theo phương pháp ngắt , khi có sự kiện bên ngoài thì có một ngắt tác động vào và chuyển quyền yêu cầu đến vi xử lí. Trong .Net C# người ta không muốn lập trình lộ kiệu vậy nên người ta tạo ra delegate, theo đó có 2 đối tượng 1 là đối tượp pulisher(tạo, phát sinh sự kiện) và một đối tượng subcireser(thực thi sự kiện), cái runButton() là phương thức nằm trong đối tượng publiser ( Tức là button ) . còn cái subcriser là cái hàm xử lí khi sự kiện được kích hoạt tức cái hàm đăng kí ở lớp subcirer( WinForm) , 2 cái này giao tiếp vs nhau qua cơ chế delegate / event. Có một mô hình chuẩn của việc tạo puliser và subcires do Microsoft đề nghị . Bạn có thể đọc thêm trong cuốn C# 6.0 in a nuttshell

Hoàng Anh viết 01:48 ngày 01/10/2018

Bạn hiểu ý của mình rồi đấy
Nhưng bạn giải thích mình chưa hiểu lắm (chắc cần thời gian suy nghĩ để thông)

Cảm ơn mọi người nhiều nhe

Lê Hải Sơn viết 01:50 ngày 01/10/2018

Bạn đọc cuốn C# in a nutshell đi, tạm hiểu là , bình thường làm với C , cụ thể là xử lí sự kiện game đúng không, bạn phải có một vòng while vô tận, vào trong mỗi lần lặp thì bạn phải kiểm tra xem có sự kiện bấm phím nào không , thường ta dùng ‘’’ char c = getch() ‘’’ , để bắt sự kiện phím rùi từ sự kiện phím đi xử lí tất cả các cái khác . Nhưng mà người ta thấy làm việc với cái này rất là cồng kềnh và không phù hợp trong môi trường có đồ họa với việc xử lí nhiều tương tác sự kiện, người ta sẽ nâng cấp cái này lên bằng cách gọi gọn và che giấu vòng lặp và sự kiểm tra trong lớp, đối tượng bên ngoài tác động vào lớp này, không cần biết và không cần hiểu làm sao lớp này có thể hiểu được sự kiện mà chỉ cần hiểu được rằng khi tác động lên lớp này một hành động nào đó, thì họ nhận được một sự phản ứng như thế nào . Giống như bạn biết cái lớp button có sự kiện click , bạn chả cần biết bên trong nó có j ,bạn chỉ cần hiểu là cái button này n có sự kiện click và khi click thì sẽ có phản ứng j, ( có thể show ra một form mới, một messeage) . Tất nhiên mình nói thế này là ở góc độ của lớp subcriser, tức là lớp xử lí sự kiện khi sự kiện xảy ra, còn khi bạn xây dựng lớp publisher thì bạn phải hiểu đk cách nhận biết sự kiện, Mô hình này có 3 thành phần, thành phần thứ nhất là lớp được kế thừa từ lớp EventArgs , cái lớp này mang thông tin sự kiện , ví dụ như sự kiện vẽ paint trong form nó cho bạn Lớp PainEventArgs ,lớp này là lớp tryền thông tin thông tin của sự kiện có thể là , khi nhận một sự kiện paint , lớp này mang theo vị trí con trỏ chuột nằm ở đâu trên màn hình, màu sắc của cây bút vẽ… , để truyền đến phương thức của subcriser. Thành phần thứ 2 là một delegate để khai báo sự kiện. ở đây mình khai báo là private Delegate void PaintEventHandle(object sender, PainEventArgs e) , thành phần thứ 3 là một event khai báo là public PaintEventHandle OnPaintEventArgs … nói chung bạn học C# thì nên đọc những quyển gốc của n, vì Công nghệ .net rất là rộng lớn , delegate event chỉ đơn giản là những phần nhỏ trong toàn bộ cái nền tảng này.

Bài liên quan
0