Phát triển ứng dụng ActiveX và VBA
|
|2
2
7
7
5
5
P
P
H
H
Á
Á
T
TT
T
R
R
I
I
Ể
GV
V
B
B
A
A
Làm việc khi không có
bản vẽ được mở
Phân phối ứng dụng Nhiều công việc trong lập trình không chỉ đơn giản
là làm việc với mô hình đối tượng AutoCAD
ActiveX. Chương này sẽ đề cập tổng quan về cách
tạo các hộp thoại, xử lý lỗi, điều khiển cửa sổ ứng
dụng và phân phối ứng dụng cho người khác.
Lưu ý rằng, tài liệu của Microsoft về VBA sẽ có
thêm nhiều thông tin hơn.
2
2
7
7
6
6|
| Chương 11: Phát triển ứng dụng bằng VBA
1. Một số thuật ngữ trong VBA
Nội dung chương này sẽ mở rộng các kinh nghiệm với VBA. Các khái niệm được
nêu ra dưới đây sẽ giúp tìm hiểu và làm việc với môi trường VBA
Project Dự án - là tập hợp của các form và các mô-đun được nhóm lại thành
một tệp.
Module là một nhóm các thủ tục và các hàm thường có liên quan đến nhau.
Macro là những hàm và thủ tục có thể dùng chung. Macro thường được thể
2
7
7
7
7
Các UserForm, được gọi là Form trong tài liệu này, luôn là dạng Modal. Có nghĩa là
khi nó xuất hiện trong lúc ứng dụng đang chạy, thì người dùng phải đóng nó lại
trước khi muốn thực hiện bất cứ thao tác nào khác nào trong ứng dụng. Điều này sẽ
được nói đến kỹ hơn trong phần “Thiết kế chương trình với Modal Form” trang
280.
2.1. Thiết kế và chạy chương trình
Khi tạo Form là lúc làm việc trong chế độ thiết kế, ở chế độ đó có thể thực hiện các
thao tác sau:
Thêm điều khiển vào Form
Thay đổi thuộc tính của Form
Thay đổi thuộc tính của các điều khiển trên Form
Chèn mã lệnh cho các môđun của Form
Trong chế độ thiết kế không có bất cứ sự tương tác nào giữa người dùng, giao diện
của AutoCAD và Form thiết kế.
Khi chạy ứng dụng thì Form sẽ ở chế độ hoạt động. Khi ở chế độ này, ta không thể
tạo bất cứ sự thay đổi nào tới Form một cách trực tiếp. Tuy nhiên, khi Form đang
được hiển thị trong giao diện sử dụng của AutoCAD, người dùng có thể tương tác
với Form như là một phần thông thường trong ứng dụng.
2.2. Tạo Form mới trong Dự án
Tạo Form mới trong Dự án
1 Mở cửa sổ Project của VBA IDE và chọn dự án muốn thêm Form mới.
2 Từ menu Insert chọn UserForm. Khi đó một Form trống được tạo ra và thêm
vào dự án.
2.3. Thêm điều khiển vào Form
Rất dễ dàng để thêm các điều khiển vào Form, bằng cách chọn điều khiển trong hộp
kích thước mong muốn (Form cũng được điều chỉnh kích thước theo cách tương
tự).
Để di chuyển và thay đổi kích cỡ của nhiều điều khiển cùng một lúc thì lựa chọn
từng điều khiển trong khi giữ phím SHIFT, sau đó có thể thực hiện di chuyển hoặc
đổi kích thước của chúng theo nhóm.
2.3.2. Định dạng các điều khiển
VBA cung cấp một số chức năng điều chỉnh định dạng để giúp cho ta trình bày
Form. Những chức năng này có thể được tìm thấy trong trình đơn Format của VBA
IDE. Chúng cho phép căn chỉnh, tạo kích thước giống nhau, thay đổi khoảng cách
cho nhiều điều khiển trên Form.
Chú ý, để chọn nhiều điều khiển, giữ phím SHIFT trong khi chọn.
2.3.3. Thay đổi thuộc tính của điều khiển
Các thuộc tính sẽ điều chỉnh các đặc điểm khác nhau của điều khiển ví dụ như: kích
cỡ, hình dạng, màu sắc, nhãn và các giá trị mặc định. Gán các thuộc tính của điều
khiển thực hiện khi thiết kế bằng cách sử dụng cửa sổ Properties.
Thay đổi thuộc tính của điều khiển
1 Chọn điều khiển cần thay đổi thuộc tính trên Form
2 Mở cửa sổ Properties bằng cách sử dụng phím F4 trong trường hợp cửa sổ đó
chưa được mở.
3 Trong cửa sổ Properties, tìm thuộc tính muốn thay đổi và chọn giá trị hiện tại
cho thuộc tính đó.
4 Thay đổi giá trị cho thuộc tính đó.
Ta cũng có thể thay đổi thuộc tính của đối tượng trong chương trình đang hoạt
động bằng cách viết mã lệnh truy cập vào thuộc tính này. Tham khảo tài liệu của
Microsoft để tìm thêm thông tin về thay đổi thuộc tính của điều khiển trong lúc
chương trình đang hoạt động.
2.3.4. Thêm mã lệnh cho điều khiển
Sau khi bố trí các điều khiển trên Form theo mong muốn, tiến hành viết mã lệnh cho
các điều khiển. Mở cửa sổ Code (cửa sổ viết mã lệnh) bằng cách nhấn đúp chuột
không thể tương tác trực tiếp với AutoCAD (ví dụ chọn một điểm hay một đối
tượng nào đó trên bản vẽ) khi Form đang được hiển thị. Để cho phép người dùng
tương tác với bản vẽ của AutoCAD thì cần sử dụng phương thức Hide của VBA.
Phương thức này sẽ ẩn Form đi và cho phép người dùng truy cập một cách hạn chế
với AutoCAD. Khi sử dụng phương thức Hide, Form vẫn còn trong bộ nhớ của máy
tính, nó vẫn giữ nguyên tất cả các giá trị hiện tại trong khi bị ẩn đi. Phương thức
này được gọi theo cách tương tự như phương thức Show.
Ẩn Form
UserForm1.Hide
2.5. Tải và dỡ bỏ Form
Một số trường hợp cần tải Form vào bộ nhớ trong lúc chạy ứng dụng nhưng không
hiển thị Form. Trường hợp này có thể gặp phải khi người lập trình muốn khống chế
thời điểm tải Form tốt hơn hoặc muốn truy cập Form nhưng không muốn người
dùng nhìn thấy Form. Để tải Form nhưng không hiện Form, sử dụng phương thức
Load của VBA. Phương thức Show có thể được sử dụng sau đó để người dùng nhìn
thấy Form tại thời điểm thích hợp trong khi ứng dụng thực hiện. Cần nhớ rằng,
người dùng không thể tương tác với Form cho đến khi nhìn thấy nó. Nếu phương
thức Show được gọi mà Form chưa được tải vào thì nó sẽ được tự động tải.
Bên cạnh đó, cũng có một số trường hợp ta muốn dỡ bỏ Form. Việc dỡ bỏ Form sẽ
loại bỏ Form đó khỏi bộ nhớ và tất cả các bộ nhớ liên quan đến Form đó sẽ được
thu hồi lại. Cho đến khi Form được tải vào lần nữa bằng cách sử dụng phương thức
Load hoặc Show thì người dùng không thể tương tác với Form và cũng không thể
thao tác lập trình được. Ta có thể dỡ bỏ Form khi biết Form sẽ không được sử dụng
lần nữa trong ứng dụng và khi cần tiết kiệm bộ nhớ.
2
2
8
8
0
đối tượng đã được chọn thì hiển thị lại Form bằng phương thức Show, tất cả các dữ
liệu của nó vẫn được giữ nguyên trạng và ứng dụng sẽ tiếp tục chạy.
CHÚ Ý Mặc dù tất cả các Form khác trong ứng dụng đều không được phép hoạt động khi
hộp thoại Modal hiển thị, nhưng các ứng dụng khác thì đều được phép hoạt động.
3. Xử lý lỗi
Có ba loại lỗi khác nhau có thể gặp phải trong ứng dụng: lỗi biên dịch, lỗi thực thi
và lỗi logic.
Lỗi biên dịch xảy ra trong khi xây dựng ứng dụng. Những lỗi này hầu hết là lỗi cú
pháp, các vấn đề về phạm vi của biến, hoặc lỗi nhập dữ liệu. Trong VBA, những
kiểu lỗi như vậy thường được phát hiện bởi môi trường phát triển. Khi soạn một
dòng lệnh sai thì dòng đó sẽ được đánh dấu và thông báo lỗi sẽ xuất hiện và nhắc
nhở về lỗi đó. Các lỗi biên dịch cần phải được sửa trước khi ứng dụng có thể hoạt
động.
Lỗi thực thi thường khó tìm và sửa hơn. Chúng thường xảy ra trong khi thi hành các
dòng lệnh và thường do nhận thông tin từ người dùng. Ví dụ nếu ứng dụng yêu cầu
người dùng nhập tên của bản vẽ và người dùng nhập tên của một bản vẽ không tồn Phát triển AutoCAD bằng ActiveX và VBA
|
|2
2
8
8
1
1
định của hệ thống sẽ bị bỏ qua.
Lệnh
On Error có 3 dạng như sau:
On Error Resume Next
On Error GoTo Label
On Error GoTo 0
Lệnh On Error Resume Next được sử dụng khi người lập trình muốn bỏ qua lỗi.
Lệnh này sẽ chỉ thực hiện bẫy lỗi thay vì sự xuất hiện của các thông báo và dừng
chương trình, bằng cách nhảy đến thực hiện dòng lệnh tiếp theo. Ví dụ, nếu muốn
tạo một thủ tục duyệt qua tất cả các đối tượng trong không gian vẽ để đổi màu cho
chúng, người lập trình cần biết rằng khi một trong các đối tượng nằm trong một lớp
bị khoá thì AutoCAD sẽ báo lỗi. Do vậy, thay vì phải dừng chương trình lại, chỉ
cần bỏ qua các đối tượng thuộc lớp bị khoá đó để tiếp tục đổi màu cho các đối
tượng còn lại.
2
2
8
8
2
2|
| Chương 11: Phát triển ứng dụng bằng VBA
Xử lý lỗi sử dụng lệnh On Error Resume Next
Ví dụ dưới đây là một chương trình con duyệt qua tất cả các đối tượng trong không
gian vẽ và đổi màu chúng thành đỏ. Áp dụng chương trình con này trong một bản
vẽ có sẵn một số đối tượng mà trong đó có đối tượng thuộc một lớp bị khoá. Tiếp
đó, giải thích lệnh On Error Resume Next và tiếp tục chạy chương trình. Chương
MyErrorHandler:
Msgbox entry.EntityName + " is on a locked layer." + _
" The handle is: " + entry.Handle
Resume Next
End Sub
Lệnh On Error GoTo 0 sẽ huỷ toàn bộ các xử lý lỗi hiện tại trong chương trình
con. Lệnh On Error Resume Next và On Error GoTo Label giữ nguyên thông tin
trong bộ xử lý lỗi hiện tại cho đến khi thủ tục kết thúc, hoặc khi có một bộ xử lý lỗi
khác được khai báo, hoặc khi bộ xử lý lỗi bị hủy do lệnh On Error GoTo 0.
3.2. Xử lý lỗi đã bẫy được
Sau khi bẫy được một lỗi, việc xử lý lỗi đó phụ thuộc vào ứng dụng và bản chất của
lỗi. VB và VBA cung cấp các thông tin của lỗi đã bẫy được thông qua đối tượng Phát triển AutoCAD bằng ActiveX và VBA
|
|2
2
8
8
3
3
Err. Đối tượng Err có các thuộc tính: Number, Description, Source, HelpTệp,
HelpContext, LastDLLErr. Các thuộc tính nêu trên luôn nhận giá trị của lỗi gần
nhất. Thuộc tính quan trọng nhất là Number và Description. Thuộc tính Number
chứa mã của lỗi và thuộc tính Description chứa các thông báo xuất hiện khi có lỗi.
tên là acad.dvb. Tệp này sẽ tự động tải như một dự án mặc định;
Tất cả các dự án có tên khác với acad.dvb đều có thể được sử dụng sau khi
tải vào bằng lệnh VBALOAD. Đoạn mã lệnh dưới đây sử dụng tệp khởi
động của AutoLISP để tải VBA cũng như dự án VBA có tên là myproj.dvb
2
2
8
8
4
4|
| Chương 11: Phát triển ứng dụng bằng VBA
khi AutoCAD bắt đầu hoạt động. Chạy trình soạn thảo notepad.exe và tạo
(hoặc thêm vào) tệp acad.lsp như sau:
(defun S::STARTUP()
(command "_VBALOAD" "myproj.dvb")
)
7. Tự động thực thi Macro
Tự động thực thi Macro khi khởi động AutoCAD
Bất cứ Macro nào trong tệp acad.dvb đều có thể tự động thực hiện bằng cách gọi
gián tiếp macro đó qua câu lệnh VBARUN từ một tiện ích khởi động nào đó của
AutoCAD, như tệp acad.lsp. Ví dụ, để tự động thực hiện macro tên là drawline,
trước hết lưu macro đó vào tệp acad.dvb, tiếp đó khởi động chương trình soạn thảo
notepad.exe và tạo mới (hoặc thêm vào) tệp acad.lsp như sau :
(defun S::STARTUP()
(command "_-vbarun" "drawline")
)
2
2
8
8
5
5
AutoCAD không hiện dòng lệnh khi không có bản vẽ nào mở, nên bất cứ sự
cố gắng dùng qua dòng lệnh của chương trình ở trạng thái này đều sẽ gây
lỗi.
10. Phân phối ứng dụng
Ứng dụng VBA có thể được phân phối theo hai cách sau:
Nhúng vào bản vẽ AutoCAD
Lưu dự án VBA vào tệp
Hình thức phân phối cần được lựa chọn cho phù hợp với ứng dụng. Những ứng
dụng có thể áp dụng trong bản vẽ hiện tại và không can thiệp vào các bản vẽ khác
thường được nhúng luôn vào bản vẽ đó. Bằng cách này, ta có thể chắc chắn là ứng
dụng đã được tải và sẵn sàng để sử dụng mỗi khi bản vẽ được mở.
Những ứng dụng được sử dụng bởi nhiều người và được cập nhật một cách thường
xuyên, cần đóng mở nhiều bản vẽ khác, hoặc không được sử dụng thường xuyên,
thì nên lưu thành tệp dự án của VBA riêng. Theo cách này, có một nơi tập trung
ứng dụng và tất cả mọi người sẽ được đảm bảo sử dụng phiên bản mới nhất.
Các thông tin chi tiết về dự án được nhúng và tệp dự án VBA, tham khảo trong
phần “Khái niệm về dự án VBA nhúng và độc lập” trang 28.
10.1. Phân phối ứng dụng Visual Basic
Ứng dụng Visual Basic hay bất cứ ứng dụng chạy độc lập nào đều không thể lưu
trong một bản vẽ của AutoCAD. Chúng được biên dịch thành những tệp thực thi
độc lập (EXE) và có thể chạy bằng lệnh APPLOAD của AutoCAD.