If x = a(i) Then kt = True Exit For
End If Next
containInArray = kt End Function
2.2.5 Ví dụ
Ta viết lại Standard Module trong ví dụ trước theo cách tiếp cận của Class Module và đặt tên là doubleArray, gồm các mã lệnh sau đây:
‘Khai báo các tùy chọn
Option Compare Database Option Base 1
Option Explicit
‘Định nghĩa các thuộc tính của lớp. Thuộc tính a() là một mảng
Có thể bạn quan tâm!
- Nhập môn hệ quản trị cơ sở dữ liệu Phần 2 - 1
- Nhập môn hệ quản trị cơ sở dữ liệu Phần 2 - 2
- Trong Mục Create, Chọn Mục Class Module Để Tạo Mới 1 Module Lớp
- Nhập môn hệ quản trị cơ sở dữ liệu Phần 2 - 5
- Nhập môn hệ quản trị cơ sở dữ liệu Phần 2 - 6
- = 2: T = Sqr(N): Found = False Do While (I <= T) And (Not Found)
Xem toàn bộ 114 trang tài liệu này.
‘ các số double, thuộc tính n là số lượng các phần tử của mảng a()
Private a(100) As Double Private n As Integer
‘Định nghĩa các phương thức của lớp
‘Phương thức để khởi tạo các giá trị cho các thuộc tính a() và n
‘num được truyền vào để khởi tạo cho n còn a() sẽ lấy các giá trị ngẫu nhiên
Sub initArray(num As Integer)
Dim i As Integer n = num Randomize
For i = 1 To n
a(i) = Rnd * 100 Next
End Sub
‘Phương thức hiển thị các phần tử trong a() của lớp doubleArray
Sub showArray() Dim i
For i = 1 To n
MsgBox ("a[" & Str(i) & "] = " & Str(a(i)))
Next End Sub
‘Phương thức sắp xếp các phần tử trong a() của lớp doubleArray
Sub sortArrayASC()
Dim i, j As Integer For i = 1 To n - 1
For j = i + 1 To n
If (a(i) > a(j)) Then Dim tg As Double tg = a(i)
a(i) = a(j) a(j) = tg
End If Next
Next End Sub
‘Hàm kiểm tra xem một giá trị double có thuộc về mảng a() của ‘lớp doubleArray không?
Function containInArray(x As Double) Dim i As Integer
Dim kt As Boolean kt = False
For i = 1 To n
If x = a(i) Then kt = True
Exit For
End If Next
containInArray = kt End Function
Để dùng được lớp doubleArray trên bạn cần viết một đoạn mã khác tạo ra các đối tượng thuộc vào lớp doubleArray. Giả sử bạn tạo một Standard Module có tên là useArray có mã như hình 7.15. Sau khi viết xong các mã lệnh, bạn hãy chọn khối mã đó và chạy thử bằng cách ấn phím F5. Bạn hãy quan sát các kết quả.
Hình 7.15 Viết mã thử nghiệm lớp doubleArray
Chú ý:
+ Cần thiết phải dùng lệnh Set để thiết lập vùng nhớ cho các đối tượng trước khi bạn sử dụng chúng
+ Để có thể gọi được các phương thức hay truy xuất đến các thuộc tính của lớp từ một đối tượng bên ngoài thì các phương thức hay thuộc tính đó phải có phạm vi truy xuất là public. Trong mã lệnh của hàm test() ở trên, sở dĩ bạn gọi a1.initArray(), a1.showArray(), a1.sortArray() được là vì phạm vi truy xuất của chúng là public (mặc định nếu bạn không chỉ ra khi định nghĩa), nhưng bạn hoàn toàn không thể truy xuất a1.n hay a1.a(1) vì n và a() là các thuộc tính của lớp được khai báo phạm vi truy xuất private
+ Kết quả chạy test() là: Tạo ra một đối tượng (thể hiện) của lớp doubleArray. Gọi phương thức InitArray() để khởi tạo giá trị cho thuộc tính mảng a() và n của a1. Gọi phương thức showArray() để hiển thị các phẩn tử của a1.a(), lần lượt mỗi phần tử được
hiển thị trong một hộp msgBox. Gọi phương thức sortArrayASC() để sắp xếp các phần tử của a1.a() theo trật tự tăng dần.
2.3 Module của form/report (Form/report Module)
Module này thuộc phần Microsoft Access Class Object (MSCO) trong cửa sổ code VBA.
Mặc định tất cả các form/report đều có module ẩn sau nó (thuộc tính HasModule được thiết lập mặc định là True). Có thể dùng từ khóa Me khi tham chiếu đến các module ẩn sau form/report.
Trong Form/Report Module chúng ta có thể tạo các thủ tục theo sự kiện (thủ tục được tự động gọi khi có sự kiện tương ứng với nó xảy ra) hoặc các thủ tục độc lập có thể được gọi từ các thủ tục khác trong cùng hoặc khác module. Tuy nhiên, trong phần này chúng ta chỉ nên viết các thủ tục hành xử theo các sự kiện của các điều khiển trên form/report.
Để tạo được các MSCO này, bạn cần tạo form/report trước. Ứng với mỗi form/report, trong trường hợp bạn cần viết code cho các điều khiển trên form/report, hệ thống sẽ tự động tạo ra một module tương ứng gắn với form/report đó. Tên của module đó sẽ được đặt tự động là Form_Tên_Form/Report_Tên_Report.
Hình ảnh trên cho thấy, chúng ta có 02 form với tên lần lượt là: frmArrayCalculate và frmSearch, do vậy hệ thống sẽ tự sinh cho ta 02 module MACO là Form_frmArrayCalculate và Form_frmSearch. Tương tự như vậy với 02 Report rptArrayCalculate và rptSearch.
Như vậy, module MACO sẽ dùng để viết (chứa) các hàm hành xử dựa trên các sự kiện của form/report và các sự kiện của các điều khiển nằm trên form/report. Mỗi form/report sẽ có một module MACO tương ứng.
Các thành phần của module MSCO cũng tương tự như 02 loại module trên, bao gồm: Các khai báo tùy chọn, các khai báo biến toàn cục và định nghĩa các hàm hành xử cho các sự kiện của form/report và các sự kiện của các điều khiển trên form/report
Phần khai báo các tùy chọn và các biến toàn cục hoàn toàn tương tự như Standard Module. Ở đây, chúng ta chỉ quan tâm đến phần định nghĩa các hàm hành xử tương ứng cho các sự kiện của form/report và các sự kiện của các điều khiển trên form/report.
2.3.1 Tạo MSCO module
Trước hết bạn cần tạo form/report trước. Sau đó hãy tạo một vài các điều khiển như TextBox, Button trên form/report.
Tiếp theo, để tạo MSCO module, từ thực đơn CREATE của MS Access, bạn cần chọn lệnh Visual Basic như trong hình dưới đây.
Kết quả bạn nhận được cửa sổ có dạng như hình sau. Tại cửa sổ này, bạn có thể khai báo các tùy chọn, khai báo các biến dùng chung cho các hàm phía sau và định nghĩa các hàm hành xử cho các sự kiện của form/report và các sự kiện của các điều khiển trên form/report
Hình ảnh trên cho thấy, cửa sổ bên phải là nơi bạn khai báo, định nghĩa các nội dung của MSCO module.
Chú ý:
+ Bạn có thể viết các hàm tự do để xử lý các tình huống riêng ở đây. Các hàm tự do bạn phải gọi chúng một cách tường minh thì chúng mới được thi hành. Ví dụ: bạn viết hàm sum(a as double, b as double) với dụng ý là hàm sum(a,b) sẽ trả về kết quả của a
+ b. Tuy nhiên, bạn không nên viết hàm sum(a as double, b as double) ở đây, bạn nên định nghĩa hàm này (và các hàm tương tự) trong một Standard Module. Ở đây bạn vẫn sẽ gọi được các hàm đó bình thường, cách tiếp cận như vậy sẽ giúp chương trình của bạn sáng hơn và dễ kiểm soát hơn.
+ Các hàm hành xử theo sự kiện ở đây có danh sách tham số và tên phải được khớp với các quy tắc về định nghĩa hàm hành xử cho sự kiện tương ứng của MS Access.
2.3.2 Định nghĩa các hàm hành xử cho các sự kiện
Xuất phát từ quan điểm lập trình của VBA ở đây là chương trình hướng đối tượng và hướng sự kiện. Theo đó, toàn bộ chương trình sẽ vận hành theo các sự kiện của các điều khiển nằm trên form/report và các sự kiện của form/report khi có tác động của người dùng hoặc khi biên dịch.
Để định nghĩa các hàm hành xử cho các sự kiện, bạn cần thiết kế form/report và các điều khiển trên form/report trước. Bạn nhớ đặt tên cho các điều khiển sau này sẽ có các sự kiện trên nó. Ví dụ một nút lệnh trên form là bạn muốn sau này người dùng click vào nó (sự kiện OnClick), chương trình sẽ thực hiện một đoạn mã nào đó đáp ứng sự kiện này. Như vậy, bạn nên đặt tên rõ ràng cho nút lệnh này.
Sau khi thiết kế điều khiển trên form, bạn mở của sổ property của nó (kích chọn vào điều khiển, sau đó ấn phím F4 ) và lựa chọn mục Event là danh sách các sự kiện có thể có dành cho điều khiển đó. Trong phần danh sách các sự kiện của điều khiển, bạn
muốn viết hàm hành xử cho sự kiện nào thì chọn vào sự kiện đó, rồi click vào nút … bên phải. Kết quả, bạn nhận được giao diện hình sau:
Hình ảnh trên là các sự kiện của một TextBox tên là txtNum, sự kiện OnClick được chọn để viết hàm hành xử.
Trong cửa sổ Choose Builder, bạn cần chọn mục Code Builder. Kết quả bạn nhận được giao diện như hình dưới đây:
Hình trên là cửa sổ bạn viết code cho sự kiện OnClick của TextBox txtNum. Chú ý:
+ Tên của hàm hành xử cho sự kiện được đặt theo quy tắc: TênĐiềuKhiển_TênSựKiện. Nếu là sự kiện của Form/Report thì sẽ là Form/Report_TênSựKiện (ví dụ Form_Load()). Làm trái quy tắc này hàm của bạn sẽ không được tự động gọi khi có sự kiện xảy ra với điều khiển.
+ Các tham số của hàm có thể có hoặc không tùy theo điểu khiển và sự kiện. Bạn cũng không thể thay đổi các kiểu dữ liệu của các tham số này. Tất nhiên, bạn có thể thay tên của chúng.
Ví dụ:
Hàm hành xử cho sự kiện OnClick của nút lệnh không có tham số:
Private Sub cmdSortArrayASC_Click() End Sub
Hàm hành xử cho sự kiện KeyDown của TextBox có 2 tham số
Private Sub txtNum_KeyDown(KeyCode As Integer,
Shift As Integer)
End Sub
2.3.3 Nhận xét
MSCO module có các đặc điểm sau đây:
+ Toàn bộ mã cần để tự động hóa form/report thường trú ngay trong form/report đó, không cần phải nhớ tên của đối tượng module riêng biệt liên quan đến form/report.
+ Các thủ tục hướng sự kiện trong module được tự động thi hành dựa trên các sự kiện xảy ra với form/report và các điều khiển trên form/report, không cần phải xác định lời gọi tường minh cho chúng.
+ MS Access tải Standard Module (được tham chiếu bởi đối tượng module) vào bộ nhớ khi chỉ cần có một tham chiếu đến thủ tục hoặc biến trong module và cho phép nó thường trú trong bộ nhớ chừng nào CSDL còn mở. Trong khi đó, Form/Report Module chỉ được MS Access tải vào bộ nhớ khi form/report được mở. Khi form/report bị đóng lại thì Form/Report Module tương ứng với nó cũng bị giải phóng khỏi bộ nhớ.
+ Khi xuất đi một form/report, toàn bộ mã lệnh trong Form/Report Module tương ứng với nó cũng được kết xuất theo.
+ Form/report module có module lớn đi kèm sẽ được mở ra, đóng lại chậm hơn so với form/report có module nhỏ hoặc không có module đi kèm.
2.3.4 Ví dụ
Mục tiêu: Ví dụ sau đây sẽ minh họa một chương trình hoàn thiện tương tác với người dùng cuối thông qua form giao diện.
Nội dung: Chương trình gồm hai chức năng:
+ Khởi tạo một mảng ngẫu nhiên các số thực với số lượng các phần tử do người dùng nhập
+ Sắp xếp các phần tử của mảng theo trật tự tăng dần
Các bước thực hiện: Gồm 03 bước sau