10.2 Biến đối tượng
Cho đến bây giờ, ta chỉ tham chiếu đến điều khiển hay biểu mẫu thông qua tên ta đặt cho chúng lúc thiết kế. Cách làm này chỉ phù hợp đối với các chương tình đơn giản. Đặt đối tượng vào biến và tham chiếu đến nó bằng tên biến cho phép ta sử dụng cùng đoạn chương trình cho vô số các instance khác nhau của một kiểu đối tượng.
Với biến đối tượng ta có thể:
-
Tạo điều khiển mới trong lúc thi hành.
-
Copy điều khiển để sinh ra một instance mới của điêu khiển hiện hành.
-
Tạo bản sao biểu mẫu cùng tên, cùng điều khiển và chương trình; nhưng từng biểu mẫu chứa và xử lý những dữ liệu khác nhau – tương tự nhiều tài liệu trong ứng dụng của Word hay nhiều bảng tính trong Excel.
Biến đối tượng cung cấp khả năng xây dựng các thủ tục tổng quát để xử lý với những điều khiển nhất định. Ví dụ, một thủ tục kiểm tra dữ liệu của hộp văn bản chỉ dùng trong trường hợp tên điều khiển được chỉ ra trong chương tình. Tuy nhiên, để thủ tục trở thành độc lập với điều khiển bất kỳ, ta xem điều khiển như một biến đối tượng.
Dim NewEmployee As New cEmployee
10.2.1Tạo điều khiển lúc thi hành
Cách đơn giản nhất là tạo một mảng điều khiển vào lúc thiết kế, sau đó, mở rộng mảng bằng chương trình lúc thi hành. Nếu ta định thuộc tính Index của điều khiển đầu tiên là 0 lúc thiết kế, ta có thêm điều khiển lúc thi hành. Điều khiển tạo lúc thi hành có cùng tên, kiểu, và thủ tục xử lý sự kiện như điều khiển ban đầu.
Tương tự biến mảng, ta có thể mở rộng hoặc rút gọn mảng điều khiển. Điểm khác nhau là ta không Redim mảng điều khiển như với biến mảng. Thay vào đó, ta phải Load bản instance mới của điều khiển vào mảng. Khi muốn xoá điều khiển, ta Unload chúng.
Ví dụ mẫu - Tạo điều khiển lúc thi hành
Thử tạo một dãy các nút lệnh trên biểu mẫu. Vẽ một nút lệnh lúc thiết kế và dùng chương trình để tạo phần còn lại.
-
Tạo đề án mới và vẽ một nút lệnh trên biểu mẫu.
-
Đổi thuộc tính Index thành 0. Khi ấy một mảng điều khiển có một phần tử được tạo ra.
-
Đưa đoạn chương tình sau vào thủ tục Click của nút lệnh:
Private Sub Command1_Click(Index As Integer)
Static sNextOperation As String
Dim nIndex As Integer
For nIndex = 1 To 5
If sNextOperation = "UNLOAD" Then
Unload Command1(nIndex)
Else
Load Command1(nIndex)
With Command1(nIndex)
.Top = Command1(nIndex - 1).Top + Command1(nIndex - 1).Height
.Caption = nIndex
.Visible = True
End With
End If
Next
If sNextOperation = "UNLOAD" Then
sNextOperation = "LOAD"
Else
sNextOperation = "UNLOAD"
End If
End Sub
-
Thi hành đoạn chương trình và nhấn trên nút lệnh vài lần. Mỗi lần nhấn, 5 nút lệnh được tạo hoặc xoá.
-
Lưu vào đĩa với tên NewCtrl.vbp
Vòng lặp For...Next tạo hoặc xoá nút lệnh này tuỳ theo nội dung biến sNextOperation. Trước hết, nội dung của sNextOperation được kiểm tra để xem cần Load hay Unload các phần tử. Lần đầu, sNextOperation chưa được gán, nó rơi vào phần False, nghĩa là Load.
Bởi mặc định, điều khiển mới tạo lúc thi hành xuất hiện tại cùng vị trí với điều khiển gốc, và không hiển thị. Do đó, ta có thể đổi vị trí và điều chỉnh kích cỡ mà không để người sử dụng thấy. Nó cũng cấm Windows vẽ lại mỗi lần nạp các điều khiển, không những làm chậm chương trình mà còn hiển thị không có trật tự trong khi ta đang di chuyển chúng. Ta chỉ cho chúng hiển thị sau khi đã có vị trí mới.
10.2.2Sự kiện của mảng điều khiển
Mặc dù hiển thị khác nhau, 6 phần tử vẫn chia sẻ một thủ tục xử lý sự kiện, vì nhấn vào một nút bất kỳ, chúng đề đáp ứng như nau. Ta có thể xử lý các sự kiện theo từng nút lệnh phân biệt, dựa trên Index của mảng điều khiển.
Ví dụ mẫu - Xử lý sự kiện với mảng điều khiển
-
Mở đề án NewCtrl.vbp và chọn sự kiện Click trên nút lệnh.
-
Thêm đoạn chương trình sau vào:
Private Sub Command1_Click(Index As Integer)
Static sNextOperation As String
Dim nIndex As Integer
Select Case Index
Case 0
For nIndex = 1 To 5
If sNextOperation = "UNLOAD" Then
Unload Command1(nIndex)
Else
Load Command1(nIndex)
With Command1(nIndex)
.Top = Command1(nIndex - 1).Top + Command1(nIndex - 1).Height
.Caption = nIndex
.Visible = True
End With
End If
Next
If sNextOperation = "UNLOAD" Then
sNextOperation = "LOAD"
Else
sNextOperation = "UNLOAD"
End If
Case 1, 2, 3, 4, 5
MsgBox "You pressed Button " & Index
End Select
End Sub
-
Thi hành chương trình. Nhấn chuột trên từng nút lệnh, một thông điệp xuất hiện cho biết thứ tự nút nhấn.
10.2.3Quản lý điều khiển như biến đối tượng
Không chỉ dùng biến đối tượng như mảng điều khiển, ta còn có thể truyền biến đối tượng và mảng đối tượng vào thủ tục hay hàm.
Ví dụ, ta có khoảng 30 họpp văn bản trên biểu mẫu, từng cái nhận dữ liệu khác nhau. Một số chỉ nhận kiểu số, một số chỉ nhận chữ cái, số khác chấp nhận cả hai, trong khi số còn lại kiểm tra số ký tự nhập vào xem có vượt quá số lượng quy định không? Nếu xử lý riêng rẽ từng điều khiển, ta sẽ tốn rất nhiều đoạn chương tình. Giải pháp là xem hộp văn bản như một đối tượng, và truyền nó đến một thủ tục tổng quát.
10.2.3.1Hàm kiểm tra hộp văn bản
Hàm này sẽ tự động biết kiểu dữ liệu mà mỗi hộp văn bản cũng như chiều dài tối đa của dữ liệu.
Ví dụ mấu - Kiểm tra hộp văn bản
-
Tạo đề án mới và vẽ một biểu mẫu gồm các điều khiển như sau:
-
Thiết lập thuộc tính cho hộp văn bản như sau:
Mô tả
|
Thuộc tính
|
Giá trị
|
Hộp “alphabetic only” (chỉ nhận chữ)
|
Name
Index
Tag
|
txtValidate
0
A12
|
Hộp “Numbers” (chỉ nhận số)
|
Name
Index
Tag
|
txtValidate
1
N5
|
Hộp “Anything” (nhận mọi thứ)
|
Name
Index
Tag
|
txtValidate
0
*4
|
Lưu ý rằng chữ cái trong thuộc tính Tag trong cửa sổ Properties phải là chữ in hoa, nếu không ví dụ không hoạt động.
-
Phần còn lại là viết chương trình. Mở cửa sổ Code, đưa đoạn chương trình sau vào:
Option Explicit
Private Sub ValidateKeyPress(txtControl As TextBox, nKeyAscii As Integer)
Dim sMaxLength As String
Dim sKey As String * 1
If nKeyAscii < 32 Or nKeyAscii > 126 Then Exit Sub
sMaxLength = Right$(txtControl.Tag, Len(txtControl.Tag) - 1)
If Len(txtControl.Text) >= Val(sMaxLength) Then
Beep
nKeyAscii = 0
Exit Sub
End If
Select Case Left$(txtControl.Tag, 1)
Case "A"
sKey = UCase(Chr$(nKeyAscii))
If Asc(sKey) < 65 Or Asc(sKey) > 90 Then
Beep
nKeyAscii = 0
Exit Sub
End If
Case "N"
If nKeyAscii < 48 Or nKeyAscii > 57 Then
Beep
nKeyAscii = 0
Exit Sub
End If
End Select
End Sub
-
Thi hành chương trình.
ValidateKeyPress là thủ tục ở mức biểu mẫu và được khai báo trong phần General. nKeyAscii là mã của phím nhấn. Vì từ khoá ByVal không được nêu ra, nên tham số được truyền bằng tham chiếu. Đổi KeyAscii về 0 trong sự kiện KeyPress nghĩa là phím nhấn.
Thuộc tính Tag được dùng như một nhãn riêng đa năng cho các điều khiển. Nó cho biết kiểu dữ liệu được cho phép trong mỗi hộp văn bản. Ký tự đầu tiên định nghĩa kiểu dữ liệu cho phép, ‘A’ nghĩa là chỉ có chữ cái, ‘N’ nghĩa là số, còn lại là các kiểu khác. Con số kế tiếp quy định số ký tự tối đa trong mỗi hộp văn bản.
Ta có thể đổi kiểu dữ liệu của mỗi hộp văn bản bằng cách đổi thuộc tính Tag trong cửa sổ Properties.
Giai đoạn đầu tiên, chương tình kiểm tra nKeyAscii cho các ký tự đặc biệt. Nếu chúng được nhấn, phím đó sẽ được bỏ qua.
If nKeyAscii < 32 Or nKeyAscii > 126 Then Exit Sub
Dòng lệnh kế lấy giá trị từ thuộc tính Tag đưa vào biến sMaxLength.
Sau đó, kiểm tra chiều dài tối đa:
If Len(txtControl.Text) >= Val(sMaxLength) Then
Beep
nKeyAscii = 0
Exit Sub
End If
Select Case so sánh phím ký tự với kiểu dữ liệu quy định trong thuộc tính Tag. Hàm Chr$ chuyển mã ký tự nKeyAscii thành chuỗi ký tự tương ứng. Hàm Asc làm ngược lại và trả về mã ký tự ASCII của một ký tự.
10.2.4Khai báo biến đối tượng
Ta có thể khai báo một biến đối tượng một cách tường minh như khai báo biến thông thường bằng cách cung cấp một kiểu dữ liệu mà VB nhận ra.
Dim txtControl As TextBox
Chương trình sẽ hiệu quả, dễ gỡ rối và chạy nhanh hơn khi khai báo biến đối tượng tường minh. Tuy nhiên, VB cũng cho phép khai báo một biến đối tượng “ẩn”:
Dim cltControl As Control
Tham số hàm và thủ tục có thể khai báo kiểu này. Nó cho phép ta truyền một điều khiển bất kỳ. Sau đó, dùng dòng lệnh TypeOf để kiểm tra kiểu điều khiển liên quan đến một đối tượng.
Nếu khai báo tường minh, VB kiểm tra thuộc tính của đối tượng ngay lúc biên dịch. Nếu khai báo ẩn, VB chỉ kiểm tra thuộc tính lúc thi hành.
10.2.4.1Kiểu của biến đối tượng
Sau đây là danh sách các kiểu đối tượng tường minh mà VB có thể nhận ra:
CheckBox
|
ComboBox
|
CommandButton
|
MDIForm
|
Data
|
DirListBox
|
DriveListBox
|
FileListBox
|
Grid
|
Frame
|
HscrollBar
|
Image
|
Label
|
Line
|
ListBox
|
menu
|
OptionButton
|
OLE
|
PictureBox
|
Shape
|
TextBox
|
Timer
|
VscrollBar
|
Form
|
Đây là những đối tượng chuẩn. Chúng là những tên lớp và được đặt kế bên tên điều khiển trong cửa sổ Properties.
Ví dụ mẫu – So sánh khai báo tường minh và ẩn
-
Tạo đề án mới. Vẽ biểu mẫu như sau:
-
Đặt tên điều khiển nhãn trống là lblTime, nút lệnh là cmdExplicit và cmdImplicit.
-
Mở cửa sổ Code, đưa đoạn chương trình sau vào:
Private Sub cmdExplicit_Click()
Dim varTime As Variant
Dim nIndex As Integer
varTime = Now
For nIndex = 1 To 15000
Time_Explicit cmdExplicit, nIndex
Next
cmdExplicit.Caption = "&Explicit"
lblTime.Caption = Minute(Now - varTime) & " Mins, " & _
Second(Now - varTime) & " Secs"
End Sub
Private Sub cmdImplicit_Click()
Dim varTime As Variant
Dim nIndex As Integer
varTime = Now
For nIndex = 1 To 15000
Time_Implicit cmdImplicit, nIndex
Next
cmdImplicit.Caption = "&Implicit"
lblTime.Caption = Minute(Now - varTime) & " Mins, " & _
Second(Now - varTime) & " Secs"
End Sub
Đưa 2 thủ tục sau vào phần (General)
Private Sub Time_Explicit(cmdCommand As CommandButton, nNumber As Integer)
cmdCommand.Caption = nNumber
End Sub
Private Sub Time_Implicit(cmdCommand As Control, nNumber As Integer)
cmdCommand.Caption = nNumber
End Sub
-
Thi hành ứng dụng bằng cách nhấn F5.
-
Khi biểu mẫu xuất hiện, nhấn nút Explicit. Chương trình báo thời gian hiển thị liên tục 15000 tiêu đề khác nhau trên nút lệnh. Nút lệnh là một biến đối tượng được khai báo tường minh.
-
Nhấn chuột trên nút Implicit. Mọi việc xảy ra tương tự, nhưng lần này nút lệnh là một biến đối tượng được khai báo ẩn.
Để ý bạn sẽ thấy nhấn trên Implicit chậm hơn nhấn trên Explicit khoảng 10%.
Chia sẻ với bạn bè của bạn: |