2009-09-08 71 views
13

Tôi đang tìm một số mã cho phép dễ dàng sắp xếp nhiều trình xử lý sự kiện cho một sự kiện duy nhất của đối tượng ... Tôi cần nó rất nhiều cho kiến ​​trúc plugin của mình, vì vậy tôi đã thực hiện một số thay thế cho điều đó Tuy nhiên, tôi không thích giải pháp của tôi cho điều đó, vì vậy tôi muốn biết ý tưởng/giải pháp/mẹo của bạn là gì ... Giải pháp của tôi chỉ là một danh sách với các mục như eventName: string; proc: TMyEventProc; trong đó TMyEventProc nhận hai đối số, người gửi và eventData: con trỏ. tùy thuộc vào tên của sự kiện, eventData trỏ đến bản ghi/đối tượng khác nhau.Delphi VCL cho Win32 - nhiều trình xử lý sự kiện

Thật không may điều này đòi hỏi phải khai báo nhiều, nhiều bản ghi để được chuyển làm đối số. Phương pháp này cũng rất chậm và yêu cầu triển khai thực hiện cuộc gọi "yêu cầu gọi lại" trong khi sự kiện "thực" bị tấn công.

Trả lời

10

Tôi đã triển khai giải pháp này hoạt động chỉ trong mọi phiên bản Delphi - ban đầu nó được triển khai trong Delphi 7, mặc dù tôi chưa thử nghiệm trong các phiên bản trước (nhưng nếu bạn đang sử dụng Delphi 7, thì đó là tất cả những gì bạn cần biết, đúng không?). :)

iirc điều này ít nhất là một phần cảm hứng cho bài đăng của Allen Bauer. Bạn có thể xem triển khai của tôi được minh họa trong một số video và tải xuống mã from my blog:

Các bài đăng mà bạn quan tâm được gắn thẻ "đa hướng". Liên kết tải xuống cho mã cuối cùng là available in this post.

Trong cách tiếp cận của tôi, bạn lấy được một lớp học từ TMultiCastEvent. Tất cả các lớp dẫn xuất của bạn phải làm là thực hiện một số loại bảo vệ an toàn đơn giản để thêm, loại bỏ và gọi một sự kiện với một chữ ký cụ thể.

Việc triển khai TNotifyEvent - thủ tục (Tên người gửi: TObject) - được cung cấp cùng với việc thực hiện cả hai "để giúp bạn đi" (các sự kiện phát đa hướng "hữu ích" là thông báo đơn giản) và cũng là ví dụ về cách lấy multicast các lớp sự kiện cho các chữ ký sự kiện cụ thể.

Khi bạn có lớp sự kiện phát đa hướng, bạn có thể sử dụng "trình xử lý sự kiện" thông thường thay thế cho nhau bằng phiên bản nhiều phiên bản, ví dụ: đưa ra một số lớp nút tưởng tượng với sự kiện On_Click nhiều diễn viên (tôi đã áp dụng quy ước interposing một gạch dưới trong tên sự kiện để xác định nó dưới dạng multicast, so với các sự kiện "uni-cast" thông thường):

Mã chỉ định một handler cho một sự kiện click unicast:

Button.OnClick := MyClickHandler; 

có thể trực tiếp thêm rằng xử lý tương tự với một đa-cast Thông báo sự kiện:

MultiCastButton.On_Click.Add(MyClickHandler); 

thực hiện của tôi cũng bao gồm một số cải tiến, chẳng hạn như khả năng tắt các sự kiện và xử lý tự động lại di chuyển từ xử lý khi đối tượng thực hiện bị phá hủy (điều này liên quan đến một số lượng nhỏ của vệ sinh mà có thể được bỏ qua nếu cần thiết nhưng có thể hữu ích trong những trường hợp nhất định).

Tất cả đều được mô tả và minh họa trong bài đăng trên blog của tôi.

Tận hưởng. :)

+2

+1; BTW: Đây là danh sách các bài đăng sự kiện nhiều diễn viên của bạn: http://www.deltics.co.nz/blog/?tag=multicast-events –

+0

cảm ơn vì nỗ lực của bạn nhưng tại sao bạn không xuất bản mẫu để hiển thị Làm thế nào để sử dụng nó? – FLICKER

2

Allen Bauer có a blog post about multicast events có thể hữu ích. Nó chỉ hoạt động cho Delphi 2009 hoặc mới hơn, mặc dù.

EDIT: Nếu bạn vẫn ở trên D7, bạn vẫn có thể thực hiện công việc này nếu bạn không cần quá nhiều chữ ký sự kiện khác nhau. Hãy thử nhìn vào mã của Allen và xem bạn có thể thích nghi nó với một giải pháp không chung chung hay không.

+0

thật không may, tôi đang sử dụng D7 Cá nhân ... Tôi là sinh viên nghèo;) Không đủ khả năng D2009 ... – migajek

+0

Tôi nghe bạn. Tôi thực sự muốn nhìn thấy một ấn bản cá nhân của D2009, nhưng dường như giải phóng một trong những sẽ cắt giảm doanh số bán hàng Delphi chuyên nghiệp quá nhiều, và không giống như Microsoft, Embarcadero không có đơn vị không dev lớn đưa tiền để trợ cấp đó. –

+3

Câu hỏi đặt ra là trong thời gian dài là "Embarcadero có khả năng KHÔNG có phiên bản giá rẻ cho 'học sinh nghèo' và người có sở thích" –

1

Nếu bạn đang triển khai hệ thống plugin, tôi nghĩ, bạn không thể bỏ qua các trình xử lý sự kiện - có thể là phát đa hướng hay không. Tôi khuyên bạn nên xem observer pattern. Có thể âm thanh một chút quá dài gần các sự kiện phát đa hướng nhưng ít nhất là linh hoạt hơn khi bạn cần.

+0

thực sự tôi biết rằng patter, mặc dù tôi không biết tên của nó;) anyway những gì tôi cần là một số loại tự động hóa trong khi tích hợp với VCL. Tôi có nhiều loại điều khiển mà tôi cần phải nắm bắt các sự kiện ... – migajek

Các vấn đề liên quan