Public WithEvents ACADApp As AcadApplication Sub Example_AcadApplication_Events().[r]
(1)L
LÀÀMM VVIIỆỆCC VVỚỚII CCÁÁCC SSỰỰ KKIIỆỆNN
7
Trong chương này
Khái niệm kiện trong AutoCAD
Chỉ dẫn xây dựng xử lý kiện
Xử lý kiện mức ứng dụng
Xử lý kiện mức vẽ
Xử lý kiện mức đối tượng
Các kiện chẳng hạn thông báo thông
điệp AutoCAD, dùng để thông báo tới người dùng trạng thái phiên làm việc
(2)1 Khái niệm về sự kiện AutoCAD
Trong AutoCAD có loại kiện:
Các kiện mức ứng dụng sẽđáp ứng lại thay đổi ứng dụng AutoCAD mơi trường bao gồm: mở, lưu, đóng in vẽ, tạo vẽ mới, sử dụng dòng lệnh, tải dỡ bỏ ứng dụng ARX AutoLISP, thay đổi biến hệ thống thay đổi cửa sổ ứng dụng
Các kiện mức vẽ sẽđáp ứng lại thay đổi vẽ
hoặc bên bao gồm: thêm, xố thay đổi đối tượng, kích hoạt trình đơn tắt, thay đổi tập lựa chọn, thay đổi cửa sổ vẽ trình tái tạo vẽ Ngồi có số kiện
mức đáp ứng lại với việc mở, đóng in vẽ, tải dỡ bỏ
ứng dụng ARX AutoLISP từ vẽ
Các kiện mức đối tượng đáp ứng lại thay đổi đối tượng cụ
thể Hiện có kiện mức này, gọi
đối tượng bị thay đổi
Các hàm đáp ứng lại kiện gọi xử lý kiện thực cách tựđộng kiện tương ứng gọi Các thông tin chứa
kiện, ví dụ tên vẽ kiện BeginOpen, chuyển vào xử lý
kiện thông qua tham số
2 Chỉ dẫn xây dựng bộ xử lý sự kiện
Điều quan trọng cần lưu ý kiện đơn giản cung cấp thông tin dựa trạng thái hoạt động diễn AutoCAD Mặc dù xử lý kiện có thểđược viết để đáp ứng lại kiện đó, AutoCAD lại nằm bên q trình xử lý xử lý kiện gọi Do xử lý kiện thường có hạn chế tác vụ thực nhằm đảm bảo
an toàn cho thao tác tác động đến AutoCAD sở liệu Khơng nên dựa vào trình tự kiện
Khi viết xử lý kiện ta khơng nên dựa vào trình tự xảy
kiện theo suy nghĩ Ví dụ: sử dụng lệnh OPEN, kiện BeginCommand, BeginOpen, EndOpen EndCommand thực Tuy nhiên, chúng khơng xảy theo trật tựđó Trình tự kiện sử dụng cách an toàn kiện Begin xảy trước
kiện End tương ứng Trong ví dụ trước, kiện có thểđược xảy theo trình tự sau: BeginCommand – BeginOpen – EndCommand – EndOpen BeginCommand – EndCommand – BeginOpen – EndOpen
Khơng nên dựa vào trình tự thao tác xử lý
Nếu ta xoá đối tượng đốí tượng 2, khơng nên cho
kiện ObjectErased cho đối tượng phát sinh trước sau cho đối tượng 2, thực tế, ta nhận kiện đối tượng trước
(3)
Cố gắng thực hàm tương tác xử lý kiện dẫn đến nhiều rắc rối nghiêm trọng, AutoCAD tiếp tục thực câu lệnh vào thời điểm mà kiện bắt đầu Vì vậy, nên tránh sử
dụng phương thức đòi hỏi phải nhập liệu, ví dụ GetPoint, GetEntity, GetKeyword… thao tác chọn đối tượng phương thức SendCommand xử lý kiện
Không nên gọi hộp thoại xử lý kiện
Hộp thoại coi hàm tương tác, cản trở thao tác sử
dụng AutoCAD Tuy nhiên hộp thông báo cảnh báo coi khơng có tương tác sử dụng cách an tồn
Ta ghi liệu vào sở liệu bất cứđối tượng ngoại trừ đối tượng phát sinh kiện
Một cách hiển nhiên bất cứđối tượng làm phát sinh kiện
được xử lý mởđể sử dụng AutoCAD thao tác tiến hành Do nên tránh việc ghi thông tin cho
đối tượng từ xử lý kiện đối tượng Tuy nhiên, ta đọc thơng tin cách an tồn từđối tượng phát sinh kiện Ví dụ: ta có sàn nhà lát gạch có xử lý kiện đính kèm với
đường biên sàn nhà Nếu ta thay đổi kích thước sàn nhà xử lý
kiện tựđộng cộng trừ viên gạch để phủ kín diện tích sàn Bộ xử lý kiện đọc diện tích đường biên khơng thể thay đổi thứ biên
Không nên thực thao tác từ xử lý kiện mà làm phát sinh kiện
Nếu ta thực thao tác xử lý kiện mà làm phát sinh kiện tạo vịng lặp vơ hạn Ví dụ người dùng không nên cố gắng mở vẽ bên kiện BeginOpen, không AutoCAD tiếp tục mở thêm nhiều vẽ khác đạt đến số
lượng vẽđược mở lớn
Lưu ý khơng có kiện thực AutoCAD hiển thị hộp thoại kiểu Modal1
3 Xử lý sự kiện ở mức ứng dụng
Các kiện mức ứng dụng khơng trì liên tục AutoCAD VBA, tức chúng không phép hoạt động cách tự động tải dự án VBA Do vậy, kiện cần kích hoạt VBA tất điều khiển ActiveX Automation
(4)Một kiện mức ứng dụng kích hoạt, có nhiều kiện mà ta
sử dụng, bao gồm:
Sự kiện Tình
AppActivate Gọi đến trước cửa sổ ứng dụng
kích hoạt
AppDeactivate Gọi đến trước cửa sổ ứng dụng bỏ kích
hoạt
ARXLoaded Gọi đến ứng dụng ObjectARX tải vào
ARXUnloaded Gọi đến ứng dụng ObjectARX dỡ
BeginCommand Gọi đến sau câu lệnh sử dụng trước
khi hoàn thành
BeginTệpDrop Gọi đến tệp bị dỡ khỏi ứng dụng
BeginLISP Gọi đến sau AutoCAD nhận yêu cầu tính
biểu thức LISP
BeginModal Gọi đến trước modal dialog
BeginOpen Gọi đến sau AutoCAD nhận yêu cầu mở tệp
đã có
BeginPlot Gọi đến sau AutoCAD nhận yêu cầu in
bản vẽ
BeginQuit Gọi đến trước phiên làm việc AutoCAD
kết thúc
BeginSave Gọi đến sau AutoCAD nhận yêu cầu lưu
một vẽ
EndCommand Gọi đến sau câu lệnh hồn thành
EndLISP Gọi đến hồn thành tính toán biểu thức LISP
EndModal Gọi đến sau hộp thoại bịđóng
EndOpen Gọi đến sau AutoCAD kết thúc mở vẽđã
có
EndPlot Gọi đến sau tài liệu gửi đến máy in
EndSave Gọi đến sau AutoCAD kết thúc lưu vẽ
LISPCancelled Gọi đến sau việc tính tốn biểu thức LISP bị
dừng lại
NewDrawing Gọi đến trước tạo vẽ
SysVarChanged Gọi đến giá trị biến hệ thống bị thay đổi
WindowChanged Gọi đến có thay đổi cửa sổứng dụng
WindowMovedOrResized Gọi đến sau cửa sổ ứng dụng dich
(5)3.1 Kích hoạt sự kiện ở mức ứng dụng
Trước sử dụng kiện mức ứng dụng người dùng phải tạo lớp khai báo đối tượng có kiểu AcadApplication với kiện Ví dụ, giả
sử có lớp tạo gọi EventClasssModule, lớp chứa khai báo ứng dụng với từ khoá VBA WithEvents
Để tạo lớp khai báo đối tượng Application với kiện:
1 Trong VBA IDE, để thêm lớp: Insert ClassModule 2 Chọn lớp tạo cửa sổ Project
3 Đổi tên lớp cửa sổ Properties thành EventClassModule
4 Mở cửa sổ Code lớp cách bấm phím F7 lựa chọn: View Code 5 Trong cửa sổ Code lớp thêm dòng lệnh sau:
Public WithEvents App As AcadApplication
Sau đối tượng khai báo với kiện, xuất hộp danh sách Object lớp người dùng viết thủ tục kiện cho đối tượng lớp (Khi lựa chọn đối tượng hộp Object,
kiện có hiệu lực đối tượng có hộp danh sách Procedure) Tuy nhiên, trước thủ tục thực ta phải kết nối đối tượng
được khai báo lớp với đối tượng Application Dưới đoạn mã mà ta chèn vào mơđun để thực việc kết nối
Để kết nối đối tượng khai báo với đối tượng Application
1 Trong cửa sổ Code mơđun chính, thêm dòng lệnh sau phần khai báo:
Dim X as New EventClassModule
2 Trong cửa sổđó thêm vào thủ tục:
Sub InitializEvent()
Set X.App= ThisDrawing.Application End Sub
3 Trong phần mã mơđun chính, thêm lời gọi thủ tục InitalizeApp
Call InitializEvents
Khi thủ tục InitializEvents thực đối tượng App lớp trỏ đến đối tượng Application định thủ tục kiện lớp chạy kiện xảy
Lời nhắc tiếp tục vẽđược thả vào AutoCAD
Ví dụ chặn lại trình tải tệp kéo thả vào AutoCAD Khi
đó, có hộp thoại thơng báo gồm tên tệp, nút lệnh Yes/No/Cancel cho phép người dùng định xem có tiếp tục tải tệp hay khơng Nếu người dùng lựa chọn khỏi thao tác, định sẽđược thực nhờ việc trả thông sốCancel kiện BeginFileDrop tệp khơng tải
(6)’ Ví dụ khởi tạo biến tồn cục (ACADApp)
’ biến sử dụng để chặn kiện AcadApplication ’ Chạy thủ tục trước tiên!
’ Có thể gọi ứng dụng từ đối tượng ThisDocument, ’ yêu cầu có vẽ mở
’ nên vẽ lấy từ hệ thống
Set ACADApp = GetObject(, "AutoCAD.Application") End Sub
Private Sub ACADApp_BeginTệpDrop _
(ByVal FileName As String, Cancel As Boolean)
’ Ví dụ chặn kiện BeginFileDrop ứng dụng ’ Sự kiện bắt đầu vẽ kéo vào AutoCAD
’ Để bắt đầu cho ví dụ này:
’ 1) Phải chạy ví dụ khởi tạo trước, ví dụ biến ’ tồn cục ACADApp liên kết với kiện ’ 2) Kéo tệp vẽ AutoCAD vào chương trình AutoCAD ’ từ Windows Desktop từ Windows Explorer
’ Sử dụng biến "Cancel" để dừng việc tải tệp ’ biến "TệpName" để thông báo cho người dùng ’ tệp thả vào
If MsgBox("AutoCAD is about to load " & FileName & vbCrLf _ & "Do you want to continue loading this file?", _ vbYesNoCancel + vbQuestion) <> vbYes Then
Cancel = True End If
End Sub
4 Xử lý sự kiện ở mức bản vẽ
Các kiện mức vẽ ln trì liên tục VBA AutoCAD, nghĩa chúng tựđộng kích hoạt tải dự án VBA Tuy nhiên, chúng không
được kích hoạt bất cứđiều khiển khác, chẳng hạn VB Do
kiện mức vẽ cần kích hoạt tất điều khiển ActiveX Automation khác
Mỗi kiện mức vẽđược kích hoạt, ta có nhiều kiện để sử dụng, bao gồm:
Sự kiện Tình
Activate Khi cửa sổ bản vẽđược kích hoạt BeginClose Ngay trước vẽđóng lại
BeginCommand Ngay sau một câu lệnh được sử dụng trước
hoàn thành
BeginDoubleClick Sau người dùng nhấn đúp lên đối tượng vẽ
BeginLISP Ngay sau AutoCAD nhận được yêu cầu tính một
biểu thức LISP
(7)BeginRightClick Sau người dùng nhấp chuột phải lên cửa sổ bản vẽ BeginSave Ngay sau AutoCAD nhận yêu cầu lưu
bản vẽ
BeginShortcutMenuCommand Sau người dùng nhấn chuột phải lên cửa sổ bản vẽ
và trước trình đơn tắt xuất dạng Command
BeginShortcutMenuDefault Sau người dùng nhấn chuột phải lên cửa sổ vẽ
và trước trình đơn tắt xuất dạng Default
BeginShortcutMenuEdit Sau người dùng nhấn chuột phải lên cửa sổ vẽ
và trước trình đơn tắt xuất dạng Edit
BeginShortcutMenuGrip Sau người dùng nhấn chuột phải lên cửa sổ bản vẽ
và trước trình đơn tắt xuất dạng Grip
BeginShortcutMenuOsnap Sau người dùng nhấn chuột phải lên cửa sổ vẽ
và trước trình đơn tắt xuất dạng Osnap
Deactivate Khi cửa sổ bản vẽ thơi kích hoạt EndCommand Ngay sau câu lệnh hoàn thành
EndLISP Khi hoàn thành tính tốn biểu thức LISP
EndPlot Sau một bản vẽđược gửi đến máy in EndSave Khi AutoCAD hoàn thành lưu vẽ
EndShortcutMenu Sau trình đơn tắt xuất
LayoutSwitched Sau người dùng chuyển sang Layout khác LISPCancelled Khi việc tính toán biểu thức LISP bị dừng lại ObjectAdded Khi đối tượng thêm vào vẽ
ObjectErased Khi một đối tượng bị xoá khỏi bản vẽ ObjectModified Khi một đối tượng bản vẽ bị sửa SelectionChanged Khi tập lựa chọn bị thay đổi
WindowChanged Khi có thay đổi cửa sổ vẽ
WindowMovedOrResized Ngay sau cửa sổ bản vẽ dịch chuyển hoặc thay đổi
kích cỡ
4.1 Kích hoạt sự kiện mơi trường ngồi VBA
Trước sử dụng kiện mức vẽ môi trường VB mơi trường khác ngồi VBA, ta cần tạo lớp khai báo đối tượng với kiểu AcadDocument với kiện Ví dụ: giả sử tạo lớp có tên EventClassModule, lớp chứa khai báo ứng dụng theo từ khoá WithEvents VBA
Để tạo lớp khai báo đối tượng Document với kiện: