a. Phương thức: Click
3.2. Biến và cách sử dụng biến Hằng
Hằng
Dùng để chứa những dữ liệu tạm thời nhưng không thay đổi trong suốt thời gian chương trình hoạt động. Sử dụng hằng số làm chương trình sáng sủa và dễ đọc nhờ những tên gợi nhớ thay vì các con số. VB cung cấp một số hằng định nghĩa sẵn, nhưng ta có thể tự tạo hằng.
Ta có thể dùng cửa sổ Object Browser để xem danh sách các ứng dụng hằng có sẵn của VB và VBA( Visual basic for Application). Các ứng dụng khác cung cấp những thư viện đối tượng, như Microsoft Exel, Microsoft Project, hoặc các thư viện của điều khiển ActiveX cũng có hằng định nghĩa sẵn.
Trong trương hợp trùng tên hằng trong những thư viện khác nhau, ta có thể dung cách chỉ rõ tham chiếu hằng:
[<Libname>][<tên mô-đun>]<tên hằng>
Libname là tên lớp, tên điều khiển hoặc tên thư viện.
Khai báo hằng
|Public|private|Const<tên hằng>[As<kiểu dữ liệu>]= <biểu thức>
Tầm hoạt động
Hằng cũng có tầm hoạt động tương tự biến:
• Hằng khai báo trong thủ tục chỉ hoạt động trong thủ tục
• Hằng khai báo trong mô-đun chỉ hoạt động trong mô-đun
• Hằng khai báo Public trong phần Declarations của mô-đun chuẩn có tầm hoạt động trên toàn ứng dụng.Khai báo Public không thể dùng trong mô-đun của biểu mẫu hoặc mô-đun lớp.
Kiểu dữ liệu
Kiểm soát nội dung của dữ liệu. VB dùng kiểu Variant như là kiểu mặc định. Ngoài ra, một số kiểu dữ liệu khác cho phép tối ưu hoá về tốc độ và kích cỡ chương trình. Khi dùng Variant, ta không phải chuyển đổi giữa các kiểu dữ liệu. VB tự động làm việc đó.
Một dòng lệnh có thể kết hợp nhiều kiểu khai báo : Private I as Interger, Amt as double
Private YourName as String, BillsPaid as Currency Private Test,Amount, J as integer
Kiểu số
Integer, Long, Double và Currency. Kiểu số tốn ít vùng chứa hơn kiểu Variant. Tất cả biến kiểu số có thể được gán cho nhau và cho biến Variant. VB làm tròn thay vì chặt bỏ phần thập phân trước khi gắn nó cho số Integer.
Kiểu Integer tốn ít vùng nhớ hơn các kiểu khác, nó thường dùng làm biến đếm trong các vòng lặp For....Next.
Kiểu Single, Double, Currency dùng cho các số có phần thập phân. Currency hỗ trợ đến 4 chữ số phần thập phân và 15 chữ số cho phần nguyên, đùn cho ácc tính toán tiền tệ.
Các giá trị dấu chấm động được thể hiện là :A*10B.Ví dụ: 1.2341E12=1.2341 *1012
3.402823E+38 cho số Single hoặc 1.7976931486232D+308 cho số Double
Ta dùng các phép cộng (+), trừ(-) nhân(*), chia(/ hoặc\). Dấu / là số chia thập phân. Ví dụ: 5/3 cho kết quả là 1.66666666667. Trong khi 5/3 cho kết quả là 1, phần thập phân bị chặt bỏ. Phép tính này đặc biệt nhanh khi sử dụng trong vòng lặp.
Kiểu Byte
Thường dùng đẻ chứa dữ liệu nhị phân. Tất cả các thao tác trên kiểu Integer có thể thực hiện trên kiểu Byte, ngoại trừ dấu. Vì Byte là kiểu không dấu (trong khoản từ 0-255), nó không thể nhận ra số âm.
Kiểu String
Mặc định, biến hay tham số kiểu chuỗi có chiều dài thay đổi, nó có thể tăng hoặc giảm tuỳ theo ta gán dữ liệu. Ta có thể khai báo chuỗi có chiều dài cố định:
Dim EmpName As String *50
Nếu ta gán một chuỗi ngắn hơn 50 ký tự, EmpName sẽ được thêm vào phần đuôi các kỹ tự khoảng trắng cho đầy 50 ký tự, nếu chuỗi gán vào dài hơn 50 ký tự, VB tự động chặt bỏ.
Khi làm việc với chuỗi, ta cần dùng các ham Trim và RTrim để cắt bỏ các ký tự trắng không cần thiết. Ngoài ra một số hàm thông dụng để thao tác trên chuỗi như:
a. Len: Lấy chiều dài chuỗi
b. Mid$: Trích chuỗi con từ chuỗi gốc
c. Left$: Trích chuỗi con từ phần đầu chuỗi gốc. d. Right$:Trích chuỗi con từ phần đuôi của chuỗi gốc.
e. InStr: Tìm chuỗi con trong chuỗi gốc. Nếu hàm InStr trả về 0, nghĩa là không tìm thấy.
Tìm kiếm không phân biệt cõ chữ. Nhưng nếu tham số thứ 3 là vbBinaryCompare thì đây là tìm kiếm chuỗi có phân biệt chữ in hoa và chữ in thường.
f. Replace: Tìm và thay thể chuỗi. Replace(“Peter PeterWright”,” Peter ”,John,6)
Chuỗi kết quả là “John Wright”, bắt đầu từ vị trí thứ 6. Nếu muốn giữ lại phần đầu ta làm như sau: Left$(“Peter Peter Wright”,5)&Replace (“Peter Peter Wright”,”Peter”,”John”,6)
Một tham số khác là số lần thay thế:
Replace(“Peter Peter Peter Wright”,”Peter”,”Hooray”,1,2)
Kết quả là “Hooray Hooray Peter Wright”, nghĩa là hai lần thay thế. THam số này mang giá trị mặc định là -1, nghĩa là thay thế toàn bộ.
Tham số cuối cùng tương tự hàm Instr(), cho biết nó có phân biệt chữ in hoa và chữ thường hay không
Replace(“Peter Wright, “Peter”, “P.”,1,-1,vbTextCompare) Kết quả là “P.Wright”.
Chuỗi có chiều dài cố định được khai báo Public hay Private trong mô-đun chuẩn. Trong mô-đun của biểu mẫu hoặc mô-đun lớp, nó phải được khai báo Private.
VB cho phép chuyển đổi một chuỗi thành thành một số nếu chuỗi đang thể hiện một con số. Ngược lại, ta cũng có thể chuyển một số thành chuỗi. Tuy nhiên nên cẩn thận, vì chuyển đổi một chuỗi có giá trị không phải số sẽ gây lỗi chương trình thi hành.
Một số lập trình viên Visual Basic thích dùng dấu + để nối chuỗi thay vì dùng dấu &. Mặc dù không khác nhau lắm, nhưng thực ra dùng dấu + có điểm bất tiện. Vì là phép toán, nó có kiểm tra kiểu. Nếu ta có một số và một chuỗi nối với nhau, nó sẽ chuyển đổi từ số sang chuỗi trước khi thực sự kết nối. Hơn nữa, việc chuyển đổi này được làm tự động, không hề báo lỗi khi biên dịch.
Hộp thoại này hiển thị khi người sử dụng nhấp đúp chuột vào biểu tượng Regional Setting trong cửa sổ Control Panel của Windows. Nó cho phép quy định kiểu ngày tháng tuỳ thuộc quốc gia. Bên trong chương trình VB xử lý ngày tháng theo kiểu Mỹ #01/02/98# là ngày 2 tháng Giêng năm 1998, nhưng nếu máy đang dùng theo hệ Anh thì nó sẽ hiển thị trên cửa sổ Immediate là 2/1/98
Kiểu Variant
Có thể chứa mọi loại dữ liệu, số, thậm chí mảng. Ta không cần chuyển đổi kiểu dữ liệu, VB làm việc đó một cách tự động.
Dim Somevalue 'Variant by default
Somevalue = "17" 'SomeValue contains "17"(a two character string). Somevalue = Somevalue – 15 'somevalue now cotains the numeric value 2. Somevalue = "U" & Somevalue 'somevalue now cotains.
Variant cũng thuận tiện khi ta không biết trước kiểu dữ liệu Private Sub cmdExplore_click()
Dim VarVariant As Variant VarVariant = 12 Form1.Print VarType(VarVariant) VarVariant = "Peter" Form1.Print VarType(VarVariant) VarVariant = True Form1.Print VarType(VarVariant) VarVariant = #1/1/2001# Form1.Print VarType(VarVariant) End Sub
Hàm VarType kiểm tra kiểu dữ liệu
Giá trị VarType Giải thích
0 – vbEmpty Không chứa gì cả
1 – vbNull Không có dữ liệu hợp lệ
2 – vbInteger Dữ liệu Integer dạng chuẩn
3 – vbLong Dữ liệu kiểu Long Integer
4 - vbsingle Dữ liệu kiểu chấm động single
5 – vbDouble Dữ liệu kiểu chấm động Double
6 – vbCurrency Kiểu Currency
7 – vbDate Kiểu ngày giờ
8 – vbString Kiểu chuỗi đơn giản
9 – vbObject Kiểu đối tượng
10 – vbError Có một đối tượng Error
11 – vbBoolean Kiểu giá trị Boolean chuẩn
12 – vbVariant Kiểu Variant
13 – vbDataObject Kiểu DAO chuẩn
14 – vbDecimal Giá trị thuộc hệ thập phân Decimal
17 – vbByte Kiểu Byte
36 – UserDefinedType Kiểu do người dùng định nghĩa
8192 - vbArray Kiểu mảng
Tuy nhiên cần chú ý khi dùng biến Variant:
• Nếu muốn thi hành các hàm số học, Variant phải chứa giá trị số.
• Nếu muốn nối chuỗi, dùng toán tử & thay vì toán tử +.
Giá trị Empty
Đôi khi ta cần kiểm tra một giá trị có được gán cho biến hay chưa. Biến Variant có giá trị Empty trước khi nó được gán giá trị. Giá trị Empty là một giá trị đặc biệt không phải zero, không phải chuỗi rỗng(“”), không phải giá trị Null. Ta dùng ham IsEmpty để kiểm tra giá trị Empty:
If IsEmpty(z) then z =0
Khi một biến Variant chứa giá trị Empty, ta có thể dùng nó trong biểu thức. Nó có thể được xem là 0 hoặc chuỗi rỗng tuỳ theo biểu thức.
Giá trị Empty biến mất khi có một giá trị bất kỳ được gán cho Variant. Muốn trở về giá trị Empty, ta gán từ khoá Empty cho Variant.
Giá trị Null
Biến Variant chứa giá trị Null dùng trong những ứng dụng cơ sở dữ liệu thể hiện không có dữ liệu hoặc dữ liệu không xác định.
Dùng hàm IsNull để kiểm tra biến Variant có chứa Null hay không. Biến không bao giờ mang giá trị Null nếu ta không gán trực tiếp cho nó. Vì vậy, không cần phải dùng hàm IsNull.
Nếu gán Null cho một biến khác kiểu Variant, VB sẽ báo lỗi.
Giá trị Error
Trong một biến Variant, Error là một giá trị đặc biệt thể hiện một điều kiện lỗi vừa xảy ra trong thủ tục. Tuy nhiên, không như các lỗi khác, các xử lý lỗi thông thường của ứng dụng không xảy ra. Do đó, ta có thể xử lý dựa trên các giá trị lỗi. Giá trị Error được sinh ra bằng cách chuyển đổi giá trị lỗi dùng cho hàm CVErr.
Chuyển đổi giữa các kiểu dữ liệu
Hàm chuyển đổi Đổi sang kiểu
Cbool Boolean Cbyte Byte Ccur Currency CDate Date CDbl Double Cint Integer CLng Long CSng Single Cstr String Cvar Variant CVErr Error
Lưu ý rằng giá trị truyền cho hàm phải hợp lệ, nghĩa là phải thuộc khoảng của kiểu kết quả. Nếu không VB sẽ báo lỗi.
Kiểu mảng(Array)
Mảng là một xâu các biến có cùng tên và cùng kiểu dữ liệu. Dung Array làm chương trình đơn giản và rút gọn, vì ta có thể dùng vòng lặp. Mảng có biên trên và biên dưới, và các thành phần trong mảng là liên tục giữa 2 biên.
Khái niệm mảng ở đây khác với mảng các điều khiển (Control Array). Control Array không cho phép nạp hay thoát khỏi một thành phần ở giữa Array.
Có 2 loại biến mảng mảng có chiều dài cố định và mảng động, có chiều dài thay đổi lúc thi hành. Mảng có chiều dài cố định có thể được khai báo Public trong ứng dụng. Private trong mô-đun hoặc Private trong một thủ tục.
Mảng có chiều dài cố định Biên trên và biên dưới
Biên trên được xác định ngay lúc khai báo . Dim counters(14) As Integer
Public sums(20) As Double
Mặc định, biên dưới là 0. Ta có thể khai báo tường minh biên dưới: Dim counter(1 To 15) As Integer
Dim sums(100 To 120) As String
a. Hàm UBound trả về phần tử cuối của mảng(Upper Bound). b. Hàm LBound trả về phần tử đầu tiên của mảng (Lower Bound).
Mảng trong mảng
Private Sub command1_click() Dim intX As Integer
'Declare and populate an integer array Dim countersA(5) As Integer For intX = 0 To 4
Next intX
'Declare and populate a string array Dim countersB(5) As String For intX = 0 To 4
countersB(intX) = "Hello" Next intX
Dim arrX(2) As Variant 'Declare a new two-member arrX(1) = countersA()
arrX(2) = countersB()
MsgBox arrX(1)(2) ' display a member of each array MsgBox arrX(2)(3)
End Sub
Mảng nhiều chiều
Ta khai báo một mảng 2 chiều có 10 phần tử Static MatrixA(9, 9) As Double
Static MatrixA(1 To 10, 1 To 10) As Double Dim MultiD(3, 1 To 10, 1 To 15)
Khai báo này tạo ra một mảng 3 chiều có kích cỡ 4×10×15, là số phần tử của ma trân,600
Nên thận trọng trong khi sử dung các mảng nhiều chiều, nhất là các mảng các Variant vì nó lớn hơn các kiểu dữ liệu khác.
Mảng động(dynamic Array)
Mảng này có thể thay đổi kích cỡ. là một trong những ưu điểm của Visual Basic, mảng động giúp quản lý bộ nhớ một cách hiệu quả. Ta có thể dùng một mảng lớn trong thời gian ngắn, sau đó xoá bỏ để trả vùng nhớ cho hệ thống
Khai báo
• Khai báo Public hoặc Dim trong mô-đun, hoặc khai báo Static hay Dim trong thủ tục. Khai báo một mảng động bằng cách cho nó một danh sách không theo chiều nào cả.
Dim DynArray(0
• Cấp phát số phần tử thực sự bằng dòng lệnh ReDim. ReDim DynArray(x+1)
Sử dụng ReDim
Dòng lệnh ReDim chỉ có thể xuất hiện trong thủ tục. Khác với Dim hay Static, ReDim là một dòng lệnh thi hành, nó làm ứng dụng phải thực hiện một hành động lúc chạy chương trình. Sử dụng ReDim tương tự trong mảng có chiều dài cố định, dùng thay đổi số phần tử cũng như biên trên hoặc biên dưới. tuy nhiên, số chiều không thay đổi.
ReDim DynArray(4 to 12) Dim Matrix1() as integer Sub CalcValuesNow() - - - ReDim Matrix1(19,29) End sub
Mỗi lần gọi ReDim, tất cả các giá trị chứa trong mảng hiện hành bị mất. Vb khởi tạo lại giá trị cho chúng (Empty đối với mảng Variant, 0 cho mảng số, chuỗi rỗng cho mảng chuỗi, hoặc nothing cho mảng các đối tượng). Cách này tiện lợi khi ta muốn thêm dữ liệu mới hoặc muốn xoá bớt vùng nhớ. Đôi khi, ta muốn thay đổi kích cỡ của mảng mà không mất dữ liệu. Ta dùng ReDim với từ khoá Preserve. Ví dụ, mở rộng mảng thêm một phần tử và không mất dữ liệu:
ReDim Preserve DynArray(UBound(DynArray)+1)
Tuy nhiên chỉ có biên trên của chiều cuối cùng trong mảng được thay đổi khi ta dùng Preserve. Nếu thay đổi chiều khác, hoặc biên dưới của chiều cuối cùng VB sẽ báo lỗi.
Một số tính năng mở rộng của mảng
Không những gán mảng cho một mảng, ta còn tạo các hàm trả về mảng và các thuộc tính trả về mản. Trong nhiều trường hợp, những kỹ thuật này sẽ cải tiến đáng kể tốc độ xử lý chương trình
Sao chép mảng
Trong Visual Basic 5, để sao chép từ một mảng sang một mảng khác, ta phải dung vòng lặp For Each quét qua mảng nguồn, rồi tuần tự ReDim lại mảng đích để copy từng phần tử.
Tuy nhiên cách này chỉ áp ụng cho mảng Dynamic mà thôi. Khi gán biến, có một số quy luật mà ta cần nhớ. Ví dụ: Ta có thể gán một giá trị kiểu Integer vào biến long, không vấn đề nhưng gán Long cho Integer sẽ gây lỗi tràn. Ngoài quy luật về kiểu dữ liệu, việc gán mảng cũng có những quy luật liên quan đên số chiều, kích thước của chiều và laọi mảng gì (mảng có chiều dài cố định hay mảng động)
Gán mảng với chiều và kiểu dữ liệu khác nhau có thể không thành công, do những nguyên nhân sau:
• Mảng bên trái dấu gán(=) là mảng chiều dài cố định hay mảng động
• Số chiều của mảng bên trái có đồng nhất với số chiều của mảng bên phải không
• Số phần tử trên mỗi chiều của mỗi bên có tương thích không. Chiều có thể tương thích thậm chí khi khai báo khác nhau, ví dụ như một mảng bắt đầu từ số 0 trong khi mảng kia bắt đầu từ số 1 miên là chúng có cùng số phần tử
Kiểu dữ liệu cảu các phần tử mỗi bên phải tương thích.
- Chia nhỏ chương trình thành nhiều phần logic, giúp gỡ rối dễ dàng. - Thủ tục có thể được sử dụng lại trong một ứng dụng khác.
.