Phần này sẽ miêu tả cách bạn có thể tạo ra reactor (bộ phản ứng) để trả lời lại những kiểu sự kiện khác nhau và đăng ký reactor với đối tượng thích hợp để nhận các thông báo.
Tổng quan về Thông báo
Khi một sự kiện xảy ra trong hệ thống, các đối tượng nhất định, được gọi là notifier (người thông báo), sẽ tự động chuyển tiếp sự kiện đến các đối tượng khác. Ví dụ khi người dùng copy, xóa hay thay đổi một đối tượng hoặc khi người dùng sử dụng UNDO hay REDO một lệnh nào đó, một thông báo tương ứng với mỗi sự kiện sẽ được tự động tạo ra.
Các đối tượng nhận sự kiện gọi là các reactor. Một reactor phải được bổ sung rõ ràng vào danh sách các reactor của notifier trước khi nó có thể nhận được sự kiện từ notifier. Một notifier có thể có một số reactor nhất định trong danh sách của nó. Định nghĩa của lớp reactor bao gồm rất nhiều hàm thông báo. Khi một sự kiện xảy ra, notifier tự động đánh thức một hàm thông báo tương ứng với mỗi reactor trong danh sách của nó.
Để sử dụng một reactor trong ứng dụng
- Dẫn xuất một lớp reactor mới và thực thi chức năng thông báo cho các sự kiện mà reactor sẽ phản ứng lại.
- Khởi tạo một reactor.
- Thêm reactor vào danh sách của notifier.
Khi hoàn thành sử dụng reactor
- Loại bỏ reactor từ danh sách của tất cả các notifier mà nó được thêm vào.
- Xóa reactor (trừ khi nó là một đối tượng thường trú của cơ sở dữ liệu).
Sử dụng reactor đòi hỏi việc tạo ra lớp con của lớp reactor hay lớp AcDbObject. Mục này giả sử rằng bạn đã làm quen với các tài liệu được trình bày trong chương 12, Dẫn xuất một lớp đối tượng ObjectARX mới, và chương 13, Dẫn xuất từ lớp AcDbObject.
Các lớp Reactor Classes
Các đối tượng Reactor được dẫn xuất từ AcRxObject, không phải AcDbObject. Bởi vì những reactor không phải là đối tượng cơ sở dữ liệu, nên quyền sở hữu sẽ không được áp dụng ở đây, và chúng cũng không có mã định danh ObjectId.
Các kiểu reactor khác nhau sẽ nhận những kiểu sự kiện thông báo khác nhau. Một reactor CSDL (dẫn suất từ AcDbDatabaseReactor) nhận các sự kiện có liên quan đến trạng thái của CSDL. Ví dụ khi một đối tượng được thêm vào CSDL, được chỉnh sửa hay xóa bỏ trong CSDL. Lúc đó, notifier của reactor sẽ là CSDL, vì thế nó được bổ sung vào danh sách reactor của AcDbDatabase. Một đối tượng reactor (dẫn xuất từ AcDbObjectReactor) phản ứng lại với các sự kiện ở mức độ đối tượng, như khi copy, xóa hay chỉnh sửa một đối tượng. Nó có thể được thêm vào danh sách reactor của bất kì một AcDbObject nào. Một reactor chỉnh sửa (dẫn xuất từ AcEditorReactor) phản ứng với các sự kiện của AutoCAD như mở và đóng một bản vẽ, bắt đầu và kết thúc một lệnh, và nhiều kiểu tương tác người dùng khác. Đối tượng AcEditor chỉ là một notifier của một AcEditorReactor. Dưới đây là cây phân lớp của lớp reactor:
AcRxObject
|- AcApDocManagerReactor
|- AcApLongTransactionReactor
|- AcDbDatabaseReactor
|- AcDbLayoutManagerReactor
|- AcDbObjectReactor
| |- AcDbEntityReactor
| |- AcDbRasterImageDefFileAccessReactor
| |- AcDbRasterImageDefTransReactor
|- AcEdInputContextReactor
|- AcRxDLinkerReactor
|-AcRxEventReactor
| |- AcEditorReactor
|-AcTransactionReactor
AcDbSummaryInfoReactor
Các kiểu đối tượng Reactor
Các lớp reactor ở trên được còn được gọi là các lớp reactor nhất thời (transient reactor). Nếu muốn chương trình của mình nhận được các thông báo sự kiện, bạn nên thường xuyên sử dụng reactor, nó sẽ theo dõi các sự kiện xảy ra trong đối tượng cơ sở dữ liệu. Chúng cũng theo dõi các sự kiện cơ sở dữ liệu, tương tác người dùng, và các sự kiện hệ thống khác khi ứng dụng đang chạy.
Một kiểu reactor khác, gọi là reactor liên tục (persistent reactor), sử dụng đối tượng CSDL (một đại liện của lớp AcDbObject hay các lớp dẫn xuất) như một reactor. Đối tượng CSDL có thể nhận cũng như gửi thông báo. Reactor liện tục phụ thuộc bên trong CSDL, là một phần của CSDL, vì thế chúng được bảo toàn trong các tệp tin DWG và DXF và sẽ được tái lập khi bản vẽ được tải.
Một kiểu reactor khác, gọi là reactor liên tục (persistent reactor), sử dụng đối tượng CSDL (một đại liện của lớp AcDbObject hay các lớp dẫn xuất) như một reactor. Đối tượng CSDL có thể nhận cũng như gửi thông báo. Reactor liện tục phụ thuộc bên trong CSDL, là một phần của CSDL, vì thế chúng được bảo toàn trong các tệp tin DWG và DXF và sẽ được tái lập khi bản vẽ được tải.
Để sử dụng một AcDbObject như là một reactor
- Dẫn xuất một đối tượng AcDbObject mới và thực hiện các hàm thông báo cho mỗi sự kiện mà đối tượng sẽ phản ứng lại.
- Khởi động một đối tượng reactor.
- Thêo đối tượng reactor vào trong CSDL và tim một chủ sở hữu thích hợp, tốt hơn hết là một đối tượng container để nó được ghép vào một cách chính xác.
- Thêm đối tượng reactor vào danh sách của notifier bằng hàm addPersistentReactor(). Hàm này yêu cầu bạn phải cung cấp mã ObjectId của đối tượng reactor được tạo ra từ bước 2.
AutoCAD® sẽ xóa đối tượng reactor bởi vì nó là một đối tượng CSDL.
Chú ý: Khi bạn copy một đối tượng, bất cứ reactor liên tục được thêm vào đối tượng sẽ được copy theo. Nhưng reactor nhất thời thì không như thế.
No comments:
Post a Comment