End Function
Sub callSub()
Dim a(100) As Double Dim n As Integer InitArray a, n showArray a, n
End Sub
Trong đoạn mã trên:
+ Mục tiêu của các hàm/thủ tục không thay đổi
+ Thay đổi tham số đầu vào của các hàm/thủ tục. Bạn chú ý, cách truyền tham biến cho hàm/thủ tục bằng từ khóa ByRef để sau khi kết thúc hàm/thủ tục các giá trị của các biến truyền vào sau từ khóa ByRef giữ lại được các giá trị đã thiết lập trong nội dung của hàm/thủ tục
+ Thêm một thủ tục callSub() được viết để gọi các thủ tục/hàm đã định nghĩa.
+ Để chạy thử các hàm/thủ tục, bạn cần chọn thủ tục callSub() và ấn F5 như hình 7.10 dưới đây.
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
- Viết Mã Thử Nghiệm Lớp Doublearray
- 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
Xem toàn bộ 114 trang tài liệu này.
Hình 7.10 Truyền tham biến trong lời gọi thủ tục
Kết quả nhận được khi chạy callSub() là mảng a() các số double được khởi tạo trong thủ tục InitArray() được giữ nguyên giá trị khi ra khỏi thủ tục đó (hình 7.11)
…..
Hình 7.11 Kết quả khởi tạo mảng a()
2.2 Module lớp (Class Module)
Có thể xem Class Module là loại module để định nghĩa lớp của người dùng. Lớp của người dùng cũng được đối xử tương tự như các lớp sẵn có. Mỗi Class Module có hai hàm mặc định là Class_Initialize() và Class_Terminate(). Khi tạo đối tượng thuộc Class Module, các hàm này sẽ được tự động gọi tương ứng khi đối tượng được thiết lập (bằng lệnh set) và hủy bỏ (tường minh hoặc không tường minh).
2.2.1 Tạo Class Module
Để tạo Class Module, từ menu trong cửa sổ Database, chọn lệnh CREATE/Class Module (hình 7.12).
Hình 7.12 Trong mục CREATE, chọn mục Class Module để tạo mới 1 Module lớp
Hoặc cũng có thể tạo Class Module từ cửa sổ code như hình 7.13 dưới đây bằng cách click chuột phải vào mục Class Modules rồi chọn lệnh Insert/Class Module
Hình 7.13 Tạo mới Class Module từ cửa sổ code
Kết quả nhận được là một cửa sổ để viết mã lệnh cho Class Module như hình 7.14 dưới đây
Project Explorer Panel
Code Panel
Hình 7.14 Cửa sổ để viết mã lệnh cho Class Module
Trong phần code panel, trên cùng là 02 hộp danh sách. Hộp danh sách bên trái có 02 mục là General và Class. Hộp danh sách bên phải là tên các phương thức của lớp và mục các khai báo (Declarations).
Phần bên dưới là cửa sổ để viết mã lệnh gồm khai báo các tùy chọn, định nghĩa các thuộc tính và định nghĩa các phương thức của lớp.
2.2.2 Khai báo các tùy chọn
Phần khai báo gồm các khai báo như trong Standard Module.
2.2.3 Định nghĩa thuộc tính của lớp
Khai báo các thuộc tính cho lớp sau phần khai báo các tùy chọn. Các thuộc tính này thuộc lớp được khai báo với cú pháp sau đây:
Public|Private|Dim Tên_Thuộc_Tính as Kiểu_Dữ_Liệu
Trong đó:
Tên_Thuộc_Tính: được đặt theo quy tắc đặt tên: không có dấu cách, không có các ký tự đặc biệt, …
As: từ khóa
Kiểu_dữ_liệu: là các kiểu dữ liệu của hệ thống hoặc các lớp đã được định nghĩa
Public: chỉ định thuộc tính có phạm vi truy xuất toàn cục (khắp nơi trong CSDL). Tuy nhiên, trong lập trình hướng đối tượng không nên khai báo phạm vi public cho các thuộc tính
Private: chỉ định thuộc tính có phạm vi truy xuất chỉ trong nội bộ lớp. Phạm vi này nên được khai báo cho các thuộc tính của lớp
Dim: từ khóa này bản chất dùng để khai báo biến, trong Class Module (lớp) có thể sử dụng Dim trong trường hợp này Dim và Private là như nhau. Tuy nhiên, không nên sử dụng Dim mà nên sử dụng Public và Private để cho mã lệnh được rõ ràng theo đúng phong cách lập trình hướng đối tượng và chương trình biên dịch cũng dễ dàng thi hành hơn.
Ví dụ: Ta khai báo một lớp doubleArray gồm các thuộc tính sau đây:
Private a(100) As Double Public n As Integer Trong khai báo trên:
+ Mảng a(100) để chứa các số double, có phạm vi truy xuất là private. Nghĩa là bạn chỉ có thể truy xuất được thuộc tính a() của lớp khi ở trong lớp đó. Ra khỏi lớp đó, bạn không còn nhìn thấy thuộc tính a() nữa.
+ n là một số nguyên, chỉ định số phần tử của mảng. Thuộc tính n có phạm vi truy xuất public. Nghĩa là sau này, từ bất kỳ đâu trong ứng dụng bạn có thể tạo một thể hiện của lớp doubleArray. Bạn đều có thể truy xuất vào thuộc tính n từ thể hiện đó.
Đoạn mã sau đây minh họa các phạm vi public và private của ví dụ trên:
Bên ngoài lớp doubleArray, đối với thể hiện a1 của lớp doubleArray, bạn chỉ thấy a1.n (vì n được định nghĩa phạm vi truy xuất public) trong khi bạn không thể thấy a1.a() (vì a() được định nghĩa phạm vi truy xuất private)
Như vậy, có một vấn đề đặt ra ở đây là bạn luôn muốn định nghĩa các thuộc tính của lớp là private để cho an toàn, nhưng một số trường hợp bạn vẫn muốn cho phép truy xuất vào các thuộc tính private này từ bên ngoài lớp. Giải pháp là bạn định nghĩa các Property Get và Property Let. Property Get là để cho phép đọc được giá trị của thuộc tính, Property Let là để cho phép ghi giá trị vào thuộc tính. Tất nhiên bạn có thể dùng cả hai Property Get và Property Let để cho phép một thuộc tính vừa có thể đọc được vừa có thể ghi được.
Trong ví dụ sau, chúng ta sẽ cho phép đọc và ghi vào thuộc tính n của lớp doubleArray từ bên ngoài lớp thông qua Property Get và Property Let của count trong khi đó n vẫn có phạm vi truy xuất là private.
Quan sát ví dụ trên, bạn thấy cần thêm đoạn mã:
Public Property Get count() As Integer count = n
End Property
Là để cho phép đọc (lấy giá trị) được thuộc tính n của lớp doubleArray từ ngoài lớp. Đoạn mã:
Public Property Let count(ByVal value As Integer) n = value
End Property
Là để cho phép ghi (thiết lập) giá trị cho thuộc tính n của lớp doubleArray từ ngoài lớp.
Chú ý: bạn có thể đặt trùng tên “count” ở đây được chấp nhận. Tất nhiên, bạn có thể đặt 2 tên khác nhau nhưng không nên làm thế sẽ rất lộn xộn và khó theo dõi code cũng như sử dụng thuộc tính của lớp sau này.
Sau khi thêm vào phần định nghĩa thuộc tính của lớp 2 đoạn mã trên, bây giờ bạn có thể đọc/ghi vào thuộc tính n của lớp doubleArray như sau:
Trong đoạn mã trên, bạn thấy bạn thiết lập giá trị 2 cho thuộc tính n thông qua a1.count = 2. Bạn thử in ra giá trị của a1.n thông qua lệnh Debug.Print (a1.count). Kết quả bạn thấy số 2 được hiển thị trong cửa sổ Immediate
2.2.4 Định nghĩa các phương thức của lớp
Phương thức là các hàm của đối tượng. Nếu so sánh với các thuộc tính thì bạn có thể thấy: thuộc tính là dữ liệu (Data) còn phương thức là các hoạt động của đối tượng. Tất nhiên các hoạt động cần thiết phải có dữ liệu.
Định nghĩa phương thức như sau:
Private|Public Sub|Function Tên_Phương_Thức [(Danh_sách_tham_số)]
‘các lệnh trong phương thức End Sub|Function
Trong đó:
Private | Public: là các khai báo phạm vi truy xuất của phương thức. Ý nghĩa của chúng tương tự như trong phần định nghĩa các thuộc tính ở trên. Đối với phương thức, bạn nên để phạm vi truy xuất là public hơn là private. Bạn cũng có thể viết các phương thức để đọc, ghi các giá trị cho các thuộc tính thay cho Property Get và Property Let. Tuy nhiên, như thế không hay và không đúng phong cách hướng đối tượng.
Sub|Function: là các từ khóa quy định phương thức không trả về giá trị (Sub) và có trả về giá trị (Function)
End Sub|Function: từ khóa quy định kết thúc phần định nghĩa của phương thức.
Tên_Phương_Thức: được đặt theo quy tắc đặt tên: không có dấu cách, không có các ký tự đặc biệt.
Danh_sách_tham_số: là tùy chọn. Mỗi tham số được khai báo bao theo quy tắc:
[ByVal|ByRef] Tên_Tham_Số As Kiểu_Dữ_Liệu
ByVal | ByRef là kiểu tham chiếu của tham số. ByVal là tham chiếu theo kiểu tham trị.
ByRef là tham chiếu theo kiểu tham biến. Mặc định là ByVal. Tên_Tham_Số: được đặt theo quy tắc đặt tên.
As: từ khóa
Kiểu_Dữ_Liệu: là các kiểu dữ liệu đã được định nghĩa hoặc các lớp, kiểu dữ liệu người dùng định nghĩa.
Các tham số được phân tách nhau bởi dấu phẩy (,).
Ví dụ sau đây sẽ định nghĩa phương thức sortArrayASC() của lớp doubleArray. Phương thức này không có tham số và sẽ thực hiện sắp xếp các phần tử trong thuộc tính mảng a theo thứ tự từ nhỏ đến lớn. sortArrayASC() không trả về giá trị nào.
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
Phương thức containInArray(ByVal x as Double) sau đây sẽ kiểm tra xem giá trị x có bằng với một phần tử nào của mảng a trong lớp doubleArray không? Nếu bằng, hàm sẽ trả về giá trị TRUE, ngược lại hàm trả về giá trị FALSE.
Public Function containInArray(ByVal x As Double) Dim i As Integer
Dim kt As Boolean kt = False
For i = 1 To n