MỤC LỤC MỤC LỤC .................................................................................................................... i DANH MỤC HÌNH VẼ ............................................................................................ vii
CHƢƠNG 1 ................................................................................................................. 1
GIỚI THIỆU VỀ LẬP TRÌNH WINDOWS ............................................................... 1
VÀ VISUAL BASIC 6.0 ............................................................................................ 1 1.1. Giới thiệu về lập trình Windows ...................................................................... 1 1.2. Thƣ viện liên kết động ...................................................................................... 3
1.3. Windows API .................................................................................................... 4 1.3.1. Gọi API ...................................................................................................... 4
1.3.2. Khai báo một cuộc gọi API: ..................................................................... 4
1.3.3. Trình duyệt API ( API Text Viewer)......................................................... 5
1.4. Liên lạc với các ứng dụng của Windows .......................................................... 7
1.4.1. Clipboard ................................................................................................... 7
1.4.2. Chạy một chƣơng trình của Windows ....................................................... 7
1.5. Giới thiệu Visual Basic 6.0 ............................................................................... 7
1.5.1. Khởi động Visual Basic 6.0 ....................................................................... 8
1.5.2. Giới thiệu màn hình làm việc .................................................................... 9
1.6. Các thao tác cơ bản với các đối tƣợng trên Form ........................................... 12
1.6.1. Đƣa một đối tƣợng lên Form ................................................................... 12
1.6.2. Chọn một đối tƣợng ................................................................................. 13
1.6.3. Di chuyển đối tƣợng ................................................................................ 13
1.6.4. Hiệu chỉnh kích thƣớc đối tƣợng ............................................................. 13
1.6.5. Xoá đối tƣợng .......................................................................................... 14
1.6.6. Khoá đối tƣợng ........................................................................................ 14 1.6.7. Focus và thứ tự Tab của các điều khiển .................................................. 14
1.7. Làm việc với Project ....................................................................................... 15 1.7.1. Thành phần của một Project .................................................................... 15
1.7.2. Thêm một Form mới vào Project ............................................................ 15 1.7.3. Xoá Form khỏi Project ............................................................................ 16 1.7.4. Ghi Project lên đĩa ................................................................................... 16 1.7.5. Nạp Project từ đĩa .................................................................................... 16
1.7.6. Tạo Project mới ....................................................................................... 17
1.7.7. Thiết lập form khởi động cho Project ..................................................... 17
1.7.8. Tạo tập tin EXE ....................................................................................... 18
i
1.8. Câu hỏi trắc nghiệm ........................................................................................ 19 CHƢƠNG 2 ............................................................................................................... 21
CƠ SỞ LẬP TRÌNH TRONG VISUAL BASIC 6.0 ................................................ 21
2.1. Thuộc tính, phƣơng thức và sự kiện .............................................................. 21 2.1.1. Đối tƣợng ................................................................................................ 21
2.1.2. Thuộc tính ............................................................................................... 21
2.1.3. Phƣơng thức ............................................................................................ 22
2.1.4. Sự kiện .................................................................................................... 22 2.2. Giới thiệu một số điều khiển thông dụng ....................................................... 23
2.2.1. Điều khiển Label.................................................................................... 23
2.2.2. Điều khiển TextBox ............................................................................... 23
2.2.3. Điều khiển CommandButton ................................................................. 25 2.2.4. Form (biểu mẫu) .................................................................................... 25
2.2.5. MDI Form .............................................................................................. 27
2.3. Soạn thảo chƣơng trình .................................................................................. 28
2.4. Các kiểu dữ liệu ............................................................................................. 30
2.4.1. Kiểu số .................................................................................................... 30
2.4.2. Kiểu ngày giờ (Date) .............................................................................. 31
2.4.3. Kiểu lô-gic (Boolean) ............................................................................. 31
2.4.4. Kiểu đối tƣợng (Object) .......................................................................... 31
2.4.5. Kiểu tổng quát (Variant) ......................................................................... 31 2.5. Biến ................................................................................................................ 31
2.5.1. Khai báo biến .......................................................................................... 32
2.5.2. Phạm vi sử dụng của biến ....................................................................... 32
2.6. Hằng ............................................................................................................... 35
2.7. Toán tử ........................................................................................................... 35
2.7.1. Các phép toán số học .............................................................................. 35
2.7.2. Các phép toán quan hệ (hay phép so sánh) ............................................. 36
2.7.3. Các phép toán logic ................................................................................ 36
2.8. Một số hàm chuẩn .......................................................................................... 36 2.8.1. Hàm đại số .............................................................................................. 36 2.8.2. Hàm thời gian ......................................................................................... 37 2.8.3. Hàm chuyển đổi ...................................................................................... 38 2.8.4. Hàm kiểm tra kiểu dữ liệu ...................................................................... 39 2.8.5. Hàm định dạng ........................................................................................ 39
2.9. Hiển thị và nhập thông tin .............................................................................. 40 2.9.1. Hộp thông báo......................................................................................... 40
2.9.2. Hiển thị thông tin lên Form .................................................................... 43
ii
2.9.3. Hộp nhập dữ liệu .................................................................................... 43
2.10. Quy ƣớc viết lệnh ......................................................................................... 44
2.10.1. Lệnh gán ................................................................................................ 44 2.10.2. Ngăn cách các câu lệnh trên một dòng .................................................. 44
2.10.3. Kéo dài câu lệnh trên hai dòng .............................................................. 45
2.10.4. Nối 2 xâu kí tự ....................................................................................... 45
2.10.5. Qui ƣớc đặt tên biến và tên đối tƣợng ................................................... 45 2.11. Lệnh If…Then .............................................................................................. 46
2.12. Lệnh Select Case ........................................................................................... 47
2.13. Lệnh For…Next ............................................................................................ 50
2.14. Lệnh Do While...Loop .................................................................................. 50 2.15. Lệnh Do…Loop While ................................................................................. 51
2.16. Lệnh Do Until…Loop................................................................................... 51
2.17. Lệnh Do…Loop Until................................................................................... 52
2.18. Lệnh While..Wend ........................................................................................ 52
2.19. Lệnh Goto ..................................................................................................... 52
2.20. Hàm và thủ tục .............................................................................................. 53
2.20.1. Khai báo thủ tục và hàm ........................................................................ 53
2.20.2. Lời gọi thủ tục, hàm .............................................................................. 54
2.20.3. Thoát khỏi thủ tục / hàm ........................................................................ 54 2.20.4. Tham số và việc truyền tham số cho chƣơng trình con ......................... 54
2.20.5. Phạm vi hoạt động của các thủ tục và hàm ........................................... 57
2.21 Module ........................................................................................................... 57
2.21.1 Bổ sung Standard Module vào Project ................................................... 58
2.21.2. Khai báo trong module .......................................................................... 58
2.22. Xâu ký tự ...................................................................................................... 58
2.22.1. Khai báo................................................................................................. 58
2.22.2. Các hàm xử lý xâu ký tự ........................................................................ 59
2.23. Mảng ............................................................................................................. 60 2.23.1. Khai báo mảng ....................................................................................... 60 2.23.2. Truy xuất các phần tử mảng .................................................................. 61 2.23.3. Mảng động và mảng tĩnh ....................................................................... 61 2.23.4. Mảng đối tƣợng điều khiển ................................................................... 64 2.24. Kiểu Collection ............................................................................................. 65
2.24.1. Tạo Collection ....................................................................................... 65 2.24.2. Truy xuất giá trị trong Collection .......................................................... 66
2.24.3. Xoá một giá trị trong Collection............................................................ 67
iii
2.24.4. Thay đổi giá trị một phần tử trong Collection ....................................... 67
2.25. Bản ghi ......................................................................................................... 67
2.25.1. Khai báo kiểu bản ghi ........................................................................... 67 2.25.2. Khai báo biến bản ghi ........................................................................... 68
2.25.2. Sử dụng biến bản ghi ............................................................................ 68
2.26. Tệp tin .......................................................................................................... 69
2.26.1. Phân loại tệp tin .................................................................................... 69 2.26.2. Thủ tục truy xuất tệp tin ....................................................................... 69
2.27. Câu hỏi trắc nghiệm ..................................................................................... 75
2.28. Bài tập .......................................................................................................... 79
CHƢƠNG 3 ............................................................................................................... 82 LẬP TRÌNH VỚI CÁC ĐIỀU KHIỂN THÔNG DỤNG ......................................... 82
3.1. Điều khiển Frame ........................................................................................... 82
3.2. Điều khiển Shape ........................................................................................... 82
3.3. Điều khiển Line .............................................................................................. 82
3.4. Điều khiển CheckBox .................................................................................... 83
3.5. Điều khiển OptionButton ............................................................................... 83
3.6. Điều khiển ListBox ........................................................................................ 85
3.6.1. Thêm các phần tử vào trong hộp danh sách. .......................................... 86
3.6.2. Xoá các phần tử trong danh sách. ........................................................... 87 3.7. Điều khiển ScrollBar ...................................................................................... 89
3.8. Điều khiển Image và điều khiển Picture ........................................................ 90
3.8.1. Điều khiển ảnh Image ............................................................................. 90
3.8.2. Điều khiển hộp hình................................................................................ 90
3.9. Các điều khiển DriveListBox, DirListBox và FileListBox ........................... 92
3.10. Điều khiển Timer ......................................................................................... 94
3.11. Xử lý chuột ................................................................................................... 96
3.12. Xử lý bàn phím ............................................................................................ 97
3.13. Câu hỏi trắc nghiệm ..................................................................................... 98 3.14. Bài tập ........................................................................................................ 100 CHƢƠNG 4 ............................................................................................................. 103 LẬP TRÌNH VỚI CÁC ĐIỀU KHIỂN MỞ RỘNG ............................................... 103 4.1. Điều khiển Common Dialog ........................................................................ 103 4.1.1. Open Dialog, Save Dialog .................................................................... 103
4.1.2. Color Dialog ......................................................................................... 105 4.1.3. Font Dialog ........................................................................................... 106
4.2. Điều khiển Image List .................................................................................. 106
iv
4.2.1. Thêm phần tử ảnh cho ImageList lúc thiết kế ...................................... 107
4.2.2. Thêm phần tử ảnh cho ImageList vào lúc thi hành ............................... 107
4.2.3. Gỡ bỏ phần tử ảnh khỏi ImageList vào lúc thi hành ............................. 108 4.2.4. Truy xuất phần tử ảnh trong ImageList. ................................................ 108
4.3. Điều khiển MicroSoft Masked Edit .............................................................. 110
4.3.1. Dùng thuộc tính Mask để quy định mặt nạ nhập. .................................. 110
4.3.2. Dùng thuộc tính Format để thay đổi hiển thị thông tin. ........................ 111 4.4. Điều khiển ToolBar ...................................................................................... 111
4.4.1. Thêm một nút lên thanh ToolBar .......................................................... 111
4.4.2. Chèn hình ảnh từ ImageList lên các nút ................................................ 111
4.2.3. Các thuộc tính chính của Button trên ToolBar ...................................... 112 4.5. Điều khiển TreeView .................................................................................... 112
4.5.1. Các thuộc tính ........................................................................................ 112
4.5.2. Phƣơng thức .......................................................................................... 114
4.5.3. Sự kiện ................................................................................................... 114
4.6. Điều khiển MultiMedia................................................................................. 114
4.7. Menu ............................................................................................................. 116
4.8. Điều khiển RichTextBox .............................................................................. 122
4.8.1. Các thuộc tính ........................................................................................ 123
4.8.2. Các phƣơng thức ................................................................................... 123 4.9. Câu hỏi trắc nghiệm ...................................................................................... 123
4.9. Bài tập ........................................................................................................... 125
CHƢƠNG 5. LẬP TRÌNH CƠ SỞ DỮ LIỆU ......................................................... 129
5.1. Nhắc lại một số khái niệm về cơ sở dữ liệu .................................................. 129
5.1.1. Khái niệm cơ sở dữ liệu......................................................................... 129
5.1.2. Engine (bộ máy) CSDL ......................................................................... 129
5.1.3. Bảng (Table), Trƣờng (Field), Bản ghi (Record) .................................. 129
5.1.4. Recordset ............................................................................................... 130
5.2. Visual Data Manager .................................................................................... 131 5.2.1. Tạo cơ sở dữ liệu ................................................................................... 131 5.2.2. Tạo bảng ................................................................................................ 132 5.2.3. Tạo form dữ liệu tự động ....................................................................... 134 5.3. Các đối tƣợng truy cập dữ liệu ..................................................................... 136 5.3.1. Sử dụngTextBox .................................................................................... 136
5.3.2. Sử dụng DBGrid .................................................................................... 137 5.3.3. Sử dụng các điều khiển khác ................................................................. 137
5.4. Truy xuất dữ liệu thông qua Data Control .................................................... 138
v
5.4.1. Các thuộc tính ........................................................................................ 138
5.4.2. Cách sử dụng điều khiển Data .............................................................. 139
5.4.3. Ví dụ minh hoạ ..................................................................................... 141 5.5. Truy xuất dữ liệu thông qua DAO ............................................................... 150
5.5.1. Tham chiếu đến thƣ viện đối tƣợng của DAO ..................................... 151
5.5.2. Đối tƣợng Workspace ........................................................................... 153
5.5.3. Đối tƣợng Database .............................................................................. 154 5.5.4 Đối tƣợng Recordset .............................................................................. 154
5.5.4. Đối tƣợng Field ..................................................................................... 162
5.6. Truy xuất dữ liệu thông qua ADO ............................................................... 162
5.6.1. Tham chiếu đến ADO ........................................................................... 162 5.6.2. Mô hình đối tƣợng của ADO ................................................................ 163
5.6.3. Các đối tƣợng trong mô hình ADO ...................................................... 163
5.6.4. Ví dụ minh hoạ ..................................................................................... 180
5.7. Tạo báo cáo .................................................................................................. 186
5.7.1. Tạo liên kết dữ liệu sử dụng Data View ............................................... 186
5.7.2. Tạo trình thiết kế môi trƣờng dữ liệu sử dụng Data View ................... 187
5.7.3. Tạo báo cáo dữ liệu ............................................................................... 188
5.7.3. Tạo báo cáo dữ liệu sử dụng đối tƣợng Command ............................... 191
5.7.4. Tạo báo cáo phân nhóm ........................................................................ 194 5.7.5. Tạo báo cáo có hàm tính toán ............................................................... 196
5.8. Trình đóng gói và triển khai ứng dụng ........................................................ 222
5.8.1. Phát hành ứng dụng .............................................................................. 222
5.8.2. Mở trình đóng gói và triển khai ứng dụng ............................................ 223
5.8.3. Mở trình đóng gói và triển khai nhƣ một ứng dụng độc lập................. 227
5.8.4. Setup toolkit .......................................................................................... 227
5.9. Bài tập .......................................................................................................... 228
vi
TÀI LIỆU THAM KHẢO ....................................................................................... 235
DANH MỤC HÌNH VẼ
vii
Hình 1.1. Cơ chế xử lý chỉ lệnh của Windows ................................................. 2 Hình 1.2. Cửa sổ API Viewer ........................................................................... 5 Hình 1.3. Danh sách hàm trong Win32API ...................................................... 6 Hình 1.4. Cú pháp hàm AddPrinter trong cửa sổ API Viewer ......................... 6 Hình 1.5 Khởi động Visual Basic 6.0 từ nút Start ............................................ 8 Hình 1.6. Biểu tƣợng của Visual Basic 6.0 trên màn hình nền......................... 8 Hình 1.7. Màn hình làm việc của Visual Basic 6.0 .......................................... 9 Hình 1.8. Cửa sổ Project Explorer .................................................................. 11 Hình 1.9. Cửa sổ thuộc tính (Properties) ........................................................ 12 Hình 1.10. Cửa sổ Form Layout ..................................................................... 12 Hình 1.11. Lệnh Lock Control trên lệnh đơn Format ..................................... 14 Hình 1.12. Hộp thoại Add Form ..................................................................... 15 Hình 1.13. Hộp thoại tạo một Project mới (New Project) .............................. 16 Hình 1.14. Hộp thoại mở Project đã có (Open Project) .................................. 17 Hình 1.15. Hộp thoại Project Properties ......................................................... 18 Hình 1.16. Hộp thoại Make Project ................................................................ 18 Hình 1.17. Hộp thoại Project Properties ......................................................... 19 Hình 2.1. Hộp thoại Options ........................................................................... 30 Hình 2.2. Các vị trí khai báo biến trong cửa sổ lệnh (Code) .......................... 33 Hình 2.3. Khai báo Option Explicit trong cửa sổ lệnh ................................... 34 Hình 2.4. Hộp thông báo (MsgBox) ............................................................... 41 Hình 2.5. Hộp nhập dữ liệu (InputBox) .......................................................... 43 Hình 3.1. Nhập các giá trị cho thuộc tính List của ListBox ........................... 87 Hình 4.1. Hộp thoại Property Pages ............................................................. 107 Hình 4.2. Lệnh đơn Menu Editor .................................................................. 118 Hình 4.3. Công cụ Menu Editor .................................................................... 118 Hình 4.4. Hộp thoại Menu Editor ................................................................. 118 Hình 5.1. Cửa sổ Visual Data Manager (VisData) ....................................... 131 Hình 5.2. Các thành phần trong cửa sổ VisData ........................................... 131 Hình 5.3. Cửa sổ Data Window .................................................................... 132 Hình 5.4. Hộp thoại Table Structure ............................................................. 132 Hình 5.5. Hộp thoại Add Field...................................................................... 133 Hình 5.6. Hộp thoại Add Index to... ............................................................. 134 Hình 5.7. Mục chọn Data Form Designer tạo Form tự động ........................ 135 Hình 5.8. Hộp thoại Data Form Designer ..................................................... 135 Hình 5.9. Mô hình cây phân cấp của đối tƣợng DAO .................................. 151 Hình 5.10. Đƣa them điều khiển vào hộp công cụ ....................................... 163 Hình 5.11. Mô hình đối tƣợng của ADO ...................................................... 163 Hình 5.12. Điều khiển Adodc ....................................................................... 173 Hình 5.13. Thuộc tính ConnectionString trong cửa sổ thuộc tính ................ 174 Hình 5.14. Hộp thoại Property Pages ........................................................... 174 Hình 5.15. Hộp thoại Data Link Properties .................................................. 175 Hình 5.16. Cửa sổ Select Access Database................................................... 176
CHƢƠNG 1
GIỚI THIỆU VỀ LẬP TRÌNH WINDOWS
VÀ VISUAL BASIC 6.0
1.1. Giới thiệu về lập trình Windows
Khi cấu trúc của Windows đƣợc tạo ra, Microsoft có ý định tạo ra một số lớn các chức năng lập trình có giá trị cho mọi chƣơng trình dựa trên nền Windows. Chiến
thuật này phục vụ hai mục đích, cung cấp ứng dụng Windows một cái nhìn và cảm
giác nhất quán cũng nhƣ khiến cho ngƣời lập trình khỏi phải sao chép lại các hàm mà đã đƣợc mã hóa và debug. Những hàm này đƣợc lƣu trữ trong một dãy các thƣ
viện liên kết động ( DLL ) và đƣợc biết nhƣ là giao diện lập trình ứng dụng ( API ).
Từ khi phát triển thành hệ điều hành 32bit, Windows 95 những phiên bản mới đƣợc
biết đến nhƣ Win32 API. Một vài hàm trong Win32 API thì có giá trị nhƣ những
lệnh Visual Basic, nhƣng phần lớn thì đƣợc truy cập chỉ bằng cách gọi hàm API.
Khi nắm rõ bản chất của Windows API để lập trình sâu với hệ thống, ta cũng cần
hiểu biết sơ bộ về Hệ điều hành Windows cách thức điều khiển của Hệ điều hành
đối với ứng dụng để có thể can thiệp nhƣ: bổ sung chức năng thậm chí biến đổi nó,
bắt thực hiện theo hƣớng của mình.
Các chƣơng trình ứng dụng trong Windows có thể có nhiều cửa sổ phục vụ cho
nó. Cửa sổ có thể là Form thậm chí là Dialog. Mỗi cửa sổ này đều có một handle
(cán) để hệ thống nhận biết do chính hệ điều hành Windows tạo ra. Cán cửa sổ này
là chỉ số duy nhất.
Hệ điều hành và chƣơng trình ứng dụng đều duy trì các hàng đợi các chỉ lệnh cần
thực hiện. Mỗi ứng dụng đều có hàng đợi (Message Queue). Khi ngƣời sử dụng ra
lệnh hoặc có một biến cố, các chƣơng trình điều khiển thiết bị nhập (INPUT) sẽ
chuyển các thông tin vào thành chỉ lệnh và đặt chỉ lệnh này vào hàng đợi hệ thống
(System Message Queue). Hệ điều hành lấy lần lƣợt các chỉ lệnh trong hàng đợi hệ thống kiểm tra để xác định cửa sổ nào sẽ tiếp nhận thì sẽ đặt vào hàng đợi của nó (thread message) một chỉ lệnh tƣơng ứng. Các chƣơng trình ứng dụng căn cứ vào chỉ lệnh này để thực hiện cũng nhƣ xử lý chúng. Các cửa sổ giống nhƣ một động cơ tự động chạy theo một vòng lặp. Tiếp "nhiên
1
liệu" cho các "động cơ" này là hệ điều hành Windows. Hệ điều hành Windows nhận các chỉ lệnh (message) từ hàng đợi của hệ điều hành, dùng một hàm dạng API để cung cấp chỉ lệnh tới cửa sổ thông qua cán (handle) của cửa sổ. Có nghĩa là bản thân trong mỗi cửa sổ luôn có một hàm gọi là WinProc đôi khi gọi là WinMain. Hàm này là cốt lõi xử lý của cửa sổ. Trong hàm, nó lặp đi lặp lại liên tục 2 dòng lệnh sau
thông qua cấu trúc:
Do While 0 <>GetMessage (message, 0, 0,0) TranslateMessage message
DispatchMessage message
Loop
Trong đó message là chỉ lệnh mà hệ điều hành cung cấp, thông qua cán (handle) của cửa sổ. Đƣơng nhiên, nếu chỉ lệnh có giá trị WM_QUIT thì hàm WinProc trong
cửa sổ chấm dứt vòng lặp. Còn nếu chỉ lệnh message khác giá trị trên, thì 2 dòng
lệnh trên sẽ thực hiện.
Cụ thể: TranslateMessage message -> Dịch chỉ lệnh thành dạng dữ liệu khác đặt kết quả này
vào hàng đợi của ứng dụng.
DispatchMessage message ->Nhận chỉ lệnh từ hàm GetMessage và gửi cho hệ
thống. Hệ thống sẽ đƣa chỉ lệnh cho ứng dụng.
Windows có hàng ngàn chỉ lệnh khác nhau đó là các hằng dạng WM_*.
Một hàm WinProc luôn nhận vào trong nó các biến theo khuôn mẫu sau để xử lý:
Function WinProc(hwnd as Long, wc as WNDCLASSEX, message as MSG, wParam
as Long, lparam as Long)
Nếu hàm WinProc không xử lý các chỉ lệnh, nó phải đƣa trả chỉ lệnh cho hệ điều hành xử lý thông qua hàm DefWindowProc. Hàm DefWindowProc gởi lại chỉ lệnh
WM_CLOSE cho WinProc. Hàm WinProc sẽ lại gởi trả WM_CLOSE cho
DefWindowProc một lần nữa nhƣ mô tả ở trên.
Ta có thể tóm lại sơ bộ nhƣ sau:
Hình 1.1. Cơ chế xử lý chỉ lệnh của Windows
Các chỉ lệnh đƣa tới ngăn chờ trên thông thƣờng từ các nguồn sau:
1) Hệ thống đặt vào
2
2) Chƣơng trình khác đặt vào
3) Chính chƣơng trình của mình đặt vào thông qua các hàm SendMessage() và
PostMessage().
Tuy nhiên, nếu chọn sử dụng hàm SendMessage() thì sau khi chỉ lệnh đƣợc
WinProc lấy ra xử lý thì chƣơng trình mới tiếp tục chạy tiếp lệnh kế sau. Còn nếu
dùng PostMessage() chỉ có tác dụng đặt chỉ lệnh vào hàng đợi và thực hiện ngay
lệnh kế tiếp. Từ đây ta nhận thấy việc xử lý hệ thống của Windows thông qua cơ chế trên thì
giản đơn đi rất nhiều.
1.2. Thƣ viện liên kết động
Windows cung cấp rất nhiều các hàm gọi dƣới dạng các thƣ viện liên kết động
(Dynamic Link Libraries - DLL). Các tệp tin DLL này đƣợc biên dịch với C/C++.
Thế mạnh của DLL:
Nhất quán: Ngƣời sử dụng ƣa chuộng Windows vì nó không ít thì nhiều có một
giao diện ngƣời sử dụng phổ biến cho mọi ứng dụng. Ví dụ các hộp thoại thông
dụng, các menu, thanh công cụ của Office97… Nghĩa là có những đoạn chƣơng
trình chung để tạo ra chúng.
Dễ bảo trì: Những thay đổi hoặc bổ sung nếu có sẽ thể hiện trên mọi ứng dụng.
Tệp tin EXE nhỏ hơn: Do một phần công việc chứa ở nơi khác, và không gắn kết
“cứng nhắc” nhƣ liên kết tĩnh, kích cỡ tệp tin EXE đƣợc giảm nhỏ.
DLL là nền tảng của thiết kế Windows. Windows thực chất là tập hợp các DLL
để các ứng dụng khác nhau có thể dùng chung. Bên trong các DLL này là hàng trăm
hàm/thủ tục. Ta gọi chúng là Windows API.
Các API đƣợc tổ chức trong bốn DLL chính của Windows:
KERNEL32: Là DLL chính, đảm nhiệm quản lý bộ nhớ, thƣc hiện chức năng đa nhiệm và những hàm ảnh hƣởng trực tiếp đến hoạt động của Windows.
USER32: Thƣ viện quản lý Windows. Thƣ viện này chứa các hàm xử lý menu, định
giờ, truyền tin, tệp tin và nhiều phần không đƣợc hiển thị khác của Windows. GDI32: Giao diện thiết bị đồ hoạ (Graphics Device Interface). Thƣ viện này cung cấp các hàm vẽ trên màn hình, cũng nhƣ kiểm tra phần biểu mẫu nào cần vẽ lại. WINNM: Cung cấp các hàm multimedia để xử lý âm thanh, nhạc, video thời gian thực, lấy mẫu, v.v… Ta có thể tìm các tệp tin này trong thƣ mục C:\Windows\system. Ngoài ra, còn có
3
các DLL nhỏ hơn, cũng đƣợc dùng phổ biến để cung cấp các dịch vụ đặc biệt cho ứng dụng.
1.3. Windows API
1.3.1. Gọi API
Gọi API không khác gì với gọi hàm/ thủ tục trong module của đề án. Ví dụ ta có
thủ tục: Public sub FindText(obiDataControl as Control, SFilename as String) „ Code to implement function here
End sub
Để gọi thủ tục ta dùng :
FindText datTitles, “Titles” Chỉ có điều API là một thủ tục không chỉ nằm ngoài module mà còn nằm ngoài
Visual Basic.
1.3.2. Khai báo một cuộc gọi API:
Trƣớc khi dùng hàm của DLL, ta cần khai báo hàm đó. Visual Basic cần biết:
Tên hàm / thủ tục.
Tệp tin DLL chứa nó.
Tham số truyền.
Kiểu dữ liệu truyền về nếu là hàm.
4
Khai báo API tƣơng tự khai báo hàm/ thủ tục thông thƣờng. Ta vẫn bắt đầu bằng từ khoá Sub/Function, chỉ khác là trƣớc đó phải có từ khoá Declare. Ví dụ: Tạo cửa sổ nhấp nháy bằng cách gọi API Bƣớc 1. Tạo một project mới Bƣớc 2. Đƣa điều khiển định giờ (timer) lên biểu mẫu và gán giá trị cho thuộc tính Interval là 10. Nó sẽ gây ra một sự kiện timer mỗi 10 mi-li-giây. Bƣớc 3. Nhấn đúp lên điều khiển timer này để mở cửa sổ Code và gõ vào thủ tục: Private Sub Timer1_Timer() Dim nReturnValue As Integer nReturnValue= Flash(Form1.hWnd, True) End Sub Bƣớc 4. Khai báo hàm Flash trong General - Declarations Private Declare Function Flash Lib "User32" Alias "FlashWindow" _ (ByVal hWnd As Long, ByVal bInvert As Boolean) As Long Bƣớc 5. Chạy chƣơng trình. Khi biểu mẫu xuất hiện, tiêu đề của nó nhấp nháy. Giải thích: Từ khoá Declare báo Visual Basic biết đây là khai báo một hàm của DLL. Sau Declare là từ khoá Sub hay Function, cho biết đây là thủ tục hay hàm. Ta chỉ có một trong hai lựa chọn. Từ khoá Lib cho biết tên DLL đang chứa hàm/ thủ
tục đó. Ở đây là thƣ viện User32. Từ khoá Alias cho biết tên thực sự của hàm/ thủ tục trong thƣ viện. Nó có thể khác với tên ta khai báo trƣớc từ khoá Lib. Cuối cùng là khai báo các tham số truyền, cùng với kiểu dữ liệu trả về của hàm. Ở đây tham số đƣợc truyền là : (ByVal hWnd As Long, ByVal bInvert As Boolean) As Long Tham số đầu, hWnd, là “handle”, xác định cửa sổ cần nhấp nháy. Tham số thứ hai, bInvert là giá trị Boolean. Nếu bInvert đƣợc truyền vào có giá trị True, thanh tiêu đề sẽ nhấp nháy. Để trả về trạng thái đầu, ta phải gọi lại lần nữa, vớI bInvert mang giá trị False. Sau khi khai báo hàm API, ta có thể gọi API nhƣ một hàm hoặc thủ tục Visual Basic thông thƣờng. Gọi Flash là gọi đến API trong DLL, và ta lƣu giá trị trả về trong biến nReturnValue. Đối với các hàm thông thƣờng, ta có thể không cần sử dụng giá trị trả về của hàm. Tuy nhiên, ta vẫn cần chứa giá trị trả về vào một biến dù ta không có ý định sử dụng nó. Phần lớn API trả về mã lỗi kiểu số, và ta có thể dùng nó để kiểm tra mọi việc có hoạt động chính xác hay không. Trong thực tế, bỏ qua giá trị trả về không chỉ là lƣời biếng mà còn thực sự nguy hiểm nếu ta đang gọi nhiều API. Sử dụng API sai có thể dẫn đến treo Windows, nếu không nói là treo máy. Khi làm việc với các API phức tạp, nhƣ những hàm cần cấp phát nhiều vùng nhớ và tài nguyên hệ thống ta không nên bỏ qua các giá trị trả về. Vì hàm DLL nằm ngoài ứng dụng, chúng tự kiểm tra lỗi ta chỉ biết có sai sót thông qua giá trị trả về.
1.3.3. Trình duyệt API ( API Text Viewer)
Đƣợc cung cấp sẵn khi cài Visual Studio 6.0. Khi ta cần tra cứu cú pháp chính xác của hàm API, ta dùng API Text Viewer. Để sử dụng API Text Viewer, ta chọn Start/All Programs/Microsoft Visual Studio 6.0/Microsoft Visual Studio 6.0 Tools/API Text Viewer khi đó cửa sổ API Viewer xuất hiện nhƣ sau:
5
Hình 1.2. Cửa sổ API Viewer
Để tra cứu hàm nào, ta chọn File/Load Text File từ menu hệ thống, chọn tệp tin
(chẳng hạn Win32API), rồi nhấn Open, khi đó danh sách các hàm API đƣợc khai báo trong file văn bản đó đƣợc hiển thị trong mục Available, nhƣ hình sau:
Hình 1.3. Danh sách hàm trong Win32API
Kích chuột chọn một hàm trong danh sách (chẳng hạn hàm AddPrinter), rồi nhấn
nút Add, cú pháp của hàm sẽ đƣợc hiển thị trong mục Selected Items, nhƣ hình sau:
6
Hình 1.4. Cú pháp hàm AddPrinter trong cửa sổ API Viewer Tuy nhiên, để có thông tin chi tiết hơn nhƣ hàm API làm gì, truyền tham số gì, trả về giá trị gì, ta cần có quyển sách tra cứu.
Ngoài ra, chƣơng trình này còn cho phép copy nội dung API đến clipboard để dán
vào chƣơng trình.
1.4. Liên lạc với các ứng dụng của Windows
1.4.1. Clipboard
Clipboard là vùng bộ nhớ đƣợc Windows quản lý cho phép sao chép dữ liệu giữa các ứng dụng.Visual Basic cho phép ta điều khiển hệ thống clipboard thông qua đối
tƣợng Clipboard. Đối tƣợng này có 6 phƣơng thức và không có thuộc tính. Các
phƣơng thức bao gồm:
Clear: Xóa dữ liệu khỏi clipboard. SetText: Dùng để đặt văn bản vào Clipboard (copy)
GetText: Dùng để lấy văn bản từ Clipboard (paste)
SetData: Dùng để đặt hình ảnh vào Clipboard
GetData: Dùng để lấy hình ảnh từ Clipboard
1.4.2. Chạy một chương trình của Windows
Visual Basic cho phép ta chạy một chƣơng trình khác bằng cách sử dụng thủ tục
Shell
TaskId = Shell(PathName, [WindowStyle])
Trong đó PathNane có thể bao gồm một dòng lệnh. WindowStyle là hằng để xác
định dạng cửa sổ.
Ví dụ: Để khởi động chƣơng trình NotePad và tải một tệp tin “c:\bootlog.txt” vào
chƣơng trình, ta viết lời gọi sau: Shell "notepad c:\bootlog.txt", vbNormalFocus
1.5. Giới thiệu Visual Basic 6.0
7
Visual Basic 6.0 là một công cụ lập trình trực quan. Khác với các môi trƣờng lập trình hƣớng thủ tục, Visual Basic 6.0 là môi trƣờng lập trình hƣớng đối tƣợng. Trong môi trƣờng lập trình hƣớng thủ tục, nếu nhƣ ứng dụng (application) đƣợc thiết kế để giải quyết một vấn đề lớn, thì lập trình viên có thể chia nhỏ vấn đề lớn đó thành nhiều vấn đề nhỏ và viết các hàm/thủ tục để giải quyết riêng từng cái. Còn với lập trình hƣớng đối tƣợng, lập trình viên sẽ chia nhỏ vấn đề cần giải quyết thành các đối tƣợng. Mỗi đối tƣợng có những đặc điểm, mà ta gọi là thuộc tính (properties) và những chức năng riêng biệt mà ta gọi là phƣơng thức (methods). Lập trình viên phải đƣa ra các thuộc tính và phƣơng thức mà đối tƣợng cần thể hiện. Phƣơng thức là đoạn chƣơng trình chứa trong đối tƣợng, cho đối tƣợng biết cách thức để thực hiện một công việc gì đó, phƣơng thức chỉ đƣợc thực hiện khi có lời gọi theo cú pháp:
<đối tƣợng>.
1.5.1. Khởi động Visual Basic 6.0
Ta có thể khởi động Visual Basic 6.0 theo các cách sau: Cách 1: Nhấp trái chuột vào nút Start, chọn Programs, chọn Microsoft Visual Studio
6.0, chọn Microsoft Visual Basic 6.0
Hình 1.5. Khởi động Visual Basic 6.0 từ nút Start
Cách 2: Chọn biểu tƣợng Microsoft Visual Basic 6.0 trên màn hình nền nhấn Enter hoặc nhấp đúp chuột
8
Hình 1.6. Biểu tƣợng của Visual Basic 6.0 trên màn hình nền
1.5.2. Giới thiệu màn hình làm việc
Sau khi khởi động Visual Basic 6.0 chúng ta đƣợc đƣa vào môi trƣờng phát triển tích hợp của Visual Basic (Gọi tắt là IDE- Integrated Development Environment).
Đây là nơi mà ta có thể tạo ra các chƣơng trình.
Hình 1.7. Màn hình làm việc của Visual Basic 6.0
a) Thanh tiêu đề (Title Bar) Thanh tiêu đề thể hiện tên của chƣơng trình (project) mặc định là Project1
b) Thanh thực đơn (Menu Bar) Thanh thực đơn xuất hiện ngay dƣới thanh tiêu đề, chứa các tuỳ chọn thực đơn cho phép ngƣời sử dụng thao tác với Visual Basic bằng cách chọn các mục chọn đơn bằng chuột hoặc phím tắt trên thực đơn để thực hiện.
c) Thanh công cụ (Tool Bar) Thanh công cụ là thanh chứa các lệnh đƣợc thể hiện dƣới dạng biểu tƣợng giúp
9
ngƣời sử dụng có thể thi hành một lệnh nhanh hơn.
d) Hộp công cụ (ToolBox) Hộp công cụ là bảng chứa các điều khiển và ta thiết kế giao diện ngƣời sử dụng bằng cách chọn các điều khiển từ hộp công cụ và đƣa chúng vào các biểu mẫu
(Form).
Các biểu tƣợng trong hộp công cụ:
(Pointer - Con trỏ): Dùng để chọn các đối tƣợng sau khi đã tạo ra chúng ở trên
Form.
(Picture Box - Hộp hình ảnh): Dùng để hiển thị hình ảnh trên Form.
(Label - Nhãn): Dùng để hiện một xâu ký tự hay nhãn trên Form.
(TextBox - Hộp văn bản): Dùng để tạo một hộp văn bản sử dụng cho việc nhập
hay xuất thông tin trên Form khi chạy chƣơng trình.
(Frame - Khung): Dùng để tạo một đối tƣợng hình chữ nhật (khung chữ nhật)
chứa các đối tƣợng khác.
(CommandButton - Nút lệnh): Dùng để tạo ra một nút nhấn (nút lệnh) đáp ứng
sự kiện nhấn hoặc nhấn đúp trái chuột khi chạy chƣơng trình.
(CheckBox - Hộp kiểm): Dùng để tạo nút kiểm cho phép ngƣời sử dụng chƣơng trình chọn/bỏ chọn một lựa chọn nào đó khi chạy chƣơng trình. Ngƣời sử dụng có thể không chọn hoặc chọn nhiều tuỳ chọn cùng một lúc.
(Option Button - Nút lựa chọn): Giống nhƣ hộp kiểm (Check Box) nhƣng khi chạy chƣơng trình ngƣời sử dụng chỉ đƣợc chọn một trong các nút chọn (Option Button).
(ListBox - Hộp danh sách): Dùng để tạo một hộp liệt kê một danh sách gồm
nhiều mục và cho phép ngƣời sử dụng lựa chọn.
(ComboBox - Hộp danh sách xổ xuống): Đây là đối tƣợng điều khiển kết hợp giữa TextBox (hộp văn bản) và ListBox (hộp danh sách), dùng để tạo ra một hộp danh sách xổ xuống. Khi chạy chƣơng trình, ngƣời sử dụng có thể chọn một mục nào đó trong danh sách có sẵn hoặc có thể nhập nội dung bất kỳ vào.
(Horizontal ScrollBar - Thanh cuốn ngang): Dùng để tạo ra một thanh cuốn ngang cho chúng ta chọn một số nguyên khi di chuyển con chạy từ giá trị min đến giá trị max.
(Vertical ScrollBar - Thanh cuốn dọc): Dùng để tạo ra một thanh cuốn dọc cho
10
chúng ta chọn một số nguyên khi di chuyển con chạy từ giá trị min đến giá trị max.
(Timer - Đồng hồ): Dùng để tạo thời gian.
(Drive ListBox - Hộp danh sách ổ đĩa): Là một ComboBox trong đó liệt kê tên các ổ đĩa có trong hệ thống. Khi chạy chƣơng trình, ngƣời sử dụng có thể chọn một ổ đĩa nào đó.
(Directory ListBox - Hộp danh sách thƣ mục): Là hộp danh sách các thƣ mục của ổ đĩa hiện hành. Khi chạy chƣơng trình, ngƣời sử dụng có thể chọn một thƣ mục nào đó.
(File ListBox - Hộp danh sách tệp): Là một hộp danh sách liệt kê các tệp trong thƣ mục hiện hành. Khi chạy chƣơng trình, ngƣời sử dụng có thể chọn một tệp nào đó.
(Shape- Hộp hình): Dùng để vẽ các hình cơ bản nhƣ hình chữ nhật, hình vuông,
hình ellipse, hình tròn … lên Form.
(Line - Đƣờng): Dùng để kẻ một đoạn thẳng trên Form.
(Image - Hộp hình ảnh): Dùng để hiển thị hình ảnh bitmap trên Form.
(Data - Dữ liệu): Dùng để tạo khung dữ liệu.
(OLE - Object Linking and Embeding): Dùng để tạo khung kết nối và nhúng
các đối tƣợng. Một số điều khiển có sẵn trong Visual Basic 6.0 và không thể gỡ bỏ khỏi hộp công cụ. Đây là các điều khiển nội tại. Một số điều khiển nằm bên ngoài Visual Basic 6.0 và chứa trong các tệp tin có phần mở rộng là.ocx, muốn thêm các điều khiển này vào hộp công cụ trên thanh thực đơn ta chọn Project/Components (Ctrl+T), sau đó đánh dấu kiểm vào hộp kiểm bên trái tên điều khiển trong một danh sách điều khiển và nhấn nút OK, khi đó điều khiển sẽ đƣợc đƣa vào hộp công cụ và ta có thể sử dụng nó nhƣ các điều khiển nội tại khác. e) Cửa sổ dự án (Project)
Cửa sổ Project quản lý toàn bộ chƣơng trình (project) đang thiết kế. Trong cửa sổ này sẽ liệt kê tên project
và tất cả các form, các module đang viết trong project.
Hình 1.8. Cửa sổ Project Explorer
Để xem các đối tƣợng trên một form hoặc một module nào đó, ta nhấp trái chuột
11
vào thẻ (tab) có tên View Object ( ).
Để xem cửa sổ viết mã lệnh của form hoặc module nào đó ta có thể chọn thẻ (tab)
có tên View Code ( ).
f) Cửa sổ thuộc tính (Properties)
Cửa sổ thuộc tính cung cấp một số thuộc tính của đối tƣợng hiện hành.
Hình 1.9. Cửa sổ thuộc tính (Properties)
Để truy xuất thuộc tính của đối tƣợng ta thực hiện nhƣ sau:
<đối tƣợng> .
g) Cửa sổ Form Layout
Cửa sổ Form Layout giúp chúng ta sắp xếp vị trí
Form khi chạy chƣơng trình. Khi bắt đầu chạy
chƣơng trình thì Form sẽ nằm ở góc trên bên trái,
thay vì dùng chuột để kéo Form đến vị trí tuỳ ý ta sử
dụng cửa sổ Form Layout.
Hình 1.10. Cửa sổ Form Layout Ta đƣa chuột vào Form trong màn hình Form Layout, lúc đó con trỏ có hình mũi tên 4 hƣớng. Ta giữ phím trái chuột và rê Form đến vị trí mong muốn và nhả chuột ra. Khi chạy chƣơng trình Form sẽ nằm đúng vị trí mong muốn.
1.6. Các thao tác cơ bản với các đối tƣợng trên Form
1.6.1. Đưa một đối tượng lên Form
12
Có hai cách đƣa đƣa các đối tƣợng vào Form nhƣ sau:
Cách 1: Đƣa trỏ chuột vào đối tƣợng cần đƣa vào Form, nhấp đúp phím trái chuột,
lúc này đối tƣợng sẽ xuất hiện ở giữa Form. Nếu ta chọn nhiều đối tƣợng thì các đối
tƣợng này sẽ nằm chồng lên nhau, ta nhấp nút trái chuột vào từng đối tƣợng, giữa và
rê đối tƣợng đến vị trí mong muốn, sau đó nhả chuột ra.
Cách 2: Nhấn trái chuột vào đối tƣợng trong hộp ToolBox, sau đó đƣa con trỏ chuột
vào trong Form, lúc này con trỏ chuột có hình dấu cộng (+), ta di chuyển dấu cộng
đến vị trí mong muốn, sau đó nhấn trái chuột và rê chuột để vẽ đối tƣợng theo kích
thƣớc mong muốn và nhả chuột ra.
1.6.2. Chọn một đối tượng
Để làm việc với các đối tƣợng trên Form, ta cần chọn chúng. Để chọn đối tƣợng
ta sử dụng một trong các cách sau:
Cách 1. Kích chuột vào đối tƣợng cần chọn.
Cách 2. Giữ phím Ctrl/Shift và kích vào các đối tƣợng cần chọn.
Cách 3. Kích chuột vào vị trí trống trên Form giữ trái chuột và kéo rê xuống góc
dƣới phải để tạo thành hình chữ nhật cắt qua các đối tƣợng. Các đối tƣợng bị hình
chữ nhật cắt qua sẽ đƣợc chọn.
1.6.3. Di chuyển đối tượng
Di chuyển các đối tƣợng trên Form dùng để sắp xếp vị trí cho các đối tƣợng đó.
Để di chuyển các đối tƣợng ta có thể sử dụng các cách sau:
Cách 1. Giữ phím Ctrl và dùng các phím mũi tên trên bàn phím.
Cách 2. Kích nút trái chuột vào đối tƣợng, giữa và rê đối tƣợng đến vị trí mong
muốn, sau đó nhả chuột ra.
Cách 3. Gán giá trị cho thuộc tính Left và Top của đối tƣợng.
1.6.4. Hiệu chỉnh kích thước đối tượng
Muốn thay đổi kích thƣớc của đối tƣợng ta sử dụng các cách sau:
Cách 1. Kích trái chuột để chọn đối tƣợng này, sẽ xuất hiện 8 nút vuông nhỏ bao
quanh đối tƣợng, ta trỏ chuột vào các nút nhỏ này cho đến khi con trỏ chuột biến
thành hình mũi tên thì ta có thể kéo ra (tăng kích thƣớc) hoặc thu lại (giảm kích
thƣớc) của đối tƣợng.
Cách 2. Giữ phím Shift và dùng các phím mũi tên trên bàn phím.
13
Cách 3. Gán giá trị cho thuộc tính Height và Width của đối tƣợng.
1.6.5. Xoá đối tượng
Khi muốn loại bỏ một đối tƣợng khỏi Form, ta chọn đối tƣợng sau đó nhấn phím Del hoặc kích phải chuột vào đối tƣợng để hiển thị một menu dọc, sau đó chọn
Cut/Delete trên đó.
1.6.6. Khoá đối tượng
Một khi đã sắp đặt kích thƣớc và vị trí của các đối tƣợng trên form hợp lý rồi, rất dễ ta tình cờ thay đổi các đặc tính ấy vì vô ý click lên một đối tƣợng. Do đó Visual
Basic 6.0 cho ta khoá các đối tƣợng trên form bằng cách chọn Format | Lock
Controls từ menu hệ thống để khóa chúng lại. Sau khi khóa, cái hình ổ khóa trên
menu bị chìm xuống.
Hình 1.11. Lệnh Lock Control trên lệnh đơn Format
Nếu sau này nếu muốn thay đổi kích thƣớc hoặc vị trí của chúng thì nhớ dùng
Menu command Format | Lock Controls lại. Sau khi mở khóa, cái hình ổ khóa trên
menu hiện ra bình thƣờng.
1.6.7. Focus và thứ tự Tab của các điều khiển
a) Focus Focus là khả năng nhận đầu vào của ngƣời sử dụng thông qua chuột hoặc bàn phím. Khi một đối tƣợng có Forcus nó có thể nhận đầu vào từ ngƣời sử dụng. Sự kiện GotFocus và LostFocus xảy ra khi một đối tƣợng nhận hoặc mất focus. Chúng ta thƣờng sử dụng sự kiện GotFocus và LostFocus để kiểm tra tính hợp lệ của dữ liệu nhập.
b) Thứ tự Tab Thứ tự Tab là thứ tự mà ngƣời sử dụng di chuyển từ điều khiển này sang điều
khiển khác lúc thực thi chƣơng trình bằng cách nhấn phím Tab. Để thay đổi thứ tự
Tab cho một điều khiển ta thiết lập thuộc tính TabIndex. Thiết lập thuộc tính
14
TabIndex phù hợp giúp cho ngƣời sử dụng chƣơng trình đƣợc thuận tiện hơn.
1.7. Làm việc với Project
1.7.1. Thành phần của một Project
Một Project gồm có:
- Một tệp tin .vbp theo dõi toàn bộ các thành phần - Một tệp tin .frm cho mỗi biểu mẫu - Một tệp tin nhị phân .frx cho mỗi biểu mẫu. Đây là tệp tin đƣợc phát sinh tự
động, ngƣời sử dụng không đƣợc sửa đổi nội dung tệp tin này.
- Một tệp tin .cls cho mỗi mô-đun lớp (tuỳ chọn) - Một tệp tin .bas cho mỗi mô-đun chuẩn (tuỳ chọn) - Một hoặc nhiều tệp tin .ocx chứa các điều khiển ActiveX (tuỳ chọn)
1.7.2. Thêm một Form mới vào Project
Để thêm một Form vào Project hiện hành lúc thiết kế, ta sử dụng các cách sau:
Cách 1: Từ menu Project chọn Add Form => Xuất hiện hộp thoại Add Form.
Cách 2: Kích chuột phải vào cửa sổ Project Explorer. Trong menu ngữ cảnh chọn
Add sau đó chọn Form => Xuất hiện hộp thoại Add Form.
Hình 1.12. Hộp thoại Add Form
Trong hộp thoại Add Form:
- Nếu muốn thêm Form mới, chọn tab New sau đó chọn một Form trong danh sách
và kích nút Open.
- Nếu muốn dùng một Form có sẵn, chọn Tab Existing, chọn một Form trong danh
15
sách, kích nút Open.
1.7.3. Xoá Form khỏi Project
Để xoá một Form khỏi Project hiện hành, ta chọn Form cần xoá trong cửa sổ Project Explorer, sau đó từ menu Project chọn Remove hoặc trong cửa sổ Project Explorer kích phải chuột vào Form cần xoá, chọn Remove. Tham chiếu tệp tin bị xoá trong đề án (thực chất nó vẫn đƣợc lƣu trên đĩa). Khi một tệp tin trong đề án bị xoá Visual Basic sẽ cập nhật những thay đổi này trong tệp tin *.vbp khi ta lƣu đề án. Do đó nếu ta xoá tệp tin bên ngoài Visual Basic, tệp tin đề án sẽ không đƣợc cập nhật, khi ta mở lại đề án Visual Basic sẽ báo lỗi là thiếu tệp tin.
1.7.4. Ghi Project lên đĩa
Khi lƣu Project từng tệp tin trong Project nhƣ: form, module,… sẽ đƣợc lƣu trƣớc
kế tiếp là tệp tin Project. Trong lần lƣu Project đầu tiên, Visual Basic 6.0 đề nghị tên
cho từng tệp tin, thƣờng nó lấy tên biểu mẫu và có phần mở rrộng tuỳ thuộc vào loại
tệp tin.
- Từ menu File chọn Save Project
- Nếu đây là lần đầu lƣu Project hoặc ta vừa thêm một biểu mẫu hoặc module, hộp
thoại Save File As xuất hiện lần lƣợt cho từng tệp tin, sau đó đến hộp thoại Save
Project As xuất hiện, ta nhập tên tệp tin sau đó kích nút Save.
1.7.5. Nạp Project từ đĩa - Mở Project lúc khởi động Visual Basic 6.0: Lần đầu khởi động Visual Basic 6.0,
hộp thoại New project xuất hiện:
16
Hình 1.13. Hộp thoại tạo một Project mới (New Project)
Từ hộp thoại New Project, chọn tab Existing, chuyển đến thƣ mục chứa Project
cần mở, chọn tên Project và nhấn nút OK. Nếu Project cần mở là đề án lƣu gần nhất, ta có thể chuyển sang tab Recent thay vì tab Existing và làm tƣơng tự.
- Để mở Project có sẵn trong khi đang làm việc với Visual Basic 6.0: Từ menu File,
ta chọn Open Project, hộp thoại Open Project xuất hiện, chọn tab Existing, chuyển
đến thƣ mục chứa Project, chọn tên Project và nhấn nút OK.
Hình 1.14. Hộp thoại mở Project đã có (Open Project)
1.7.6. Tạo Project mới
Mỗi lần khởi động Visual Basic 6.0, ta sẽ thấy hộp thoại New Project xuất hiện.
Từ đây, ta có thể chọn loại Project mà ta muốn tạo và nhấn nút Open. Khi ta đang làm việc trong IDE của Visual Basic 6.0, ta có thể tạo Project mới
bằng cách: Từ menu File chọn New Project. Hộp thoại New Project xuất hiện, ta
chọn loại Project cần tạo và nhấn nút OK.
1.7.7. Thiết lập form khởi động cho Project
Mỗi Project có thể có nhiều form, theo chế độ mặc định form xuất hiện đầu tiên trong Project là form khởi động (Startup Object), để thiết lập một form cụ thể nào đó là form khởi động khi chạy chƣơng trình, ta thực hiện các thao tác sau:
- Từ menu Project, chọn Project properties, hộp thoại Project properties xuất
hiện.
- Trên hộp thoại Project properties, chọn form khởi động tại danh sách xổ
17
xuống có nhãn là Startup Object. - Nhấn nút OK để kết thúc công việc.
Hình 1.15. Hộp thoại Project Properties
1.7.8. Tạo tập tin EXE
Sau khi thiết lập form khởi động cho Project, để chạy một chƣơng trình ta sử
dụng nút Start của Visual Basic hoặc nhấn phím F5. Tuy nhiên, khi chƣơng trình
hoàn tất, ta cần có tập tin thi hành, hay tập tin EXE. Thực hiện theo các bƣớc sau:
Bƣớc 1. Từ menu File, chọn Make EXE file...Hộp thoại Make Project xuất hiện yêu
cầu nhập tên tập tin. Gõ vào tên tập tin (giả sử Clipboard), Visual Basic sẽ tự động
thêm phần mở rộng .EXE và sinh ra tập tin thi hành tên là Clipboard.EXE.
18
Hình 1.16. Hộp thoại Make Project
Bƣớc 2. Nhấn vào nút Option để mở hộp thoại Project Properties và điền tên của
ứng dụng vào ô Title. Tên này sẽ hiển thị trong danh sách các ứng dụng khi chƣơng trình thi hành. Không nhất thiết phải đặt tên ứng dụng trùng tên với tên tập tin .EXE.
Giả sử ta đặt tên ứng dụng là: First Application.
Hình 1.17. Hộp thoại Project Properties
B3. Nếu muốn sửa đổi phiên bản của ứng dụng, ta sửa các giá trị trong các ô Major,
Minor và Revision. Đánh dấu kiểm vào Auto Increment thì Visual Basic sẽ tự động tăng số Revision mỗi lần tạo lại tập tin EXE cho project. Ngoài ra, ta có thể thêm
các ghi chú cho từng phiên bản trong phần Version Information. Những ghi chú này
bao gồm: tên cơ quan hay công ty, nhãn hiệu, thông tin bản quyền,...tƣơng ứng với
các thành phần trong danh sách.
Bƣớc 4. Nhấn OK để trở về hộp thoại Make Project.
Bƣớc 5. Nhấn nút OK trong hộp thoại Make Project để tạo tập tin EXE. Bƣớc 6. Chạy chƣơng trình từ cửa sổ My Computer hoặc Explorer, tìm đúng đƣờng dẫn đến tên tập tin và nhấn đúp chuột vào nó.
1.8. Câu hỏi trắc nghiệm
1) Chọn cách thực hiện đúng để thay đổi kích thƣớc của điều khiển trên form:
a. Thay đổi giá trị thuộc tính width, height. b. Kích chuột vào 8 ô điều khiển và kéo, thả.
c. Giữ phím Shift và dùng các phím mũi tên.
19
d. Cả 3 cách trên.
2) Chọn cách thực hiện đúng để di chuyển vị trí của điều khiển trên form:
a. Dùng các phím mũi tên. b. Giữ phím Ctrl và dùng các phím mũi tên.
c. Giữ phím Shift và dùng các phím mũi tên.
d. Kích đúp chuột vào đối tƣợng.
3) Chọn cách thực hiện đúng để chọn một điều khiển trên form:
a. Kích chuột vào đối tƣợng cần chọn.
b. Giữ phím Ctrl và kích vào các đối tƣợng cần chọn.
c. Giữ phím Shift và kích vào các đối tƣợng cần chọn.
d. Cả 3 cách trên.
4) Chọn cách thực hiện đúng để đặt một điều khiển lên form:
a. Kích đúp chuột vào điều khiển.
b. Kích chuột vào điều khiển và kéo chuột trên form.
c. Kích chuột vào điều khiển cùng loại trên form-> copy-> paste.
20
d. Cả 3 cách trên.
CHƢƠNG 2
CƠ SỞ LẬP TRÌNH TRONG VISUAL BASIC 6.0
2.1. Thuộc tính, phƣơng thức và sự kiện
Visual Basic 6.0 hỗ trợ phƣơng pháp lập trình hƣớng đối tƣợng (Object- Oriented Programming). Với lập trình hƣớng đối tƣợng, lập trình viên sẽ chia nhỏ các vấn đề
cần giải quyết thành các đối tƣợng. Trong Visual Basic các điều khiển (control) là
các đối tƣợng. Từng đối tƣợng có những đặc điểm mà ta gọi là thuộc tính và những
chức năng riêng biệt mà ta gọi là phƣơng thức. Lập trình viên phải đƣa ra các thuộc
tính và phƣơng thức mà đối tƣợng cần thể hiện.
2.1.1. Đối tượng
Một đối tƣợng là một khái niệm chỉ một thực thể tồn tại trong thế giới thực mà ta
có thể nhận diện đƣợc nó, cũng nhƣ có thể phân biệt đƣợc nó với các đối tƣợng
khác. Mỗi đối tƣợng có những đặc điểm mà ta gọi là thuộc tính riêng của nó, dựa
vào các đặc điểm này ta có thể nhận diện, phân biệt đƣợc đối tƣợng với các đối
tƣợng khác. Ngoài các thuộc tính, mỗi đối tƣợng còn có các hành động, phản ứng
đặc trƣng cho mỗi loại và cho từng đối tƣợng cụ thể mà ta gọi là phƣơng thức hoặc
sự kiện. Ví dụ: Một chiếc ti vi là một đối tƣợng, nó có các thuộc tính: Nhãn hiệu,
kích thƣớc, màu sắc, trọng lƣợng, số kênh, …và các phƣơng thức: chuyển kênh, dò kênh, điều chỉnh màu sắc, …
Trong Visual Basic cung cấp rất nhiều đối tƣợng, trong đó các điều khiển
(control) cũng là các đối tƣợng, mỗi đối tƣợng có tập thuộc tính, phƣơng thức và sự
kiện riêng.
2.1.2. Thuộc tính
Thuộc tính là những đặc điểm của đối tƣợng, chúng mô tả đối tƣợng. Mặc dù mỗi đối tƣợng đều có một bộ thuộc tính khác nhau, nhƣng trong đó, vẫn có những thuộc tính thông dụng cho hầu hết các đối tƣợng. Chẳng hạn, thuộc tính xác định tên gọi, kích thƣớc, vị trí, màu sắc,... Sau đây là một số thuộc tính thông dụng
Thuộc tính Giải thích
Left Vị trí cạnh trái của điều khiển so với vật chứa nó
Top Vị trí cạnh trên của điều khiển so với vật chứa nó
Height Chiều cao của điều khiển
21
Width Chiều rộng của điều khiển
Name Nhận một giá trị chuỗi (tên gọi) đƣợc dùng để nói đến điều khiển
Enable Nhận giá trị logic (True hoặc False) quyết định ngƣời sử dụng có
đƣợc làm việc với điều khiển hay không
Visible Nhận giá trị logic (True hoặc False) quyết định ngƣời sử dụng có
thấy điều khiển hay không
2.1.3. Phương thức
Là đoạn chƣơng trình chứa trong đối tƣợng, cho đối tƣợng biết cách thức thực
hiện một công việc nào đó. Mỗi đối tƣợng có những phƣơng thức riêng biệt, nhƣng
cũng có những phƣơng thức rất thông dụng đối với hầu hết các đối tƣợng, chẳng
hạn:
Giải thích Phƣơng thức
Thay đổi vị trí một đối tƣợng theo yêu cầu của chƣơng trình Move
Thi hành hoạt động kéo và thả của ngƣời sử dụng Drag
SetFocus Cung cấp tầm ngắm cho đối tƣợng đƣợc chỉ ra trong lệnh gọi
phƣơng thức
ZOrder Quy định thứ tự xuất hiện của các điều khiển trên màn hình
2.1.4. Sự kiện
Nếu thuộc tính mô tả đối tƣợng, phƣơng thức chỉ ra cách thức đối tƣợng hành
động thì sự kiện là những phản ứng của đối tƣợng. Ví dụ, khi ngƣời sử dụng kích
nút trái chuột vào một nút lệnh, thì các sự kiện: MouseDown, MouseUp, Click và
SetFocus sẽ xảy ra. Tƣơng tự thuộc tính và phƣơng thức, mỗi đối tƣợng có những bộ
sự kiện khác nhau, nhƣng một số sự kiện sau là thông dụng với rất nhiều đối tƣợng,
đặc biệt là các điều khiển.
Sự kiện Xảy ra khi
Change Ngƣời sử dụng sửa đổi chuỗi ký tự trong hộp kết hợp hoặc hộp
văn bản
Click Ngƣời sử dụng dùng nút chuột để nhấn lên đối tƣợng
Dblclick
Ngƣời sử dụng dùng nút chuột để nhấn 2 lần (nhấn đúp) lên đối tƣợng
DragDrop Ngƣời sử dụng kéo rê một đối tƣợng sang nơi khác
DragOver Ngƣời sử dụng kéo rê một đối tƣợng ngang qua một điều khiển
khác
GotFocus Đƣa một đối tƣợng vào tầm ngắm của ngƣời sử dụng (focus)
KeyDown Ngƣời sử dụng nhấn một nút trên bàn phím trong khi một đối
22
tƣợng đang trong tầm ngắm
KeyPress Ngƣời sử dụng nhấn và thả một nút trên bàn phím trong khi một
đối tƣợng đang trong tầm ngắm
KeyUp
Ngƣời sử dụng thả một nút trên bàn phím trong khi một đối tƣợng đang trong tầm ngắm
LostFocus Đƣa một đối tƣợng ra khỏi tầm ngắm
MouseDown
Ngƣời sử dụng nhấn một nút chuột bất kỳ trong khi con trỏ chuột đang nằm trên một đối tƣợng
MouseMove Ngƣời sử dụng di chuyển con trỏ chuột ngang qua một đối tƣợng
MouseUp Ngƣời sử dụng thả nút chuột trong khi con trỏ chuột đang nằm
trên một đối tƣợng
2.2. Giới thiệu một số điều khiển thông dụng
2.2.1. Điều khiển Label
Điều khiển Label có biểu tƣợng trong hộp công cụ là , mục đích của Label là
hiển thị một đoạn văn bản lên Form. Một số thuộc tính của điều kiển Label:
Thuộc tính Giải thích
Name Dùng để đặt tên cho điều khiển Label
Alignment Dùng để canh chỉnh nội dung văn bản hiển thị trên Label:
0 : Canh trái
1 : Canh phải
2 : Canh giữa
Autosize Nếu nhận giá trị True sẽ tự động điều chỉnh kích thƣớc cho vừa
nội dung, nếu nhận giá trị False thì không tự điều chỉnh kích
thƣớc
BackColor Xác lập màu nền của Label
Caption Xác định nội dung văn bản hiển thị trên Label
Font Xác định kiểu chữ của phần văn bản hiển thị trên Label
ForeColor Xác định màu của chữ hiển thị trên Label
2.2.2. Điều khiển TextBox
. Điều khiển TextBox Điều khiển Textbox có biểu tƣợng trong hộp công cụ là đƣợc sử dụng để nhập một đoạn văn bản, hoặc để hiển thị một đoạn văn bản. Một số
thuộc tính của TextBox:
Thuộc tính Giải thích
23
Name Dùng để đặt tên cho điều khiển TextBox
Alignment Dùng để canh chỉnh nội dung văn bản hiển thị trên TextBox:
0 : Canh trái
1 : Canh phải 2 : Canh giữa
Appearance Quy định cách thể hiện của TextBox:
0 – Flat : phẳng
1 – 3D : nổi
BackColor Xác định màu nền của TextBox
Font Quy định kiểu chữ của văn bản hiển thị trên TextBox
ForeColor Quy định màu của phần văn bản hiển thị trên TextBox
MaxLength Quy định số ký tự tối đa có thể nhập vào TextBox
MultiLine Nếu nhận giá trị True văn bản trên Textbox có thể hiển thị trên
nhiều hàng, nếu nhận giá trị False văn bản chỉ hiện thị trên một
hàng.
ScrollBars Xác định TextBox có hay không có các thanh cuốn
SelLength Trả về độ dài đoạn văn bản đƣợc chọn (đƣợc bôi đen) trong
Textbox
SelStart Trả về vị trí của ký tự đầu tiên trong đoạn văn bản đƣợc chọn
trong Textbox
SelText Trả về đoạn văn bản đƣợc chọn trong Textbox
Text Xác định nội dung văn bản hiển thị trên TextBox
Visible
Quy định điều khiển TextBox có đƣợc nhìn thấy hay không. True: Nhìn thấy
False: Không nhìn thấy
Một số Sự kiện của điều khiển TextBox.
Sự kiện KeyPress Sự kiện này phát sinh khi ngƣời sử dụng gõ vào TextBox. Chúng ta có thể dùng
sự kiện KeyPress để điều khiển dữ liệu nhập vào trong TextBox. Thủ tục xử lý sự kiện KeyPress dùng một tham số là KeyAscii , tham số này là một số nguyên tƣợng trƣng cho một mã số ASCII của ký tự đƣợc đánh vào. Ví dụ: Chúng ta muốn ngƣời sử dụng chỉ đƣợc nhập số vào trong TextBox, khi đó chúng ta sử dụng phƣơng pháp nhƣ sau: nếu ký tự nhập vào không thuộc phạm vi số
thì gán tham số KeyAscii là 0.
24
Private Sub Text1_KeyPress (KeyAscii As Integer) If KeyAscii < Asc(“0”) Or KeyAscii > Asc(“9”) then KeyAscii = 0 „ huỷ bỏ phím được nhập vào Beep „ phát âm thanh beep báo lỗi
End If
End Sub
Sự kiện KeyDown, KeyUp Mỗi sự kiện KeyPress lại cho ta một cặp sự kiện KeyDown/KeyUp. Sự kiện
KeyDown/KeyUp có 2 tham số là KeyCode và Shift. Sự kiện này cho phép ta nhận
biết đƣợc các phím đặc biệt trên bàn phím. Trong ví dụ dƣới đây, ta hiển thị tên các phím chức năng mà ngƣời sử dụng chƣơng trình nhấn vào:
Private Sub Text3_KeyDown(KeyCode As Integer, Shift As Integer)
If (KeyCode >= 112) And (KeyCode <= 123) Then
MsgBox "Ban vua nhan phim chuc nang: F" & _ Trim(Str(KeyCode - 111))
EndIf
End Sub
2.2.3. Điều khiển CommandButton
Điều khiển CommandButton có biểu tƣợng trong hộp công cụ là . CommandButton là một nút lệnh mà ta có thể nhấn (click) vào nó, khi đó nó sẽ thực
hiện một hành động nào đó. Một số thuộc tính thông dụng của CommandButton:
Thuộc tính Giải thích
Name Dùng để đặt tên cho điều khiển CommandButton
Caption Xác định tiêu đề của nút lệnh
Font Quy định kiểu chữ của tiêu đề hiển thị trên nút lệnh
Visible Quy định nút lệnh có đƣợc hiển thị trên Form hay không, nếu
nhận giá trị True: nút lệnh đƣợc nhìn thấy, nhận giá trị False: ẩn
nút đi.
Chú ý: Trƣớc một ký tự nào đó của tiêu đề nếu chúng ta đặt dấu “&” thì khi thực thi
chƣơng trình ngƣời sử dụng chỉ cần nhấn tổ hợp phím Alt + ký tự, máy tính sẽ thực hiện sự kiện nhấn nút lệnh này.
2.2.4. Form (biểu mẫu)
Chƣơng trình ứng dụng giao tiếp với ngƣời dùng thông qua các biểu mẫu
(hay còn gọi là cửa sổ, xuất phát từ chữ Form hay Windows); các điều khiển
(Control) đƣợc đặt lên bên trên giúp cho biểu mẫu thực hiện đƣợc công việc đó. Một
biểu mẫu là một cửa số đƣợc lập trình nhằm hiển thị dữ liệu và nhận thông tin từ
25
phía ngƣời dùng.
Thuộc tính Ngoài các thuộc tính thông dụng của một điều khiển, form còn có một số thuộc tính khác cần quan tâm nhƣ:
Thuộc tính Giải thích
Caption Nhận một giá trị chuỗi và sẽ đƣợc hiển thị trên thanh tiêu đề của
biểu mẫu.
Icon
Nhận một file ảnh dạng .ico hoặc .cur đƣợc dùng làm biểu tƣợng trong thanh tiêu đề của biểu mẫu, nhất là khi biểu mẫu thu nhỏ lại
WindowState Xác định biểu mẫu sẽ có kích thƣớc bình thƣờng (Normal=0), hay
Minimized (=1), Maximized (=2).
Font
Xác lập Font cho biểu mẫu. Thuộc tính này sẽ đƣợc các điều khiển nằm trên nó thừa kế. Tức là khi ta đặt một điều khiển lên
biểu mẫu, thuộc tính Font của điều khiển ấy sẽ tự động trở nên
giống y của biểu mẫu.
BorderStyle Xác định dạng của biểu mẫu, nó có thể nhận một trong sáu giá trị
từ 0 đến 5
Sáu giá trị của thuộc tính BorderStyle:
Giá trị Hiệu ứng trên biểu mẫu
0 – None Không có cạnh viền, không thanh tiêu đề, không di chuyển
đƣợc. Giá trị này thƣờng đƣợc dùng cho cửa sổ khởi động
chƣơng trình
1 – Fixed Single Không thể co giãn cửa sổ bằng cách kéo rê cạnh viền, nhƣng có
thể dùng nút phóng to hoặc thu nhỏ. Giá trị này đƣợc dùng cho
những cửa sổ có kích cỡ cố định nhƣng vẫn xuất hiện trên thanh
Taskbar
2 – Sizable Có thể co giãn cửa sổ bằng cách kéo rê cạnh viền và dùng nút
phóng to hoặc thu nhỏ. Giá trị dùng cho những cửa sổ thông dụng
3 – Fixed Dialog
Không thể co giãn và không có thể dùng nút phóng to hoặc thu nhỏ. Giá trị này dùng cho các cửa sổ đơn giản nhƣ mật khẩu
4 - Fixed Tool Window Tƣơng tự Fixed Dialog nhƣng thanh tiêu đề ngắn hơn. Font trên thanh tiêu đề và nút Close cũng nhỏ hơn. Giá trị này dùng cho
các thanh công cụ di động.
5 – Sizable Tool Window
26
Tƣơng tự nhƣ Fixed Tool Window nhƣng có thể co giãn đƣợc. Giá trị này dùng cho những cửa sổ Properties của Visual Basic
Phƣơng thức Ngoài các phƣơng thức thông dụng, biểu mẫu còn có phƣơng thức Move dùng để di chuyển biểu mẫu đến tọa độ X,Y:
Move X, Y
Sự kiện Ngoài các sự kiện thông dụng, biểu mẫu còn có một số sự kiện sau:
Form_Initialize: Sự kiện này xảy ra trƣớc nhất và chỉ một lần thôi khi ta tạo ra thể hiện đầu tiên của biểu mẫu. Ta dùng sự kiện Form_Initialize để
thực hiện những gì cần phải làm chung cho tất cả các thể hiện của biểu mẫu
này.
Form_Load: Sự kiện này xảy ra mỗi lần ta gọi thể hiện một biểu mẫu. Nếu ta chỉ dùng một thể hiện duy nhất của một biểu mẫu trong chƣơng trình thì
Form_Load coi nhƣ tƣơng đƣơng với Form_Initialize. Ta dùng sự kiện
Form_Load để khởi tạo các biến, điều khiển cho các thể hiện của biểu mẫu
này.
Form_Activate: Mỗi lần một biểu mẫu đƣợc kích hoạt (active) thì một sự kiện Activate phát sinh. Ta thƣờng dùng sự kiện này để cập nhật lại giá trị
các điều khiển trên biểu mẫu.
Form_QueryUnload: Khi ngƣời sử dụng chƣơng trình nhấp chuột vào nút X phía trên bên phải để đóng biểu mẫu thì một sự kiện QueryUnload đƣợc sinh ra.
2.2.5. MDI Form
Đôi khi ta muốn có một MDI form, tức là một form có thể chứa nhiều form con
bên trong. Dạng MDI form này thƣờng đƣợc dùng trong các ứng dụng nhƣ
Microsoft Word để có thể mở nhiều document cùng một lúc, mỗi document đƣợc hiển thị trong một form con. Để có một MDI Form ta cần phải bổ sung một MDI form vào Project, bằng cách dùng menu Project | Add MDI Form. Mỗi Project chỉ có thể có tối đa một MDI form. Muốn một form trở thành một form con ta thiết lập thuộc tính MDI Child của nó thành True. Lúc thực thi chƣơng trình, ta không thể ẩn
một MDI Child form, nhƣng có thể thu nhỏ nó. Nếu thật sự muốn ẩn nó thì ta thiết lập vị trí (top,left) cho nó một số âm lớn hơn kích thƣớc nó để nó nằm ngoài tầm hiển thị của form. Trong một chƣơng trình dùng MDI Form, khi ta click MDI Form nó luôn luôn nằm ở dƣới các form con.
27
Ví dụ: Viết chƣơng trình thực hiện việc: Copy, Cut và Paste văn bản sử dụng Clipboard.
cmdCopy cmdCut cmdPaste
Bƣớc 1. Tạo Project mới, đƣa 3 điều khiển nút lệnh (Commandbutton) và 1 hộp văn
bản (TextBox) lên Form1, điều chỉnh vị trí, kích thƣớc của các điều khiển cho phù
hợp.
Bƣớc 2. Thiết lập giá trị cho một số thuộc tính (Name, Caption) của các điều khiển
theo form mẫu.
Bƣớc 3. Mở cửa sổ soạn thảo chƣơng trình (Code) và gõ vào các dòng lệnh cho các
sự kiện tƣơng ứng của các điều khiển.
Private Sub cmdCopy_Click()
Clipboard.Clear
Clipboard.SetText txtVanBan.SelText
End Sub
„..................................................
Private Sub CmdCut_Click()
cmdCopy_Click
txtVanBan.SelText = ""
txtVanBan.SelText = Clipboard.GetText
End Sub „.................................................. Private Sub cmdPaste_Click() End Sub
Bƣớc 4. Chạy chƣơng trình (Nhấn phím F5).
2.3. Soạn thảo chƣơng trình
28
Trong Visual Basic IDE, cửa sổ mã lệnh (Code) cho phép soạn thảo chƣơng trình. Cửa sổ này có một số chức năng nổi bật:
o Đánh dấu (Bookmarks): Chức năng này cho phép đánh dấu các dòng lệnh của
chƣơng trình trong cửa sổ mã lệnh để dễ dàng xem lại về sau này. Để bật tắt khả năng này, chọn Bookmarks từ menu Edit, hoặc chọn từ thanh công cụ Edit.
o Các phím tắt trong cửa sổ mã lệnh:
Chức năng Phím tắt
Xem cửa sổ Code F7
Xem đối tƣợng
Xem cửa sổ Object Browser F2
Tìm kiếm CTRL+F
Thay thế CTRL+H
Tìm tiếp SHIFT+F4
Tìm ngƣợc SHIFT+F3
Chuyển đến thủ tục kế tiếp CTRL+DOWN ARROW
Chuyển đến thủ tục trƣớc đó CTRL+UP ARROW
Xem định nghĩa SHIFT+F2
Cuộn xuống một màn hình CTRL+PAGE DOWN
Cuộn lên một màn hình CTRL+PAGE UP
Nhảy về vị trí trƣớc đó CTRL+SHIFT+F2
Trở về đầu của mô-đun CTRL+HOME
Đến cuối mô-đun CTRL+END
Tự động kiểm tra cú pháp (Auto Syntax Check)
Nếu chức năng này không đƣợc bật thì khi ta viết một dòng mã có chứa lỗi,
Visual Basic chỉ hiển thị dòng chƣơng trình sai với màu đỏ nhƣng không kèm theo
chú thích gì và tất nhiên ta có thể viết tiếp các dòng lệnh khác. Còn khi chức năng
này đƣợc bật, Visual Basic sẽ cho ta biết một số thông tin về lỗi và hiển thị con trỏ ngay dòng chƣơng trình lỗi để chờ ta sửa.
Yêu cầu khai báo biến (Require Variable Declaration)
29
Visual Basic sẽ thông báo lỗi khi một biến đƣợc dùng mà không khai báo và sẽ chỉ ra vị trí của biến đó. Để sử dụng các tính năng tự động này, ta gọi hộp thoại Options từ menu hệ thông bằng cách chọn Tools/Options.
Hình 2.1. Hộp thoại Options
Gợi nhớ mã lệnh (Code):
Khả năng Auto List Members: Tự động hiển thị danh sách các thuộc tính và
phƣơng thức của 1 điều khiển hay một đối tƣợng khi ta gõ vào tên của chúng. Chọn
thuộc tính hay phƣơng thức cần thao tác và nhấn phím Tab hoặc Space để đƣa nó
vào chƣơng trình. Để sử dụng khả năng này, đánh dấu kiểm chọn Auto List
Members trong mục Code Settings trong hộp thoại Options.
2.4. Các kiểu dữ liệu
Một kiểu dữ liệu sẽ xác định tập giá trị mà một biến thuộc kiểu đó có thể nhận.
Trong Visual Basic 6.0 dùng kiểu dữ liệu Variant nhƣ kiểu dữ liệu mặc định. Khi
dùng kiểu Variant ta không phải chuyển đổi giữa các kiểu dữ liệu, Visual Basic 6.0
tự động làm việc đó. 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, đó là:
2.4.1. Kiểu số
Phạm vi Kiểu dữ liệu Kích thƣớc
Byte 1 byte 0 đến 255
Integer 2 byte -32768 đến 32767
Long 4 byte -2147483648 đến 2147483647
Single 4 byte
30
-3.402823 E38 đến -1.401298 E-45 1.401298 E-45 đến 3.402823 E38
Double 8 byte -1.79769313486231 E308 đến
-4.94065645841247 E-324
4.94065645841247 E-324 đến 1.79769313486232 E308
Currency 8 byte -922337203685477.5808 đến 922337203685477.5807
Decimal 14 byte Có thể lƣu số nguyên hay số thực
2.4.2. Kiểu ngày giờ (Date)
Kiểu Date có kích thƣớc 8 byte. Hằng giá trị kiểu Date phải đƣợc đặt trong hai
dấu thăng “#”.
Ví dụ: Ngay = #1/1/2006# Khi các kiểu dữ liệu khác đƣợc chuyển sang kiểu Date, giá trị đứng trƣớc dấu
chấm là ngày, giá trị đứng sau dấu chấm là giờ. Nửa đêm là 0, giữa ngày là 0.5. Dấu
âm thể hiện ngày trƣớc 30/12/1999.
2.4.3. Kiểu lô-gic (Boolean)
Kiểu dữ liệu Boolean có phạm vi là 2 giá trị True (đúng) và False (sai). Giá trị
mặc định của kiểu Boolean là False.
2.4.4. Kiểu đối tượng (Object)
Kiểu Object chứa một địa chỉ 4 byte trỏ đến đối tƣợng trong ứng dụng hiện hành
hoặc các ứng dụng khác. Dùng lệnh Set để chỉ ra đối tƣợng thực sự.
Ví dụ: Set objDb = OpenDatabase(“c:\VB6\Biblio.mdb”)
2.4.5. Kiểu tổng quát (Variant)
Đây là kiểu dữ liệu mặc định của Visual Basic 6.0. Kiểu Variant có thể chứa mọi loại dữ liệu. Giá trị mặc định của biến kiểu Variant là Empty. Empy là một giá trị đặc biệt không phải là 0, không phải xâu rỗng (“”), không phải giá trị Null. Khi một biến chứa giá trị Empty, ta có thể dùng nó trong biểu thức.
2.5. Biến
31
Biến dùng để chứa dữ liệu tạm thời cho tính toán, so sánh và các hoạt động khác. Ta dùng toán tử gán (=) để tính toán và chứa giá trị vào biến.
2.5.1. Khai báo biến
a) Khai báo biến bằng từ khoá Dim và As
Để khai báo biến thì chúng ta phải đặt tên biến và kiểu dữ liệu của biến.
Cú pháp khai báo biến bằng từ khoá Dim và As nhƣ sau:
Dim
Ví dụ:
Dim n As Integer „Khai báo biến có tên n và có kiểu số nguyên Dim
xau As String „Khai báo biến có tên xau và có kiểu String
b) Khai báo biến bằng tiếp vĩ ngữ
Khi khai báo biến thì chúng ta phải khai báo kiểu cho nó, ngôn ngữ Visual Basic
có dùng các tiếp vĩ ngữ nhƣ $, &, #, @, !, … để cho biết biến đó có kiểu gì. Bảng
tiếp vĩ ngữ:
Tiếp vĩ ngữ Kiểu dữ liệu
$ String
& Long
% Integer
! Single
# Double
@ Currency
Ví dụ:
Dim x!, n%, i%, s$
Dòng khai báo trên tƣơng đƣơng với dòng khai báo sau:
Dim x As Single, n As Integer, i As Integer, s As String
Chúng ta có thể không cần định nghĩa kiểu dữ liệu của biến khi khai báo, lúc đó biến
này sẽ đƣợc gán kiểu Variant.
Ví dụ:
Dim x,y,z As Integer
Biến x và biến y sẽ có kiểu Variant, biến z có kiểu Integer.
2.5.2. Phạm vi sử dụng của biến
Biến có thể đƣợc khai báo bên trong một thủ tục (Sub) hoặc hàm (Function), biến
32
này đƣợc gọi là biến cấp độ thủ tục.
Biến cũng có thể đƣợc khai báo ở phần đầu của mỗi module, trong phần khai báo
General, biến này đƣợc gọi là biến cấp độ mô-đun.
Biến cấp độ mô-đun
Biến cấp độ thủ tục Biến cấp độ mô-đun
Hình 2.2. Các vị trí khai báo biến trong cửa sổ lệnh (Code)
Nếu biến đƣợc khai báo trong thủ tục hoặc hàm thì biến đó chỉ có thể sử dụng
trong thủ tục hoặc hàm đó.
Nếu biến đƣợc khai báo ở cấp độ mô-đun thì biến đó có thể đƣợc sử dụng trong
tất cả các thủ tục hoặc hàm trong mô-đun đó. Nhƣng với các thủ tục hoặc hàm trong
cùng một dự án (Project) mà khác mô-đun thì biến đó không có tác dụng. Để cho
biến khai báo trong phần khai báo chung của mô-đun có thể sử dụng đƣợc trong toàn
bộ Project thì khi khai báo biến đó, chúng ta phải thay thế từ khoá Dim bằng từ khoá
Public.
Ví dụ: Public HoTen As String
Từ khoá Public Chúng ta có thể dùng từ khoá Public để khai báo một biến Public cấp độ mô-đun.
Cú pháp:
Public
Public này.
Từ khoá Private Chúng ta có thể dùng từ khoá Private để khai báo biến Private cấp độ mô-đun.
33
Cú pháp:
Private
Biến Private chỉ đƣợc dùng trong các thủ tục hoặc hàm trong cùng một mô-đun. Trong cấp độ mô-đun, từ khoá Dim tƣơng đƣơng với từ khoá Private.
Từ khoá Option Explicit Ngôn ngữ Visual Basic cho phép có thể không cần khai báo biến trƣớc khi sử
dụng. Tuy nhiên để chƣơng trình đƣợc rõ ràng và tránh lỗi, chúng ta nên khai báo biến trƣớc khi sử dụng. Để bắt buộc ngƣời lập trình phải khai báo biến trƣớc khi sử
dụng, chúng ta dùng từ khoá Option Explicit trong phần khai báo của mô-đun.
Hình 2.3. Khai báo Option Explicit trong cửa sổ lệnh
Từ khoá Static Chúng ta đã biết rằng biến đƣợc khai báo ở cấp độ thủ tục thì chỉ có phạm vi hoạt
động ở trong thủ tục hoặc hàm nơi nó đƣợc khai báo, sau mỗi lần gọi thủ tục hoặc
hàm, khi thoát khỏi thủ tục hoặc hàm thì biến sẽ không còn giá trị. Muốn duy trì giá
trị của biến sau mỗi lần gọi thủ tục hoặc hàm, thì chúng ta phải sử dụng khai báo
Static.
Cú pháp:
Static
Ví dụ: Viết một hàm lƣu giá trị tổng nhƣ sau:
Function LuuTong (n) Static S
S = S + n
LuuTong = S
End Function
Với đoạn chƣơng trình trên, sau mỗi lần gọi hàm LuuTong, biến S vẫn giữ lại giá trị của nó. Nếu ta viết:
S = S + n T = Abs(S) LuuTong = S
34
Static Function LuuTong (n) Dim S End Function
Khi đó tất cả các biến đƣợc khai báo trong hàm LuuTong đều là Static,dù cho
chúng đƣợc khai báo là Private, là Dim hay thậm chí là khai báo ngầm. Khai báo ngầm là không cần khai báo tƣờng minh trƣớc khi sử dụng biến. Trong ví dụ trên
biến T là biến đƣợc khai báo ngầm.
2.6. Hằng
Hằng dùng để chứa 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àm làm cho chƣơng trình sáng sủa dễ đọc nhờ
những tên gợi nhớ thay vì các con số. Cú pháp khai báo hằng nhƣ sau:
[ Public | Private ] Const
Ví dụ: Const PI = 3.141593
Const NgaySinh As Date = #4/4/2002#
Có thể khai báo nhiều hằng trên cùng một hàng, phân cách nhau bằng dấu phẩu.
Cũng có thể dùng từ khoá Public để khai báo một hằng Public. Một hằng Public có
thể đƣợc dùng trong mọi thủ tục hoặc hàm của dự án (project). Nếu một hằng Public
đƣợc khai báo trong một Standard Module hay Class Module thì nó sẽ có tác dụng
trong mọi project mà có tham khảo đến project chứa hằng Public này.
Chúng ta có thể dùng từ khoá Private để khai báo một hằng Private. Hằng Private
chỉ đƣợc dùng trong các thủ tục hoặc hàm trong cùng một mô-đun.
2.7. Toán tử
2.7.1. Các phép toán số học
Phép đổi dấu -
Phép cộng +
Phép trừ hai toán hạng –
Phép nhân *
Phép chia /
Phép chia lấy phần nguyên \
Phép lấy số dƣ của phép chia 2 số nguyên “Mod”
Phép tính luỹ thừa ^
Thứ tự ƣu tiên của các phép toán:
Phép tính luỹ thừa
Phép đổi dấu
Phép nhân và phép chia
35
Phép chia lấy phần nguyên
Phép lấy số dƣ
Phép cộng và phép trừ
2.7.2. Các phép toán quan hệ (hay phép so sánh)
Ký hiệu Ý nghĩa
= So sánh bằng nhau
< So sánh nhỏ hơn
<= So sánh nhỏ hơn hoặc bằng
< > So sánh khác nhau
> So sánh lớn hơn
>= So sánh lớn hơn hoặc bằng
2.7.3. Các phép toán logic
Phép “phủ định” Not:
A Not A
True False
False True
Phép “và” And, phép “hoặc” Or:
A B A and B A or B
True True True True
True False False True
False True False True
False False False False
2.8. Một số hàm chuẩn
2.8.1. Hàm đại số
(1) Hàm Abs (x): Hàm trả về giá trị tuyệt đối của x. (2) Hàm Sin(x): Hàm tính giá trị sin x của góc x đo bằng Radian. (3) Hàm Cos(x): Hàm tính giá trị cos x của góc x đo bằng Radian. (4) Hàm Tan(x): Hàm tính giá trị tg x của góc x đo bằng Radian. (5) Hàm Atn(x): Hàm tính giá trị arctg x của x. (6) Hàm Int(x): Hàm trả về phần nguyên của x. Nếu x là số âm thì sẽ trả về phần
nguyên có giá trị nhỏ hơn phần nguyên 1 đơn vị.
Int(-1.2) sẽ cho kết quả là -2
36
Ví dụ: (7) Hàm Fix(x): Hàm trả về phần nguyên của x.
Ví dụ: Fix(-1.2) cho kết quả là -1 (8) Hàm Sgn(x): Hàm trả về một số nguyên:
- Nếu x > 0 thì trả về giá trị là 1
- Nếu x = 0 thì trả về giá trị là 0
- Nếu x < 0 thì trả về giá trị là -1
(9) Hàm Sqr(x): Hàm tính căn bậc hai của x.
(10) Hàm Exp(x): Hàm tính e mũ x.
(11) Hàm Log(x): Hàm tính logarit tự nhiên của x.
(12) Hàm Round(x [, n]): Hàm làm tròn x với n chữ số sau dấu chấm thập phân.
Ví dụ: Round(1.234 , 2) sẽ cho kết quả là 1.23
Round(1.236 , 2) sẽ cho kết quả là 1.24
(13) Hàm Rnd( [ x ] ): Hàm tạo số ngẫu nhiên.
2.8.2. Hàm thời gian
(1) Hàm Day(d): Hàm trả về số ghi ngày của d.
Ví dụ: Day(#12/25/2006#) sẽ cho kết quả là 25
(2) Hàm Month(d): Hàm trả về số ghi tháng của d.
Ví dụ: Month(#11/30/2006#) sẽ cho kết quả là 11
(3) Hàm Year(d): Hàm trả về số ghi năm của d.
Ví dụ: Year(#12/25/2006#) sẽ cho kết quả là 2006
(4) Hàm Now: Hàm trả về ngày tháng năm và giờ của hệ thống máy tính.
(5) Hàm Weekday (d): Hàm cho biết thứ mấy trong tuần.
Ví dụ: Weekday(#11/13/2006#)) cho kết quả là 3 (thứ 3 trong tuần). Weekday(#11/19/2006#) sẽ cho kết quả là 1 (thứ 1, tức là ngày chủ nhật trong tuần) (6) Hàm hour (
Ví dụ: Hour(#10:20:15#) sẽ cho kết quả là 10 (7) Hàm Minute(
37
Ví dụ: Minute(#10:20:15#) sẽ cho kết quả là 20.
(8) Hàm Second(
Ví dụ: Second(#10:20:15#) sẽ cho kết quả là 15.
2.8.3. Hàm chuyển đổi
(1) Hàm CBool (x): Hàm trả về giá trị kiểu Boolean của x.
Ví dụ: Xyz = Cbool ( 3 > 5 )
Vì biểu thức 3 > 5 cho giá trị là False, nên Xyz có giá trị là False.
(2) Hàm CByte(x): Hàm trả về giá trị kiểu Byte của x.
(3) Hàm CCur(x): Hàm trả về giá trị kiểu Currency của x. (4) Hàm CDate(x): Hàm trả về giá trị kiểu Date của x.
(5) Hàm CDbl(x): Hàm trả về giá trị kiểu Double của x.
(6) Hàm CInt(x): Hàm trả về giá trị kiểu Integer của x
(7) Hàm Dec(x): Hàm trả về giá trị kiểu Decimal của x.
Ví dụ: Cint(14.2) sẽ cho số 14
Cint (14.6) sẽ cho số 15 Cint(-14.2) sẽ cho số -14
Cint(-14.6) sẽ cho số -15
(8) Hàm CLng(x): Hàm trả về giá trị kiểu Long của x.
(9) Hàm CSng(x): Hàm trả về giá trị kiểu Single của x.
(10) Hàm CStr(x): Hàm trả về giá trị kiểu String của x.
(11) Hàm CVar(x): Hàm trả về giá trị kiểu Variant của x.
(12) Hàm Val(
Ví dụ: N = Val (“12” & “34”)
N sẽ chứa số 1234.
Visual Basic 6.0 còn có 4 hàm chuyển đổi số ở hệ thập phân thành hệ bát phân (hệ 8) và hệ thập lục phân (hệ 16): (13) Hàm Oct(x) hoặc Oct$(x): Hàm trả về giá trị số hệ bát phân Variant hoặc chuỗi tƣơng ứng của x.
Ví dụ: Oct(188) cho giá trị là 274 (14) Hàm Hex(x) hoặc Hex$(x): Hàm trả về giá trị số hệ thập lục phân Variant hoặc chuỗi tƣơng ứng của x.
38
Ví dụ:
Hex(2006) cho giá trị là 7D6
2.8.4. Hàm kiểm tra kiểu dữ liệu
(1) Hàm IsArray(x): Nếu x có kiểu dữ liệu là mảng thì hàm trả về giá trị True, ngƣợc
lại hàm trả về giá trị False.
(2) Hàm IsDate(x): Nếu x có thể chuyển đổi sang định dạng thời gian thì hàm trả về
giá trị True, ngƣợc lại hàm trả về giá trị False. (3) Hàm IsNumeric(x): Nếu x có thể chuyển đổi sang định dạng số thì hàm trả về giá
trị True, ngƣợc lại hàm trả về giá trị False.
(4) Hàm VarType(x): 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
2.8.5. Hàm định dạng
Format(Biểu_thức [, Xâu định dạng]): Hàm trả về biểu thức theo một định dạng
mong muốn đƣợc xác định bởi xâu định dạng. Trong đó:
Biểu_thức: Là biểu thức số hoặc chuỗi cần định dạng Xâu định dạng đƣợc tạo thành bởi các ký tự sau:
39
# : Đại diện cho các chữ sô từ 0..9 (không xuất hiện nếu không có giá trị)
0 : Đại diện cho các chữ sô từ 0..9 (không xuất hiện thì hiện số 0)
@: Đại diện cho một chữ hoặc khoảng trống (Có thể xuất hiệ hoặc không) . : Hiển thị dấu chấm ở vị trí khai báo
, : Hiển thị dấu , ngăn cách mỗi nhóm 3 chữ số
% : Nhân biểu thức với 100 rồi hiển thị dấu % tại vị trí khai báo
> : Hiển thị theo chữ in hoa < : Hiển thị theo chữ thƣờng
Ví dụ:
MyTime = #5:04:23#
MyDate = #January 27, 1993#
MyStr = Format(MyTime, "Long Time") “5:04:23 AM”
MyStr = Format(MyDate, "Long Date") “Thurday, March 20, 2003”
MyStr = Format(MyTime, "h:m:s") "17:4:23".
MyStr = Format(MyTime, "hh:mm:ss AMPM") "05:04:23 PM".
MyStr = Format(MyDate, "dddd, mmm d yyyy") "Wednesday”.
MyStr = Format(5459.4, "##,##0.00") "5,459.40".
MyStr = Format(334.9, "###0.00") "334.90".
MyStr = Format(12345.67, "#.###E+") "1.235E+4"
MyStr = Format(12345.67, "#.###E-") "1.235E4"
MyStr = Format("abcde", "@@@@@@@") " abcde"
Format("abcde", ">& & & & &") "A B C D E"
MyStr = Format(5, "0.00%") "500.00%".
MyStr = Format("HELLO", "<") "hello".
MyStr = Format("This is it", ">") "THIS IS IT".
2.9. Hiển thị và nhập thông tin
2.9.1. Hộp thông báo
Ta có thể sử dụng hộp thông báo (MsgBox) để hiển thị thông báo và chờ sự trả lời của ngƣời sử dụng. Khi ngƣời sử dụng kích vào một nút lệnh thì một số nguyên biểu thị nút lệnh mà ngƣời sử dụng đã nhấn sẽ đƣợc trả về. Để hiển thị hộp thoại thông báo ta có thể sử dụng thủ tục MsgBox hoặc hàm
40
MsgBox(). Điểm khác biệt giữa chúng là hàm hiển thị thông báo và trả về giá trị cho phép tƣơng tác với ngƣời sử dụng, còn thủ tục thì chỉ hiển thị hộp thông báo. Cú pháp của lệnh MsgBox: MsgBox prompt[, buttons] [, title] [, helpfile, context] Cú pháp của hàm MsgBox( ):
MsgBox(prompt[, buttons] [, title] [, helpfile, context])
Tiªu ®Ò
BiÓu t îng
Th«ng ®iÖp C¸c nót lÖnh
Hình 2.4. Hộp thông báo (MsgBox)
Trong đó:
Prompt: Là tham số bắt buộc dùng để xác định thông điệp sẽ đƣợc hiển thị trong
hộp thoại. Độ dài của thông điệp tối đa là 1024 kí tự. Nếu thông điệp có nhiều dòng ta có thể ngăn cách các dòng bằng cách chèn thêm các kí tự xuống dòng Chr(10) và
trở về đầu dòng Chr(13) hoặc hằng vbCrLf, ví dụ:
MsgBox "Xin chào các bạn sinh viên" & Chr(10) & Chr(13) “Trƣờng Đại học Sƣ
phạm Kỹ thuật Nam Định”
Title: Là tham số tuỳ chọn dùng để xác định tiêu đề của hộp thoại. Nếu bỏ qua thì
tên của ứng dụng sẽ xuất hiện tại đây.
Helpfile: Là tham số tuỳ chọn dùng xác định tên của tệp tin trợ giúp cho chƣơng
trình.
Context: Là tham số tuỳ chọn đƣợc sử dụng kết hợp với Helpfile. Nó là một biểu
thức số gắn với một chủ đề trợ giúp nào đó.
Buttons: Là tham số tuỳ chọn dùng để xác định các kiểu nút lệnh và biểu tƣợng hiển
thị trong hộp thoại. Nó nhận giá trị là các hằng do Visual Basic cung cấp sẵn. Cụ
thể:
Giá Mô tả Hằng trị
0 Hiển thị nút OK vbOKOnly
1 Hiển thị nút OK và Cancel vbOKCancel
vbAbortRetryIgnore Hiển thị nút Abort, Retry và Ignore 2
3 Hiển thị nút Yes, No và Cancel vbYesNoCancel
4 Hiển thị nút Yes và No vbYesNo
5 Hiển thị nút Retry và Cancel vbRetryCancel
Hiển thị biểu tƣợng để thông báo một lỗi vbCritical 16
41
nghiêm trọng đã xảy ra và chƣơng trình sẽ kết thúc khi thoát khỏi thông báo này.
vbQuestion 32 biểu thị rằng chƣơng Hiển thị biểu tƣợng trình cần thêm thông tin từ phía ngƣời sử dụng
trƣớc khi có thể tiếp tục thực hiện.
Hiển thị biểu tƣợng để biểu thị chƣơng trình đã xảy ra một vấn đề nào đó, yêu cầu ngƣời sử vbExclamation 48
dụng hiệu chỉnh hoặc có thể dẫn đến một kết quả không mong muốn.
Hiển thị biểu tƣợng dùng cho các thông vbInformation 64
báo cung cấp thông tin cho ngƣời sử dụng.
Khi hàm MsgBox( ) đƣợc sử dụng nó cung cấp một giá trị cho một biến ví dụ:
X = MsgBox("Bạn có muốn tiếp tục không", vbYesNoCancel, "Thông báo") Giá trị X đƣợc gọi là giá trị trả về của hàm MsgBox( ), nó xác định nút lệnh mà
ngƣời sử dụng đã nhấn. Các giá trị có thể đƣợc tóm tắt trong bảng sau:
Hằng Giá trị Nút đƣợc nhấn
vbOK 1 OK
vbCancel 2 Cancel
vbAbort 3 Abort
vbRetry 4 Retry
vbIgnore 5 Ignore
vbYes 6 Yes
vbNo 7 No
Ví dụ:
Dim x As Integer
Private Sub Command1_Click()
x = MsgBox("Hãy kích vào một nút lệnh nào đó", vbAbortRetryIgnore) Select Case x Case 3 MsgBox "Bạn đã kích nút Abort" Case 4 MsgBox "Bạn đã kích nút Retry"
Case 5
MsgBox "Bạn đã kích nút Ignore"
42
End Select End Sub
2.9.2. Hiển thị thông tin lên Form
Để hiển thị thông tin lên Form ta viết lệnh
Ví dụ: Dim X as Integer X = 3 Form1.Print “X = “, X Form1.Print “Giá trị biểu thức”; X*2 - 3 + X*X; Nếu cuối câu lệnh Print ta đặt dấu ; thì con trỏ vẫn nằm ở dòng cũ ngƣợc lại con trỏ sẽ nhảy xuống dòng mới. Ta có thể dùng hằng vbCrlf để điều khiển xuống dòng. Để điều khiển vị trí in trên Form ta có thể dùng các thuộc tính CurrentX, CurrentY của Form. Form1.CurrentX = cột Form1.CurrentY = hàng Để xóa thông tin trên Form (trừ các điều khiển) ta dùng phƣơng thức cls Ví dụ: Me.cls „ hoặc Form1.cls 2.9.3. Hộp nhập dữ liệu Hàm InputBox( ) dùng để nhận thông tin từ ngƣời sử dụng. Hàm này hiển thị một hộp thoại để yêu cầu ngƣời sử dụng nhập dữ liệu, hộp thoại có một dòng thông báo, một hộp soạn thảo, 2 nút OK và Cancel nhƣ hình sau: Tiêu đề của hộp thoại Thông báo Hộp văn bản Hình 2.5. Hộp nhập dữ liệu (InputBox) Cú pháp của hàm InputBox( ):
InputBox(prompt[, title] [, default] [, xpos] [, ypos] [, helpfile, context])
Trong đó: 43 Các tham số prompt, title, helpfile và context giống nhƣ ở MsgBox. Default: Là tham số tuỳ chọn dạng xâu ký tự xuất hiện ngầm định trong hộp văn bản khi hộp thoại xuất hiện. Nếu bỏ qua tham số này hộp văn bản sẽ rỗng.
xpos, ypos: Là tham số tuỳ chọn xác định vị trí theo chiều ngang và dọc nơi hộp thoại xuất hiện, chúng tƣơng tự nhƣ thuộc tính left và top của đối tƣợng Form. Khi ngƣời sử dụng nhập thông tin vào hộp văn bản sau đó kích OK thì hàm InputBox( ) sẽ trả về chuỗi kí tự nằm trong hộp soạn thảo.
Ví dụ: Thiết kế một form trên đó có một nút lệnh (CommandButton1), sau đó viết các dòng lệnh sau vào cửa sổ Code. Dim Ten As String Private Sub Command1_Click()
Ten = InputBox("Hãy nhập vào tên của bạn", "Input box") MsgBox "Xin chào bạn: " & Ten End Sub Chạy chƣơng trình rồi nhấn chuột vào Commandbutton1, xuất hiện hộp nhập sau: Hình 2.6. Ví dụ hộp nhập dữ liệu 2.10.1. Lệnh gán Lệnh gán dùng để gán giá trị của một biểu thức cho một biến. Ví dụ : x =100
y = x*100 Chú ý :
Kiểu dữ liệu sau khi tính toán của biểu thức bên phải phải phù hợp với kiểu dữ
liệu của biến, nếu không sẽ xuất hiện lỗi 2.10.2. Ngăn cách các câu lệnh trên một dòng Ta có thể viết nhiều câu lệnh trên một dòng, và các câu lệnh đó phải ngăn cách nhau
bởi dấu hai chấm “:”. 44 Ví dụ:
StartTime = Now: EndTime = StartTime + 10 2.10.3. Kéo dài câu lệnh trên hai dòng Khi có những câu lệnh dài chúng ta có thể viết câu lệnh đó trên nhiều dòng, và
dùng kí hiệu gạch nối (_) để nối các dòng đó. 2.10.4. Nối 2 xâu kí tự Để nối hai xâu kí tự, chúng ta sử dụng 1 trong 2 kí hiệu sau: & hoặc + Ví dụ : Label1.Caption = “Đại học sư phạm kỹ thuật Nam Định” & “--"_ & “Khoa CNTT” Label2.Caption = “Bây giờ là :“ + Now 2.10.5. Qui ước đặt tên biến và tên đối tượng Qui ƣớc đặt tên biến
Để thuận tiện cho việc bảo trì ta nên dùng các chuẩn đặt tên. Qui ƣớc đặt tên biến không những giúp ta đặt tên biến mà còn nêu rõ phạm vi của các biến cũng nhƣ kiểu dữ liệu của nó. Những qui ƣớc dƣới đây không phải là bắt buộc, chúng chỉ là các gợi
ý. [g/m] [a] tName Trong đó mọi dấu chỉ báo (tiền tố) đều ở dạng chữ thƣờng. [g/m] đƣợc dùng nếu biến khai báo là toàn cục (public) hoặc ở cấp mô đun (private). Phần này đƣợc bỏ qua nếu biến đƣợc dùng cục bộ cho một thủ tục. [a] Đƣợc dùng nếu biến là một mảng t là kiểu dữ liệu của biến nhƣ sau: Kiểu dữ liệu Tiền tố Kiểu dữ liệu Tiền tố Integer n Currency c Double d Boolean b Long l Single g Date t Object o String s Variant v Name là tên biến, phải thích hợp với công dụng thực tế của biến, Ví dụ:
Dim nLoopcount as Integer Dim masLastname (100) as String Public gcSalestax as Currency 45 Qui ƣớc đặt tện biến đối tƣợng
Các qui ƣớc đặt tên đối tƣợng thƣờng theo cú pháp chung sau: oName Trong đó o là kiểu đối tƣợng đƣợc viết tắt Điều khiển Viết tắt Điều khiển Viết tắt CommandButton cmd Data dat txt HScrollBar hsb TextBox lbl VScrollBar vsb Label pic DriveListBox drv PictureBox opt DirListBox dir OptionButton chk FileListBox fil CheckBox cbo Line lin ComboBox lst Shape shp ListBox tmr OLE ole Timer fra Form frm Frame txtHoten, cboGioitinh, frmQuanLy v.v... Ví dụ: Câu lệnh IF cho phép lựa chọn một trong hai nhánh tùy thuộc vào giá trị của một biểu thức lôgic(điều kiện) là Đúng (True) hay Sai (False). If <điều kiện> Then If x>10 Then Print “x lớn hơn 10” Ví dụ : Cú pháp 2: If <điều kiện> Then End If Ví dụ: If x <> 0 Then y = 100/x txtketqua.Text = y End If 46 Cú pháp 3 : If <điều kiện> Then
Else Ví dụ: If x <> 0 Then y = 100 / x txtketqua.Text = y Else Print “Bạn phải nhập giá trị khác 0” End If Cú pháp 4: If <điều kiện1> Then Else If <điều kiện 2> then Else End If End If Ví dụ: If diem >=8 Then Xeploai = “Giỏi” Else If diem >=7 Then Xeploai = “Khá” Else If diem >= 5 Then Xeploai = “Trung bình” End If End If End If Cú pháp:
Select Case [Khối lệnh 1] 47 [Case . . . . . .
[Case Else [Khối lệnh n] End Select Hoạt động :
Chƣơng trình sẽ kiểm tra, nếu thực hiện. Ngƣợc lại, Ví dụ:
Viết chƣơng trình sử dụng điều khiển Label, TextBox, ComboBox, Commandbutton thực hiện các phép toán số học nhƣ thiết kế mẫu: Giải:
Bƣớc 1. Thiết kế form theo mẫu bằng cách đƣa vào form Label, TextBox, ComboBox, Commandbutton, sau đó xác định vị trí, kích thƣớc cho các điều khiển cho phù hợp.
Bƣớc 2. Thiết lập một số thuộc tính cho các điều khiển nhƣ bảng sau: TT Điều khiển Thuộc tính Giá trị Ghi chú Name Form1 1 Form Caption Các phép toán Name cmdtinh 2 CommandButton Caption Tính Name cmdthoat 3 CommandButton Caption Thoát 4 TextBox Name txta 5 TextBox Name txtb 6 TextBox Name txtkq 48 7 ComboBox Name cbopt List + - Mỗi giá trị trên một dòng, nhấn
Ctrl+Enter để
xuống dong *
/
Mod
^ Bƣớc 3. Mở cửa sổ lệnh của Form1 và gõ vào các dòng lệnh sau: Private Sub cmdthoat_Click() End
End Sub „----------------------------------------------------------------------------- Private Sub cmdtinh_Click() Dim a As Integer, b As Integer, kq As Double a = Val(txta.Text) b = Val(txtb.Text) Select Case cbopt.Text Case "+" kq = a + b Case "-" kq = a - b Case "*" kq = a * b Case "/" kq = a / b Case "\" kq = a \ b Case "mod" kq = a Mod b Case "^" kq = a ^ b End Select txtkq.Text = kq End Sub 49 Bƣớc 4. Chạy chƣơng trình (F5). Cấu trúc lặp này thƣờng đƣợc dùng đối với vòng lặp biết trƣớc số lần lặp thông
qua một biến đếm. Biến đếm sẽ chạy từ một giá trị khởi đầu, khi nó đạt đến giá trị cuối thì vòng lặp kết thúc và cứ mỗi khi thực hiện xong đoạn lệnh của thân vòng lặp thì biến đếm lại đƣợc tăng (hoặc giảm xuống) một lƣợng bằng giá trị của bƣớc nhảy: Cú pháp:
For Next Hoạt động:
Bƣớc 1: Biến đếm nhận giá trị bằng giá trị đầu Bƣớc 2: Nếu bƣớc nhảy là số âm, máy kiểm tra điều kiện (biến đếm >= giá trị cuối)? Nếu bƣớc nhảy là số dƣơng, máy sẽ kiểm tra điều kiện (biến đếm <= giá trị cuối)?
Bƣớc 3: Nếu điều kiện trên là đúng thì khối lệnh đƣợc thực hiện và biến đếm đƣợc tăng thêm một giá trị bằng bƣớc nhảy và quay lại bƣớc 2, ngƣợc lại máy sẽ kết thúc vòng lặp For và làm các lệnh sau vòng lặp For Ví dụ: Đoạn lệnh sau: For i = 1 to 10 Print i Next sẽ in lên màn hình các số từ 1 đến 10 Cấu trúc lặp này đƣợc sử dụng đối với vòng lặp có số lần lặp không xác định, thông qua một biểu thức điều kiện, nghĩa là chúng ta muốn thực hiện một khối lệnh nào đó lặp lại một số lần, nhƣng không xác định đƣợc số lần lặp lại là bao nhiêu mà chỉ biết rằng việc lặp lại thực hiện khối lệnh đó sẽ kết thúc khi một điều kiện mà chúng ta đƣa ra là sai. Cú pháp: Do While <điều kiện>
Hoạt động: Đầu tiên chƣơng trình sẽ kiểm tra <điều kiện>, nếu điều kiện đúng (True) thì 50 kiện> (lúc này giá trị của điều kiện có thể đã thay đổi), nếu <điều kiện> vẫn đúng thì nhận giá trị sai (False).
Ví dụ: Đoạn lệnh sau: i = 1 Do While i <= 10 Print i
i = i + 1 Loop sẽ in lên màn hình các số từ 1 đến 10 Cú pháp:
Do Loop While <điều kiện> Hoạt động:
Tƣơng tự nhƣ vòng lặp Do While…Loop, nhƣng ở đây thực hiện trƣớc, rồi máy kiểm tra <điều kiện>. Nhƣ vậy, trong trƣờng hợp này, Ví dụ: Đoạn lệnh sau: i = 1 Do Print i i = i + 1 Loop While i <= 10 sẽ in lên màn hình các số từ 1 đến 10 Cú pháp: Do Until <điều kiện>
Hoạt động:
Trong trƣờng hợp này, 51 Ví dụ:
i = 1 Do Until i > 10 Print i
i = i + 1 Loop Cú pháp:
Do Loop Until <điều kiện> Hoạt động: Giống nhƣ lệnh Do Until…Loop, nhƣng ở đây mới kiểm tra <điều kiện>. Ví dụ: i = 1 Do Print i i = i + 1 Loop Until i > 10 Chú ý: Lệnh Exit For cho phép thoát khỏi lệnh vòng lặp For, Exit Do cho phép thoát khỏi lệnh lặp Do… Loop. Cú pháp: While <điều kiện> Wend Hoạt động: Tƣơng tự lệnh lặp Do While…Loop, nhƣng ta không thể thoát khỏi lệnh lặp bằng lệnh Exit Do. Vì vậy, lệnh lặp này chỉ thoát khi <điều kiện> sai. Ngƣời lập trình khó kiểm soát hết các tình huống có thể gây ra lỗi. Vì vậy, các thao tác bẫy các lỗi thực thi của chƣơng trình là cần thiết. Visual Basic cũng cung 52 cấp cho ta một số cấu trúc để bẫy các lỗi đang thực thi. Dạng 1. Cú pháp:
On Error GoTo Giải thích: Nếu một lệnh trong định nghĩa bên dƣới Dạng 2. Cú pháp:
On Error Resume Next
Giải thích: Nếu một lệnh trong trình thực thi đến câu lệnh đó, chƣơng trình sẽ tự động bỏ qua câu lệnh bị lỗi và thực thi câu lệnh kế tiếp. Hàm và thủ tục là những khái niệm cơ bản của lập trình có cấu trúc. Chúng thực chất là một đoạn lệnh thực hiện một công việc nào đó, và đƣợc đại diện bởi tên hàm hay thủ tục. Khi giải quyết một bài toán chúng ta thƣờng chia bài toán đó ra thành nhiều phần nhỏ, mỗi phần nhỏ đó đƣợc thực hiện bởi một hàm hay thủ tục. Hàm hay thủ tục có thể đƣợc sử dụng lại trong một ứng dụng khác. Mỗi hàm hay thủ tục phải có tên riêng biệt, phạm vi, danh sách các tham số, riêng đối với hàm còn có thêm giá trị trả về. 2.20.1. Khai báo thủ tục và hàm a) Khai báo thủ tục Cú pháp : [Private|Public|Friend] Sub „Các dòng lệnh End Sub Ví dụ: Private Sub Swap(so1 As Integer, so2 As Integer) Dim Temp temp = so1: so1 = so2: so2 = temp End Sub b) Khai báo hàm 53 Cú pháp : [Private|Public] Function „Các dòng lệnh End Function Ví dụ: Public Function Giaithua(n As Integer) As Long Dim i As Integer
Giaithua = 1 For i = 1 To n Giaithua = Giaithua * i Next
End Function 2.20.2. Lời gọi thủ tục, hàm a) Gọi thủ tục
Call hoặc: Ví dụ:
Call Swap(a,b) hoặc Swap a, b b) Gọi hàm
Khác với thủ tục, chúng ta phải có một biến có kiểu dữ liệu thích hợp (trùng với kiểu dữ liệu trong phần khai báo kiểu giá trị trả về của hàm) để lƣu giá trị trả về khi hàm đƣợc thực hiện với các tham số thực truyền vào. Ví dụ:
Ketqua = giaithua(txtso.text) 2.20.3. Thoát khỏi thủ tục / hàm Exit Sub dùng để thoát khỏi thủ tục, Exit Function dùng để thoát khỏi hàm 2.20.4. Tham số và việc truyền tham số cho chương trình con 1) Tham số hình thức/Tham số thực
Tham số hình thức là các tham số đƣợc đƣa ra trong phần khai báo chƣơng trình
con, nó chỉ ra kiểu dữ liệu của các tham số của chƣơng trình con. Trong chƣơng 54 trình con các tham số kiểu này chỉ có tên, chứ chƣa có giá trị, chỉ khi nào xuất hiện lời gọi chƣơng trình con, các tham số mới đƣợc truyền giá trị từ bên ngoài và chƣơng trình con sẽ đƣợc hoạt động với bộ giá trị ấy. Chính vì vậy chúng đƣợc gọi
là tham số hình thức. Các biến bên ngoài truyền vào chƣơng trình con đƣợc gọi là các tham số thực, vì chúng thực sự tham gia vào chƣơng trình con với tƣ cách là một giá trị. Khi gọi đến chƣơng trình con thì phải có sự tƣơng ứng 1-1 giữa tham số thực và tham số hình thức cả về thứ tự và kiểu dữ liệu. Trong các ví dụ trên, các tham số
so1, so2 ở thủ tục Swap và n ở hàm Giaithua là các tham số hình thức và các tham số a, b ở thủ tục Swap và txtso.text ở hàm Giaithua là các tham số thực. 2) Truyền tham số theo tham biến/tham trị
Khi khai báo thủ tục/hàm, sử dụng từ khóa ByVal trƣớc tham số để quy định
tham số đó sẽ đƣợc truyền theo tham trị; sử dụng từ khóa ByRef trƣớc tham số để quy định tham số đó đƣợc truyền theo tham biến (mặc định của Visual Basic 6.0 là truyền theo tham biến, nên từ khóa ByRef có thể bỏ qua). Truyền tham số theo trị (tham trị) tức là cái mà chúng ta sử dụng trong chƣơng trình con là bản sao của tham số thực đƣợc truyền vào chƣơng trình con, vì vậy việc truyền theo trị có những đặc điểm sau: Nếu trong chƣơng trình con có những lệnh làm thay đổi giá trị của tham số
hình thức thì những thay đổi này không có ảnh hƣởng gì đến giá trị của tham số thực đƣợc truyền ở đầu vào khi chúng ta gọi chƣơng trình con, vì những thay đổi này chỉ thực hiện trên bản sao tƣơng ứng. Tốn một ít bộ nhớ và thời gian cho việc sao chép (tùy theo kích thƣớc của tham số tƣơng ứng) Truyền tham số theo tham biến đƣợc thực hiện vào chính địa chỉ của biến đƣợc truyền, nghĩa là mọi lệnh của chƣơng trình con đối với tham số hình thức cũng chính là các lệnh đối với biến này. Vì vậy, việc truyền theo tham biến có những đặc điểm sau: Nếu trong chƣơng trình con có những lệnh làm thay đổi giá trị của tham số
hình thức thì những thay đổi này cũng chính là những thay đổi trên biến đƣợc
truyền. Hay nói cách khác những sự thay đổi đó vẫn có tác dụng đối với các tham số thực truyền vào khi kết thúc chƣơng trình con. Không tốn thêm bộ nhớ và thời gian do không phải sao chép Ví dụ:
Chúng ta có hai hàm Swap1 và Swap2 nhƣ sau: Private Sub Swap1(ByRef so1 As Integer,ByRef so2 As Integer) Dim temp temp = so1: so1 = so2: so2 = temp 55 End Sub Private Sub Swap2(ByVal so1 As Integer, ByVal so2 As Integer) Dim temp
temp = so1: so1 = so2: so2 = temp End Sub 3) Tham số tùy chọn
Khi chúng ta muốn quy định một tham số của hàm hay thủ tục là tham số tùy chọn (tức là có thể có hoặc bỏ qua trong lời gọi) thì chúng ta dùng từ khóa Optional trƣớc khai báo tham số của hàm/thủ tục. Tham số tùy chọn luôn đƣợc khai báo cuối cùng trong danh sách tham số và ta nên khởi gán giá trị cho tham số tuỳ chọn ngay từ khi khai báo. Ví dụ:
Function Trongluong(m As Double, Optional g As Double = 9.8) As Double Trongluong = m*g End Function Khi gọi hàm chúng ta có thể có hoặc bỏ qua tham số tùy chọn. Ví dụ:
P = Trongluong(m) hoặc P = Trongluong(m,g) 4) Biến địa phƣơng/biến toàn cục
Khái niệm địa phƣơng và toàn cục của phạm vi của biến là đề cập đến phạm vị sử
dụng và có tác động của biến đó. Nếu nó chỉ có phạm vi là trong thủ tục/hàm thì nó
đƣợc gọi là biến địa phƣơng, còn nếu nó có phạm vi sử dụng trong toàn Project thì
nó đƣợc gọi là biến toàn cục. Tuy nhiên trong phạm vi một form module, thì những biến khai báo trong phần General lại vừa là biến địa phƣơng vừa là biến toàn cục, vì
vậy khái niệm địa phƣơng hay toàn cục chỉ có tính tƣơng đối. Sau đây là một số chú 56 ý về biến địa phƣơng/toàn cục trong Visual Basic: Những biến đƣợc khai báo trong một Sub/Function trong phạm vi Form hay của Bas Module (mô-đun chuẩn) thì đƣợc gọi là biến địa phƣơng và chỉ có phạm vi sử
dụng trong Sub/Fuction đó. Những biến đƣợc khai báo với từ khóa Private/Dim trong phần General của Form thì chỉ có phạm vi sử dụng trong Form, và toàn bộ các Sub/Function trong phạm vi Form đó, nhƣng không thể sử dụng bên ngoài Form. Vì vậy, nó là địa phƣơng trong
toàn Project, nhƣng là toàn cục trong phạm vi Form Những biến đƣợc khai báo với từ khóa Public trong phần General của Form thì có phạm vi sử dụng trong toàn bộ Project, vì vậy nó có phạm vi toàn cục. Tuy nhiên ở bên ngoài Form mà muốn sử dụng biến đó thì phải sử dụng theo cú pháp sau: Những biến đƣợc khai báo với từ khóa Public trong phần General của Bas Module thì có phạm vi sử dụng trong toàn bộ Project và khi sử dụng nó ở bên ngoài Bas Module thì chỉ cần gọi tên biến đó. Những biến này cũng có phạm vi toàn cục. 2.20.5. Phạm vi hoạt động của các thủ tục và hàm Phạm vi của hàm hay thủ tục có thể đƣợc quy định bởi từ khoá Public hoặc Private. Nếu hàm hay thủ tục đƣợc khai báo với từ khóa Private, nó chỉ có thể đƣợc
gọi trong phạm vi của Module mà nó đƣợc định nghĩa. Nếu hàm hay thủ tục đƣợc khai báo với từ khóa Public, nó có thể đƣợc gọi ở bên ngoài phạm vi của Module mà nó đƣợc định nghĩa. Một ứng dụng đơn giản có thể chỉ có một biểu mẫu, lúc đó tất cả mã lệnh của ứng
dụng đó đƣợc đặt trong cửa sổ mã lệnh của biểu mẫu đó (gọi là Form Module). Khi ứng dụng đƣợc phát triển lớn lên, chúng ta có thể có thêm một số biểu mẫu nữa và lúc này khả năng lặp đi lặp lại nhiều lần của một đoạn mã lệnh trong nhiều biểu mẫu khác nhau là rất lớn. - Để tránh việc lặp đi lặp lại trên, ta tạo ra một Module riêng rẽ chứa các chƣơng
trình con đƣợc dùng chung. Visual Basic cho phép 3 loại Module:
Module biểu mẫu (Form module): đi kèm với mỗi một biểu mẫu là một module
của biểu mẫu đó để chứa mã lệnh của biểu mẫu này. Với mỗi điều khiển trên biểu
mẫu, module biểu mẫu chứa các chƣơng trình con và chúng sẵn sàng đƣợc thực thi 57 để đáp ứng lại các sự kiện mà ngƣời sử dụng ứng dụng tác động trên điều khiển.
Module biểu mẫu đƣợc lƣu trong máy tính dƣới dạng các tập tin có đuôi là *.frm.
Module chuẩn (Standard module): Mã lệnh không thuộc về bất cứ một biểu mẫu
hay một điều khiển nào sẽ đƣợc đặt trong một module đặc biệt gọi là module chuẩn (đƣợc lƣu với đuôi *.bas). Các chƣơng trình con đƣợc lặp đi lặp lại để đáp ứng các sự kiện khác nhau của các điều khiển khác nhau thƣờng đƣợc đặt trong module
chuẩn. Module lớp (Class module): đƣợc sử dụng để tạo các điều khiển đƣợc gọi thực thi trong một ứng dụng cụ thể. Một module chuẩn chỉ chứa mã lệnh nhƣng module lớp chứa cả mã lệnh và dữ liệu, chúng có thể đƣợc coi là các điều khiển do ngƣời lập
trình tạo ra (đƣợc lƣu với đuôi *.cls). 2.21.1 Bổ sung Standard Module vào Project Từ menu Project chọn Add Module. Muốn tạo mới chọn Tab New sau đó chọn Open. Muốn chọn một tệp tin có sẵn chọn nhãn Existing, chọn tên tệp tin và chọn
Open. 2.21.2. Khai báo trong module odule chứa các khai báo kiểu, hằng, biến, thủ tục/hàm thuộc phạm vi Public hoặc ở mức mô-đun. Biến Module là biến đƣợc định nghĩa trong phần khai báo (General|Declaration)
của Module và mặc nhiên phạm vi hoạt động của nó là toàn bộ Module ấy. Biến Module đƣợc khai báo bằng từ khóa Dim hay Private và đƣợc đặt trong phần khai báo của Module. Ví dụ:
Private Num As Integer Tuy nhiên, các biến Module này có thể đƣợc sử dụng bởi các chƣơng trình con trong các Module khác. Muốn thế chúng phải đƣợc khai báo là Public trong phân Khai báo (General|Declaration) của Module. Ví dụ:
Public Num As Integer Lƣu ý: Không thể khai báo biến với từ khóa là Public trong chƣơng trình con. 2.22.1. Khai báo Khai báo xâu ký tự có độ dài cố định. Cú pháp: Public/Private/Dim Tên_biến As String * Trong trƣờng hợp số ký tự thực có trong xâu ít hơn độ dài khai báo thì một số 58 khoảng trắng sẽ tự động đƣợc thêm vào cho đủ độ dài khai báo. Trong trƣờng hợp số
ký tự thực có trong xâu nhiều hơn độ dài khai báo thì các ký tự dƣ thừa bên phải của
xâu sẽ bị cắt đi. Một chuỗi không có ký tự nào (độ dài bằng 0) gọi là chuỗi rỗng. Khai báo xâu ký tự có độ dài thay đổi. Cú pháp:
Public/Private/Dim Tên_biến As String Trong trƣờng hợp này xâu có chiều dài tối đa là 65.500 ký tự và các khoảng trắng không đƣợc tự động thêm vào khi số ký tự thực có trong xâu ít hơn 65.500. Ví dụ:
Dim Name As String * 30, Class As String * 10 Dim A As String 2.22.2. Các hàm xử lý xâu ký tự Giả sử: S, P, Q là các xâu ký tự. n, k là các số nguyên dƣơng
Len(S): Hàm trả về chiều dài của S. Ví dụ:
Len(“Visual Basic”) sẽ cho kết quả là 12 Ltrim(S): Hàm trả về một chuỗi sau khi xoá bỏ các dấu cách bên trái của S. Ví dụ:
Ltrim(“ Visual Basic”) sẽ cho kết quả là “Visual Basic” Rtrim(S): Hàm trả về một chuỗi sau khi xoá bỏ các dấu cách bên phải của S. Ví dụ:
Rtrim(“Visual Basic ”) sẽ cho kết quả là “Visual Basic” Trim(S): Hàm trả về một chuỗi sau khi xoá bỏ các khoảng trống bên trái và bên phải của Ví dụ:
Trim(“ Visual Basic ”) sẽ cho kết quả là “Visual Basic” Left (S, n): Hàm trả về một xâu con gồm n ký tự đầu tiên (bên trái) lấy từ S. Right (S, n): Hàm trả về một xâu con gồm n ký tự cuối cùng (bên phải) lấy từ S. Mid(S, n, k): Hàm trả về một xâu con gồm k ký tự tính từ ký tự thứ n lấy từ S. InStr(n, S, P [, compare]): Hàm trả về vị trí xuất hiện đầu tiên của xâu P trong xâu S, vị trí tìm kiếm tính từ ký tự thứ n. Nếu không tìm thấy trả về. Tham số Compare
xác định kiểu so sánh chuỗi, nó có thể nhận một trong ba giá trị: 0-
vbBinaryCompare, 1- vbTextCompare, 2- vbDataBaseCompare. Ví dụ: Dim myString As String, Position As Integer 59 myString = "The rain in Spain mainly..."
Position = Instr(myString,"ain") ' Position sẽ là 6
Space(n): Hàm trả về một xâu gồm n khoảng trắng.
String(n, Ví dụ:
String( 4, “m”) sẽ cho kết quả là “mmmm”
Ucase(S): Hàm trả về một xâu gồm các chữ hoa lấy ra từ S. Ví dụ:
Ucase(“Ha noi”) sẽ cho kết quả là “HA NOI” Lcase(S): Hàm trả về một xâu gồm các chữ thƣờng lấy ra từ S. Ví dụ:
Lcase(“Ha Noi”) sẽ cho kết quả là “ha noi” Asc(S): Hàm trả về mã ASCII của ký tự đầu tiên trong S. Ví dụ:
Asc(“Ha noi”) sẽ cho kết quả là 72 là mã ASCII của ký tự “H” Chr( Ví dụ:
Chr(72) sẽ cho kết quả là H Str(n): Hàm trả về xâu ký tự từ số n, xâu này luôn có một ký tự đầu ghi dấu “-“ trong trƣờng hợp số âm, hoặc một khoảng trống trong trƣờng hợp số dƣơng. Ví dụ:
Str(12345) sẽ cho kết quả là xâu “ 12345”. Str(-12345) sẽ cho kết quả là xâu “-12345”
Replace(S, P, Q, n, k): Hàm trả về một xâu trong đó tính từ vị trí ký tự thứ n xâu P đã đƣợc thay thế k lần bởi xâu Q. Ví dụ:
Replace("ha noi viet nam","a","x") sẽ cho kết quả là xâu “hx noi viet nxm”. 2.23.1. Khai báo mảng Mảng là một kiểu dữ liệu phổ biến trong các ngôn ngữ lập trình. Mảng dùng để lƣu một dãy các biến có cùng tên, cùng kiểu dữ liệu, và các biến này đƣợc phân biệt
với nhau bởi chỉ số của mảng. Cú pháp:
Dim 60 Dạng 1: Hoặc ‟Thiết lập chỉ số mảng bắt đầu từ 1 Option Base 1
Dạng 2: Ví dụ:
Option Base 1 Dim B (1 to 15) As Single, T (1 to 10, 1 to 15) As Integer
Dim ds(10) As Double Khi đó mảng B sẽ có 15 phần tử có chỉ số từ 1 đến 15, các phần tử của mảng có kiểu số thực Single. Mảng T là mảng 2 chiều có kích thƣớc là 10 x 15, chỉ số của chiều thứ nhất từ 1 đến 10, chỉ số của chiều thứ hai từ 1 đến 15, các phần tử của
mảng T có kiểu số nguyên Integer. Mảng ds có 10 phần tử, có chỉ số từ 1 đến 10. 2.23.2. Truy xuất các phần tử mảng Để truy xuất tới từng phần tử của mảng ta dùng tên của mảng cùng với chỉ số của nó. Ví dụ: Dim DoanhThu (1 to 12) as Single Dim i as Integer
For i = 1 to 12 Sale = InputBox(“Nhập vào doanh thu của tháng”) DoanhThu = Val(Sale) Next i 2.23.3. Mảng động và mảng tĩnh Trƣờng hợp vắng mặt ra. Khi đó, trƣớc khi sử dụng mảng chúng ta phải thể thiết lập kích thƣớc mảng bằng cách dùng khai báo: ReDim [Preserve] Ví dụ: Dim A ( ) As Integer „Khai báo mảng động „Cấp phát 5 phần tử ReDim A (5)
For i = 1 to 5
A(i) = i 61 Next i ReDim Preserve A (15)„Cấp phát lại 15 phần tử và bảo toàn dữ liệu đã có. Ví dụ:
Viết chƣơng trình sử dụng điều khiển TextBox, CommandButton, Label thực hiện nhập và hiển thị 2 ma trận vuông cùng cấp sau đó tính và hiển thị tính của hai ma trận theo form mẫu sau: Giải:
Bƣớc 1. Thiết kế form theo mẫu bằng cách đƣa vào form các điều khiển TextBox, CommandButton, Label , sau đó xác định vị trí, kích thƣớc cho các điều khiển cho phù hợp. Bƣớc 2. Thiết lập một số thuộc tính cho các điều khiển nhƣ bảng sau: TT Điều khiển Thuộc tính Giá trị Ghi chú Name Form1 1 Form Caption Tính hai ma trận vuông Name cmdnhapA 2 CommandButton Caption Nhập A Name cmdnhapB 3 CommandButton Caption Nhập B Name cmdketthuc 4 CommandButton Caption Kết thúc Name txtmta 5 TextBox Multiline True 62 Name txtmtb 6 TextBox Multiline True Name txttich 7 TextBox Multiline True 8 Textbox Name Txtcap 9 Label Caption Cấp của ma trận 10 Label Caption Ma trận A 11 Label Caption Ma trận B 12 Label Caption Tích hai ma trận Bƣớc 3. Mở cửa sổ lệnh của Form1 và gõ vào các dòng lệnh sau: Dim n As Integer, a() As Integer, b() As Integer, c() As Integer Private Sub txtcap_Change()
cmdnhapA.Enabled = True cmdNhapb.Enabled = True End Sub „---------------------------------------------------------------------------------- Private Sub cmdketthuc_Click()
End End Sub Private Sub cmdnhapa_Click() Dim i As Integer, j As Integer txtmta.Text = "" n = Val(txtcap.Text) ReDim a(n, n) For i = 1 To n For j = 1 To n a(i, j) = InputBox("Nhap phan tu a(" & i & "," & j & ")") txtmta.Text = txtmta.Text & a(i, j) & " " Next txtmta.Text = txtmta.Text & Chr(13) & Chr(10) 'xuong hang
Next
End Sub „---------------------------------------------------------------------------------- Private Sub cmdnhapb_Click() Dim i As Integer, j As Integer txtmtb.Text = "" n = Val(txtcap.Text) 63 ReDim b(n, n) For i = 1 To n For j = 1 To n b(i, j) = InputBox("Nhap phan tu b(" & i & "," & j & ")") txtmtb.Text = txtmtb.Text & b(i, j) & " " Next txtmtb.Text = txtmtb.Text & Chr(13) & Chr(10) Next End Sub „---------------------------------------------------------------------------------- Private Sub cmdtinh_Click() Dim i As Integer, j As Integer, k As Integer txttich.Text = "" n = Val(txtcap.Text) ReDim c(n, n) For i = 1 To n For j = 1 To n c(i, j) = 0 For k = 1 To n c(i, j) = c(i, j) + a(i, k) * b(k, j) Next txttich.Text = txttich.Text & c(i, j) & " " Next txttich.Text = txttich.Text & Chr(13) & Chr(10) Next End Sub Bƣớc 4. Chạy chƣơng trình (F5). 2.23.4. Mảng đối tượng điều khiển Visual Basic 6.0 đƣa ra khái niệm mảng đối tƣợng điều khiển trong đó nhiều điều
khiển cùng chia sẻ một tập các thủ tục sự kiện cho dù mỗi đối tƣơng trong mảng có
các thuộc tính khác nhau. Mảng đối tƣợng điều khiển đƣợc tạo trong lúc thiết kế 64 bằng một trong các cách sau:
Cách 1. Tạo một điều khiển và gán giá trị là một số nguyên dƣơng cho thuộc tính
Index của nó. Cách 2. Ta tạo 2 điều khiển thuộc cùng một lớp sau đó đặt cho 2 đối tƣợng này với cùng một tên, khi đó sẽ xuất hiện một hộp thoại để xác nhận xem ta có muốn tạo một mảng đối tƣợng điều khiển hay không. Ta chọn Yes để tạo mảng đối tƣợng điều khiển. Cách 3. Chọn một đối tƣợng trên Form sau đó nhấn Ctrl + C để copy đối tƣợng vào Clipboard sau đó nhấn Ctrl + V để tạo một thể hiện mới của điều khiển, điều khiển này sẽ có tên trùng với tên của điều khiển gốc, sẽ xuất hiện một hộp thoại nhƣ trong cách 2. Mảng các đối tƣợng điều khiển là một đặc trƣng thú vị của Visual Basic 6.0 chúng làm cho việc lập trình đƣợc mềm dẻo hơn: Các điều khiển trong cùng một mảng cùng chia sẻ một tập các thủ tục sự kiện điều này làm giảm số lƣợng mã (code) mà ta phải viết để đáp ứng các yêu cầu của ngƣời sử dụng. Ta có thể thêm một phần tử mới vào mảng khi thi hành (at run time) hay nói cách khác ta có thể tạo thêm một điều khiển mới mà trong lúc thiết kế ta chƣa tạo. Các phần tử trong mảng đối tƣợng điều khiển chiếm ít tài nguyên hơn so với một đối tƣợng điều khiển thông thƣờng Ta có thể gỡ bỏ điều khiển khỏi mảng điều khiển bằng cách sử dụng lệnh Unload. Ta chỉ có thể gỡ bỏ các điều khiển đƣợc tạo ra trong thời gian thực hiện. 2.24.1. Tạo Collection Collection là một đối tƣợng đƣợc sử dụng trong các ứng dụng Visual Basic chứa các nhóm dữ liệu có liên quan. Collection tƣơng tự nhƣ mảng nhƣng có một số khác biệt sau: Không cần xác định trƣớc số phần tử của Collection. Ta có thể chèn thêm một phần tử vào giữa Collection mà không cần tạo không gian để lƣu trữ cho phần tử mới này. Tƣơng tự ta có thể xóa một phần tử mà không phải dịch chuyển các phần tử còn lại để lấp chỗ trống. Trong cả hai trƣờng hợp trên Collection thực hiện một cách tự động. Collection thể lƣu trữ dữ liệu có kiểu khác nhau. Nói chung ta có thể lƣu trữ vào Collection tất cả những giá trị mà ta có thể lƣu trữ trong biển Variant. Collection cho phép gán cho mỗi phần tử một mã khóa nhờ đó ta có thể truy xuất 65 vào phần tử đó một cách nhanh chóng thậm chí ta không biết nó đƣợc lƣu trữ ở đâu trong Colletion. Ta cũng có thể truy cập vào một phần tử thông qua chỉ số thứ tự của nó trong Collection giống nhƣ đối với mảng. Ngƣợc lại với mảng khi ta đã thêm một phần tử vào Collection ta chỉ có thể đọc
mà không thay đổi đƣợc phần tử này. Ta chỉ có thể thay đổi giá trị của nó bằng cách xóa phần tử cũ và thêm phần tử mới. Trƣớc khi sử dụng thì Collection phải đƣợc tạo ra. Giống nhƣ với các đối tƣợng một Collection phải đƣợc khai báo sau đó tạo ra nhƣ đoạn lệnh sau: Dim EmployeeNames As Collection Set EmployeeNames = New Collection Hoặc ta có thể khai báo nhƣ sau:
Dim EmployeeNames As New Collection Để thêm một phần tử vào Collection ta sử dụng phƣơng thức Add với hai tham số là giá trị mà ta muốn thêm và chuỗi mã khóa (key) kết hợp với nó. Ví dụ, bổ sung
vào Collection Employee phần tử John Smith có key = “Marketing” ta sử dụng phƣơng thức Add nhƣ sau: EmployeeNames.Add "John Smith", "Marketing" Thông thƣờng phƣơng thức Add sẽ chèn thêm một phần tử vào cuối nhƣng ta có thể xác định vị trí cần lƣu trữ phần tử bằng cách sử dụng tham số before hoặc after. ' Chèn thêm giá trị này vào sau phần tử đầu tiên trong Collection. EmployeeNames.Add "Anne Lipton", "Sales" ' Chèn giá trị mới này vào trƣớc phần tử vừa tạo EmployeeNames.Add "Robert Douglas", ,"Sales" 2.24.2. Truy xuất giá trị trong Collection Để truy xuất vào một giá trị trong Collection ta sử dụng phƣơng thức Item . Đây là phƣơng thức ngầm định của Collection vì thế ta có thể bỏ qua. Các phần tử có thể đƣợc đọc thông qua chỉ số hoặc thông qua chuỗi mã khóa của chúng. Ví dụ: ' All the following statements print "Anne Lipton".
Print EmployeeNames.Item("Sales")
Print EmployeeNames.Item(1)
Print EmployeeNames("Sales")
Print EmployeeNames(1) Để lấy số phần tử trong Collection sử dụng phƣơng thức Count, nó trả về số phần
tử trong Collection. Ví dụ: 66 ' In ra phần tử cuối cùng của Retrieve EmployeeNames collection. Print EmployeeNames.Item(EmployeeNames.Count) 2.24.3. Xoá một giá trị trong Collection Phƣơng thức Remove đƣợc sử dụng để loại bỏ một phần tử ra khỏi Collection, phƣơng thức này chấp nhận cả chỉ số hoặc chuỗi mã khóa. Ví dụ: EmployeeNames.Remove "Marketing"
Sub RemoveAllItems(col As Collection) Do While col.Count col.Remove 1 Loop
End Sub Chú ý: Collection không cho phép gỡ bỏ tất cả các phần tử một lúc, vì vậy để gỡ bỏ tất cả các phần tử ta phải sử dụng phƣơng pháp lặp. 2.24.4. Thay đổi giá trị một phần tử trong Collection Để thay đổi giá trị của một phần tử trƣớc tiên ta phải xóa nó ra khỏi Collection
sau đó thêm một phần tử mới. Ví dụ:
Sub ReplaceItem(col As Collection, index As Variant, newValue As Variant) ' Loại bỏ phần tử. col.Remove index ' Sau đó thêm mới. If VarType(index) = vbString Then ' Thêm một phần tử mới với cùng chuỗi mã khóa. col.Add newValue, index Else ' Thêm một phần tử mới ở cùng một vị trí
„ (không có chuỗi mã khóa).
col.Add newValue, , index
End If
End Sub 2.25.1. Khai báo kiểu bản ghi 67 Bản ghi là kiểu dữ liệu cho phép chúng ta có thể khai báo nhiều loại thông tin với
các kiểu dữ liệu khác nhau trong một biến. Cú pháp khai báo kiểu bản ghi: Type . . . End Type Ví dụ:
Type HocSinh HoTen As String NgaySinh As Date
End Type 2.25.2. Khai báo biến bản ghi Sau khi khai báo kiểu bản ghi, ta sử dụng kiểu dữ liệu đó để khai báo biến, mảng bản ghi giống nhƣ khai báo các biến thông thƣờng khác. Cú pháp khai báo biến bản ghi: Public/Private/Dim Tên_biến As Tên_kiểu_bản_ghi Ví dụ:
Dim x As Hocsinh Public Ds( ) As Hocsinh 2.25.2. Sử dụng biến bản ghi Chúng ta có thể truy cập các thành phần (trƣờng) trong một biến bản ghi theo cú pháp: hoặc: With . End With Ví dụ: Dim Hs1, Hs2 As HocSinh
HS1. HoTen = “Nguyễn Văn Minh”
Hs1. NgaySinh = #5/5/1985#
With HS2 . HoTen = “Trần Thắng”
. NgaySinh = #9/8/1985# End With 68 Chúng ta cũng có thể gán hai biến bản ghi cùng kiểu cho nhau. Ví dụ:
HS2 = Hs1 Tệp tin là một dãy các byte đƣợc tổ chức lƣu trữ trên bộ nhớ ngoài. Khi ứng dụng truy cập đến tệp tin, nó xem các byte nhƣ là các kí tự, bản ghi, số nguyên, chuỗi v.v…Ta có thể gọi tệp tin là tệp 2.26.1. Phân loại tệp tin Dựa trên phƣơng pháp truy xuất tệp tin có thể phân tệp tin thành 3 loại: Tệp tin truy xuất tuần tự, tệp tin truy xuất ngẫu nhiên, tệp tin truy xuất nhị phân.
Tệp tin truy xuất tuần tự là tệp tin mà khi truy xuất ứng dụng sẽ truy xuất từ đầu tệp tin theo từng dòng văn bản. Tệp tin truy xuất ngẫu nhiên là tệp tin mà khi truy xuất ứng dụng có thể truy xuất tại bất kỳ vị trí nào trong tệp tin mà không phải truy xuất tuần tự từ đầu tệp tin theo từng khối dữ liệu có kích thƣớc cố định. Tệp tin truy xuất nhị phân là tệp tin mà khi truy xuất ứng dụng có thể truy xuất tại bất kỳ vị trí nào trong tệp tin mà không phải truy xuất tuần tự từ đầu tệp tin theo từng byte dữ liệu. Tệp tin truy nhập nhị phân là một trƣờng hợp riêng của tệp tin truy xuất ngẫu nhiên. Trƣớc khi truy xuất một tệp tin, ta cần khai báo một biến tệp tin có kiểu số nguyên, nó sẽ nhận một giá trị nguyên dƣơng mà windows cung cấp khi tệp tin đƣợc mở, dùng để nhận diện tệp tin và làm việc với tệp tin. Số nguyên dƣơng này đƣợc gọi là số hiệu tệp tin và không đƣợc trùng với số hiệu của một tệp tin đang đƣợc mở
khác. Khai báo biến tệp tin theo cú pháp: Public/Private/Dim Biến_tệp As Byte Ví dụ:
Dim f As Byte Ta có thể dùng hàm freefile để gán giá trị cho biến tệp tin tránh việc trùng số hiệu
tệp tin. f = freefile( ) 2.26.2. Thủ tục truy xuất tệp tin a) Mở tệp tin Đối với tệp tin truy xuất tuần tự Mở tệp tin để đọc: Open Tên_tệp For Input As #Biến_tệp 69 Mở tệp tin để ghi: Open Tên_tệp For Output As #Biến_tệp Mở tệp tin để ghi bổ sung vào cuối: Open Tên_tệp For Append As #Biến_tệp Đối với tệp tin truy xuất ngẫu nhiên Open Tên_tệp For Random As #Biến_tệp Len = Kích_thƣớc_khối Thông thƣờng mỗi khối dữ liệu là một bản ghi. Vì vậy, để xác định kích thƣớc khối dữ liệu mỗi lần đoc/ghi vào tệp ta dùng hàm Len(Biến_bản_ghi). Ví dụ: Open “ds.dat” For Random As #f Len = Len(x) ‟x là một biến kiểu bản ghi Đối với tệp tin truy xuất nhị phân Open Tên_tệp For Binary As #Biến_tệp b) Ghi dữ liệu vào tệp tin Đối với tệp tin truy xuất tuần tự Print #Biến_tệp, Nội dung cần ghi vào tệp Đối với tệp tin truy xuất ngẫu nhiên Put #Biến_tệp, vị trí bản ghi, biến bản ghi Đối với tệp tin truy xuất nhị phân Put #Biến_tệp, vị trí byte dữ liệu, biến c) Đọc dữ liệu từ tệp tin Đối với tệp tin truy xuất tuần tự Input(số ký tự cần đọc, biến tệp): Đọc một số ký tự tính từ vị trí hiện hành của con trỏ tệp và trả về các ký tự đọc đƣợc. Line Input #Biến_tệp, biến: Đọc một dòng văn bản và lƣu vào biến nhớ Đối với tệp tin truy xuất ngẫu nhiên Get #Biến_tệp, vị trí bản ghi, biến bản ghi : Đọc một bản ghi và lƣu vào biến nhớ. Đối với tệp tin truy xuất nhị phân Get #Biến_tệp, vị trí byte dữ liệu, biến_nhớ: Đọc số byte dữ liệu bằng kích thƣớc của biến_nhớ. d) Đóng tệp tin Close #Biến_tệp Ví dụ: Viết chƣơng trình mở tệp tin dsts.dat chứa danh sách thí sinh, trong đó thông tin về mỗi sinh viên gồm: Số báo danh, họ và tên, tuổi và điểm thi. Form Danh sách 70 thí sinh có dạng: Yêu cầu: Lập trình cho các nút lệnh để duyệt danh sách, bổ sung, sửa, xóa thông tin về thí sinh.
Bƣớc 1. Thiết kế form bằng cách đƣa vào các điều khiển: Label, TextBox, Commandbutton, sau đó xác lập vị trí, kích thƣớc cho các điều khiển cho phù hợp. Bƣớc 2. Thiết lập giá trị cho một số thuộc tính cho các điều khiển theo bảng: TT Điều khiển Thuộc tính Giá trị Ghi chú Name Form1 1 Form Caption Danh sách thí sinh Name cmdfirst 2 CommandButton Caption Về đầu Name cmdpre 3 CommandButton Caption Về trƣớc Name cmdadd 4 CommandButton Caption Thêm Name cmdedit 5 CommandButton Caption Sửa Name cmddel 6 CommandButton Caption Xóa Name cmdnext 7 CommandButton Caption Về sau Name cmdlast 8 CommandButton Caption Về cuối Name txtsbd 9 TextBox Name txtten 10 TextBox Name txttuoi 11 TextBox 71 Name txtdiem 12 TextBox 13 Label Caption Số báo danh 14 Label Caption Họ và tên 15 Label Caption Tuổi 16 Label Caption Điểm thi Bƣớc 3. Từ menu hệ thống chọn Project/Add Module để bổ sung vào Project hiện
hành Module1, sau đó gõ vào đó phần khai báo cấu trúc bản ghi thisinh nhƣ sau: Type thisinh sbd As String * 5 hoten As String * 30 tuoi As Byte
diem As Double End Type Bƣớc 4. Mở cửa sổ Code của Form1 và gõ vào các dòng lệnh sau: Dim n As Byte, i As Byte, f As Byte Dim x As thisinh
Private Sub ht(x As thisinh) txtsbd.Text = x.sbd txtten.Text = x.hoten txttuoi.Text = x.tuoi txtdiem.Text = x.diem End Sub „----------------------------------------------------------------------------------------- Private Sub nhap(ByRef x As thisinh) x.sbd = txtsbd.Text x.hoten = txtten.Text x.tuoi = Val(txttuoi.Text) x.diem = Val(txtdiem.Text)
End Sub
„-----------------------------------------------------------------------------------------
Private Sub cmdadd_Click()
If cmdadd.Caption = "Thªm" Then
txtsbd.Text = "" 72 txtten.Text = ""
txttuoi.Text = ""
txtdiem.Text = "": txtsbd.SetFocus
cmdadd.Caption = "L u" Else n = n + 1
Call nhap(x) i = n Put #f, i, x cmdadd.Caption = "Thªm"
End If End Sub „----------------------------------------------------------------------------------------- Private Sub cmddel_Click()
Dim g As Byte, j As Byte Dim traloi As Byte traloi = MsgBox("Ban muon xoa ban ghi nay", vbYesNo + vbQuestion, "Xóa dữ liệu") If traloi = 6 Then g = FreeFile() Open "tam.dat" For Random As #g Len = Len(x) For j = 1 To i - 1 Get #f, j, x
Put #g, j, x Next For j = i + 1 To n Get #f, j, x Put #g, j, x Next Close f Close g Kill "dsts.dat"
Name "tam.dat" As "dsts.dat"
n = n - 1
f = FreeFile()
Open "dsts.dat" For Random As #f Len = Len(x)
If n > 0 Then If i > n Then i = 1
Get #f, i, x Call ht(x) 73 End If End If End Sub
„----------------------------------------------------------------------------------------- Private Sub cmdlast_Click() If n > 0 Then i = n
Get #f, i, x Call ht(x) End If End Sub
„----------------------------------------------------------------------------------------- Private Sub cmdnext_Click() If (n > 0) And (i < n) Then i = i + 1 Get #f, i, x Call ht(x) End If End Sub „-----------------------------------------------------------------------------------------
Private Sub cmdpre_Click() If (n > 0) And (i > 1) Then i = i - 1 Get #f, i, x Call ht(x) End If End Sub „----------------------------------------------------------------------------------------- Private Sub cmdtop_Click()
If n > 0 Then
i = 1
Get #f, i, x
Call ht(x)
End If End Sub
„----------------------------------------------------------------------------------------- Private Sub cmdedit_Click() 74 If cmdedit.Caption = "Söa" Then cmdedit.Caption = "L u" txtsbd.SetFocus
Else Call nhap(x) Put #f, i, x cmdedit.Caption = "Söa"
End If End Sub „----------------------------------------------------------------------------------------- Private Sub Form_Load()
f = FreeFile() Open "dsts.dat" For Random As #f Len = Len(x) n = FileLen("dsts.dat") / Len(x) i = 1 If n > 0 Then Get #f, i, x Call ht(x) End If End Sub
„----------------------------------------------------------------------------------------- Private Sub Form_Unload(Cancel As Integer) Close f End Sub B5. Chạy chƣơng trình (F5). 1) Từ khoá nào trong các từ khoá sau có đƣợc sử dụng khi khai báo biến: a. Public
b. Private
c. Dim
d. Cả 3 từ khoá trên 2) Phép toán nào trong các phép toán sau dùng để lấy phần nguyên của phép chia hai
số nguyên: 75 a. /
b. \
c. div
d. mod 3) Hàm nào trong các hàm dƣới đây dùng để chuyển dữ liệu từ kiểu xâu thành kiểu số a. Val b. Str c. CByte d. Dec 4) Chọn cú pháp đúng cho vòng lặp For... a. For i:= 1 to n do Loop b. For i =1 to n step 2 Next c. Do Loop d. Cả 3 cú pháp trên 5) Chọn cách khai báo đúng cho một mảng động A có các phần tử kiểu byte a. Dim A[ ] as byte
b. Dim A( ) as byte c. Dim A[1..n,1..m] as byte d. Dim A(1..n,1..m) of byte 6) Chọn cách khai báo đúng cho một biến xâu ký tự s a. Public s as string b. Dim s as string*10 c. Dim s$ d. Cả 3 cách trên 7) Chọn đúng hàm để lấy kích thƣớc (byte) của một tệp tin truy nhập ngẫu nhiên a. Len
b. FileLen
c. LOF
d. Chr 8) Chọn cách viết đúng lời giải thích a. //Lời giải thích
b. „ Lời giải thích c. /*Lời giải thích*/ 76 d. {Lời giải thích} 9) Chọn đúng phép toán để lấy phần dƣ của phép chia hai số nguyên a. %
b. \ c. div d. mod 10) Chọn đúng hàm để kiểm tra dữ liệu của biến a. Val b. Str c. CByte d. VarType 11) Cho thủ tục sau: Private Sub Swap(ByRef so1 As Integer, so2 As Integer) Dim temp As Integer temp = so1: so1 = so2: so2 = temp End Sub Giả sử x = 3, y= 5. Cho biết giá trị của x sau lời gọi Call Swap(x, y) a. 3 b. 4 c. 5
d. 6 12) Chọn cách viết đúng để khai báo hằng số Pi a. Const Pi = 3.14 b. Const Pi 3.1415 c. Dim Pi = 3.14 d. Dim Pi 3.14 13) Chọn cách khai báo đúng cho biến x có dữ liệu kiểu byte a. Dim x as byte b. x : byte
c. byte x;
d. var x: byte 14) Chọn đúng phép toán để tính luỹ thừa a. %
b. \ c. d. ^ 15) Chọn đúng hàm để tính lnx, x≥0 77 a. Val b. Log c. CByte
d. VarType 16) Chọn đúng hàm để tính căn bậc hai của x, x≥ 0. a. sin(x) b. sqr(x)
c. abs(x) d. int(x) 17) Chọn đúng ký tự để ngăn cách các câu lệnh trên cùng một dòng a. :
b. ; c. _ d. & 18) Chọn đúng câu lệnh khai báo cho kết quả tƣơng tự câu lệnh khai báo Dim i% a. Dim i as single b. Dim i as integer c. Dim i as double d. Dim i as string 19) Trong một hàm của một module có câu lệnh khai báo: Dim x as byte.
Chọn đúng phạm vi sử dụng của biến x trong chƣơng trình a. chỉ trong module đó b. chỉ trong các module khác trong cùng project c. chỉ trong project chứa module đó d. chỉ trong hàm mà nó đƣợc khai báo 20) Chọn đúng hàm để lấy một xâu con gồm các ký tự ở bên phải của một xâu ký tự a. RTrim b.Right c. LTrim
d. Left 21) Chọn đúng hàm để ghi một bản ghi vào tệp tin truy nhập ngẫu nhiên a. Open
b. Print
c. Input d. Put
22) Chọn đúng hàm để lấy phần nguyên của một số thực x a. sin(x) 78 b. sqr(x) c. abs(x) d. int(x)
23) Chọn đúng ký tự để nối các dòng lệnh của một câu lệnh trên nhiều dòng a. : b. ; c. _
d. & 24) Chọn câu lệnh khai báo có kết quả tƣơng tự câu lệnh khai báo Dim i% a. Dim i as single b. Dim i as integer
c. Dim i as double d. Dim i as string 25) Trong phần General của một module có câu lệnh khai báo: Dim x As Double. Chọn đúng phạm vi sử dụng của biến x trong chƣơng trình a. chỉ trong module đó b. chỉ trong các module khác trong cùng project c. project chứa module đó d. chỉ trong hàm mà nó đƣợc khai báo Bài tập 1: Lập chƣơng trình nhập dãy số từ bàn phím, hiển thị dãy, tính và hiển thị giá trị lớn nhất, giá trị nhỏ nhất và giá trị trung bình của dãy theo mẫu. Bài tập 2: Lập chƣơng trình nhập từ bàn phím 2 ma trận vuông cùng cấp, tính tổng 79 hai ma trận và hiển thị kết quả theo mẫu : Bài tập 3: Lập trình tạo máy tính điện tử: Yêu cầu: - Ngƣời sử dụng dùng chuột để thao tác với chƣơng trình - Mỗi khi ngƣời sử dụng nhấn nút C thì chữ số hàng đơn vị sẽ bị xoá Bài tập 4: Thiết kế chƣơng trình cho phép nhập vào các hệ số a, b của phƣơng trình
bậc 1 dạng: ax+b=0; sau đó giải phƣơng trình này. Giao diện chƣơng trình có thể nhƣ sau: Bài tập 5: Thiết kế chƣơng trình cho phép nhập vào các hệ số a, b, c của phƣơng
trình bậc 2 dạng: ax2 + bx + c = 0; sau đó giải phƣơng trình này.
Bài tập 6: Thiết kế chƣơng trình cho phép nhập vào một ký tự, sau đó kiểm tra xem 80 ký tự đó thuộc tập hợp nào trong các tập ký tự sau: - Các ký tự chữ hoa: 'A' ...'Z' - Các ký tự chữ thƣờng: 'a' ... 'z'
- Các ký tự chữ số : '0' ... '9' - Các ký tự khác. Bài tập 7: Thiết kế chƣơng trình cho phép tính N! (N! = 1*2*3*…*N). Giao diện đề nghị: Bài tập 8: Thiết kế chƣơng trình cho phép nhập vào một số nguyên N; sau đó tính các tổng sau: a. S=1 + 2 + ... + n b. S=1/2 + 2/3 + ... +n/(n+1) c. S= - 1 +2 - 3 +4 - ... + (-1)nn Bài tập 9: Thiết kế chƣơng trình cho phép nhập vào một số nguyên N; sau đó phân 81 tích số nguyên này ra thừa số nguyên tố. Giao diện chƣơng trình có thể nhƣ sau: dụng trên windows, chúng là các thành phần tạo lên giao diện ngƣời sử dụng. Các điều khiển thông dụng là các điều khiển đƣợc Visual Basic cung cấp sẵn trong hộp
công cụ. Trong chƣơng 2 chúng ta đã làm quen với các điều khiển: Label, TextBox, CommandButton. Trong chƣơng 3 này chúng ta tiếp tục tìm hiểu các điều khiển thông dụng khác. Điều khiển Frame- khung có biểu tƣợng là
trong hộp công cụ. Điều khiển
khung dùng để gộp nhóm các điều khiển khác. Trong hầu hết trƣờng hợp, ta sử dụng điều khiển này rất đơn giản, chỉ để nhóm các điều khiển và không cần đáp ứng các sự kiện của nó, ta thƣờng chỉ cần xác lập các thuộc tính: Top, Left, Height, Width, Font, Caption và Name cho nó. Điều khiển Shape có biểu tƣợng là trong hộp công cụ. Điều khiển Shape cho phép vẽ, tô màu cho các dạng hình học đơn giản nhƣ hình vuông, hình chữ nhật, hình tròn, ...Một số thuộc tính đáng quan tâm của điều khiển Shape: Thuộc tính Giải thích BorderStyle Xácđịnh kiểu đƣờng biên: Nét liền, nét đứt,.. FillColor Xác định màu tô FillStyle Xác định kiểu tô: Tô đặc, gạch chéo,... Shape Xác định loại hình cần vẽ: Hình chữ nhật, hình tròn,.. Điều khiển Shape có biểu tƣợng là
trong hộp công cụ. Bên cạnh điều khiển
Shape dung để vẽ các hình đơn giản, Visual Basic còn cung cấp điều khiển Line
dung để vẽ các đoạn thẳng. Một số thuộc tính của điều khiển Line: Thuộc tính Giải thích BorderColor Xác định màu của đƣờng BorderStyle Xác định kiểu của đƣờng: Nét liền, nét đứt,.. 82 BorderWidth Xác định độ dầy nét vẽ DrawMode Xác định chế độ vẽ X1, Y1 Xác định toạ độ điểm đầu X2, Y2 Xác định toạ độ điểm cuối . CheckBox là điều
Điều khiển CheckBox có biểu tƣợng trong hộp công cụ là
khiển cho phép chọn hay không chọn nhiều lựa chọn. Một số thuộc tính hay dùng của điều khiển CheckBox: Thuộc tính Giải thích Name Dùng để đặt tên cho điều khiển Alignment Quy định vị trí của hộp lựa chọn 0: hộp chọn nằm ở bên trái tiêu đề
1: hộp chọn nằm ở bên phải tiêu đề Appearance Quy định cách thể hiện của CheckBox: 0: Flat - bình thƣờng
1: 3D - 3 chiều Caption Xác định tiêu đề (nội dung lựa chọn) hiển thị trên điều khiển Font Quy định kiểu chữ của phần văn bản thể hiện nội dung lựa chọn Visible Quy định điều khiển có thể đƣợc hiển thi hay không, Visible nhận giá trị True đƣợc hiển thị, giá trị False thì không đƣợc hiển thị Value Xác định lựa chọn có đƣợc chọn hay không. Nó có thể nhận một trong các giá trị: 0-Unchecked: không đƣợc chọn 1-Checked: đƣợc chọn 2-Grayed: không thể chọn/bỏ chọn Điều khiển OptionButton có biểu tƣợng trong hộp công cụ là
. Các điều khiển
OptionButton thƣờng đƣợc nhóm thành một nhóm, điều này bởi vì trong một nhóm
chỉ có duy nhất một OptionButton đƣợc chọn. Khi một OptionButton đƣợc chọn thì
các OptionButton còn lại trong nhóm sẽ không đƣợc chọn. Nhóm này thƣờng đƣợc
bao bởi một khung Frame. Giá trị trả về của một OptionButton đƣợc lấy thông qua thuộc tính Value của nó. Nếu OptionButton đƣợc chọn thì thuộc tính Value của nó
sẽ có giá trị là True. Ngƣợc lại nếu OptionButton không đƣợc chọn thì thuộc tính
Value sẽ có giá trị là False. Một số thuộc tính hay dùng khác của điều khiển 83 OptionButton tƣơng tự nhƣ điều khiển CheckBox. Ví dụ:
Tạo form theo mẫu và thiết lập giá trị một số thuộc tính cho các điều khiển trên
form: Thuộc TT Điều khiển Giá trị Ghi chú tính Name Form1 1 Form Caption Draw Name Frame1 2 Frame Caption Shape Name Frame2 3 Frame Caption Color Sau khi đƣa điều khiển Name optshape vào form, thiết lập Caption - Rectangle thuộc tính name xong, - Square 4 RadioButton - Oval thì copy điều khiển để
tạo thành mảng gồm 6 - Circle điều khiển - Rounded Rectangle - Rounded Square Name chkred 5 CheckBox Caption Red Name chkgreen 6 CheckBox Caption Green Name chkblue 7 CheckBox Caption Blue Name Shape1 8 Shape FillStyle 0-Solid 84 Đƣa các dòng lệnh sau vào cửa sổ Code của form 1. Dim r As Integer, g As Integer, b As Integer Private Sub chkblue_Click() If chkblue.Value = 1 Then b = 255 Else b = 0 End If Shape1.FillColor = RGB(r, g, b) End Sub „-------------------------------------------------------------------------- Private Sub chkgreen_Click() If chkgreen.Value = 1 Then g = 255 Else g = 0 End If Shape1.FillColor = RGB(r, g, b) End Sub „-------------------------------------------------------------------------- Private Sub chkred_Click() If chkred.Value = 1 Then r = 255 Else r = 0 End If Shape1.FillColor = RGB(r, g, b) End Sub „-------------------------------------------------------------------------- Private Sub optshape_Click(Index As Integer) Shape1.Shape = Index End Sub 85 Hộp danh sách (ListBox) đƣợc sử dụng để liệt kê một danh sách, trong danh sách
này ngƣời sử dụng có thể chọn một hoặc nhiều hơn một phần tử. Mặc định các lựa chọn đƣợc thể hiện trên một cột mặc dù vậy ta có thể thiết lập để hiển thị theo nhiều cột. Nếu số phần tử trong danh sách nhiều hơn khả năng mà hộp danh sách có thể
hiển thị thì thanh cuộn sẽ tự động xuất hiện. Một số thuộc tính thông dụng của điều khiển ListBox: Thuộc tính Giải thích Name Dùng để đặt tên cho điều khiển ListCount Trả về số phần tử có trong ListBox Sorted Quy định các phần tử trong ListBox có đƣợc sắp xếp theo thứ tự ABC hay không (True- sắp xếp; False- không sắp xếp) Text Trả về chuỗi ký tự tƣơng ứng với phần tử đƣợc chọn trong ListBox MultiSelect 0- Cho phép ngƣời sử dụng chọn một phần tử
1- Cho phép ngƣời sử dụng có thể chọn nhiều phần tử bằng cách lần lƣợt nhấn chuột vào từng phần tử 2- Cho phép ngƣời sử dụng có thể chọn nhiều phần tử bằng
cách chọn một phần tử, giữ phím Shift và chọn một phần tử khác. Columns Xác định số cột hiển thị danh sách phần tử. Ví dụ Columns = 2 nghĩa là danh sách phần tử đƣợc hiển thị bằng 2 cột. List Là biến mảng chứa danh sách các phần tử của ListBox, mỗi phần tử đƣợc truy nhập thông qua chỉ số phần tử ListIndex Trả về chỉ số của phần tử đƣợc chọn trong ListBox 3.6.1. Thêm các phần tử vào trong hộp danh sách. Để thêm các phần tử vào trong hộp danh sách ta sử dụng phƣơng thức AddItem với cú pháp nhƣ sau: ListBoxName.AddItem item [, index] Trong đó:
ListBoxName: là tên của hộp danh sách.
item: là một xâu ký tự thể hiện phần tử cần thêm vào danh sách.
index: xác định vị trí nơi mà phần tử mới đƣợc thêm vào trong danh sách, index có
giá trị bằng 0 biểu diễn cho vị trí đầu tiên trong danh sách. Nếu bỏ qua tham số
index thì phần tử sẽ đƣợc thêm vào cuối danh sách. Ví dụ:
Private Sub Form_Load () List1.AddItem "Khoa CNTT" 86 List1.AddItem "Khoa Cơ khí" List1.AddItem "Khoa Điện-điện tử" List1.AddItem "Khoa Sƣ phạm"
End Sub Khi Form đƣợc tải lên màn hình khi thi hành chƣơng trình ta đƣợc một danh sách xuất hiện nhƣ hình sau: Khoa CNTT Khoa Cơ khí Khoa Điện- điện tử Khoa Sƣ phạm Ta có thể nhập các phần tử tại thời điểm thiết kế bằng cách thiết lập thuộc tính List trong cửa sổ Properties của điều khiển ListBox, mỗi phần tử trên một dòng, để xuống dòng khi nhập phần tử ta nhấn tổ hợp phím Ctrl+Enter. Hình 3.1. Nhập các giá trị cho thuộc tính List của ListBox 3.6.2. Xoá các phần tử trong danh sách. 87 Ta có thể sử dụng phƣơng thức RemoveItem để xoá các phần tử khỏi danh sách.
Để xoá tất cả các phần tử trong danh sách ta sử dụng phƣơng thức Clear Ví dụ: Lập chƣơng trình sử dụng 2 điều khiển ListBox và 4 điều khiển Commandbutton thiết kế form bán hàng theo mẫu: Bƣớc 1. Thiết kế form: Đƣa các điều khiển lên form, xác lập vị trí, kích thƣớc các điều khiển cho phù hợp. Bƣớc 2. Thiết lập giá trị cho một số thuộc tính của các điều khiển theo bảng: Thuộc TT Điều khiển Giá trị Ghi chú tính Name Form1 1 Form Caption Công ty máy tính VNAPC 2 ListBox Name LstKH Name LstCT Chọn thuộc tính List List CPU trong cửa sổ thuộc tính,
nhập mỗi phần tử trên Mainboard 3 ListBox một dòng, nhấn CD-ROM Ctrl+Enter để xuống dòng. RAM Name cmdadd 4 Commandbutton Caption -> Name cmdreturn 5 Commandbutton Caption <- Name cmdaddall 6 Commandbutton Caption ->> Name cmdreturnall 7 Commandbutton Caption <<- Bƣớc 3. Mở cửa sổ Code của Form1 và gõ vào các dòng lệnh: 88 Private Sub cmdadd_Click() If (LstCT.ListCount > 0) And (LstCT.Text <> "") Then LstKH.AddItem LstCT.Text End If End Sub „----------------------------------------------------------------------------------- Private Sub cmdreturnall_Click()
LstKH.Clear End Sub „-------------------------------------------------------------------------------- Private Sub cmdaddall_Click() LstKH.Clear For i = 0 To LstCT.ListCount - 1 LstKH.AddItem LstCT.List(i) Next End Sub „----------------------------------------------------------------------------------- Private Sub cmdreturn_Click() If (LstKH.ListCount > 0) And (LstKH.Text <> "") Then LstKH.RemoveItem LstKH.ListIndex End If End Sub Bƣớc 4. Chạy chƣơng trình (F5). Điều khiển thanh cuộn ngang HScrollBar có biểu tƣợng trong hộp công cụ là , và thanh cuộn dọc VScrollBar có biểu tƣợng là . Các thanh cuộn cho phép
ta dễ dàng duyệt qua một danh sách dài gồm nhiều phần tử hoặc một lƣợng thông tin lớn bằng cách kích vào các mũi tên cuộn lên và xuống ở cuối thanh cuộn, hoặc bằng
cách di chuyển hộp cuộn (một nút nhỏ ở giữa các mũi tên cuộn) của thanh cuộn.
Điều khiển thanh cuộn có một số thuộc tính quan trọng sau: Thuộc tính Giải thích Min Giá trị nhỏ nhất của điều khiển khi hộp cuộn nằm ở trên đỉnh hoặc mép bên trái của thanh cuộn tƣơng ứng. Giá trị ngầm định là 0. Max 89 Giá trị lớn nhất của điều khiển khi hộp cuộn nằm ở dƣới đáy hoặc
mép bên phải của thanh cuộn tƣơng ứng. Giá trị ngầm định là
32767. Value Là một số nguyên tƣơng ứng với vị trí của hộp cuộn trong thanh cuộn. LargeChange Lƣợng thay đổi giá trị của thuộc tính Value khi ngƣời sử dụng kích chuột trên thanh cuộn. SmallChange Lƣợng thay đổi giá trị của thuộc tính Value khi ngƣời sử dụng kích vào các mũi tên cuộn. Điều khiển thanh cuộn sử dụng sự kiện Scroll và Change để theo dõi sự dịch chuyển của hộp cuộn trên thanh cuộn Sự kiện Giải thích Change Xảy ra sau khi hộp cuộn dịch chuyển Scroll Xảy ra khi hộp cuộn dịch chuyển. Không xảy ra khi mũi tên cuộn hoặc thanh cuộn đƣợc kích. 3.8.1. Điều khiển ảnh Image Điều khiển ảnh Image có biểu tƣợng trong hộp công cụ là . Điều khiển này dùng để hiển thị ảnh lên Form. Một số thuộc tính hay dùng của điều khiển Image: Thuộc tính Giải thích Name Dùng để đặt tên cho điều khiển Image Picture Dùng để thiết lập file ảnh bạn muốn hiển thị trên điều khiển BorderStyle Quy định kiểu khung: 0 – None: không có khung 1 – Fixed Single: có khung Stretch Quy định hình ảnh có tự co/giãn cho vừa với khung ảnh hay không. Nếu nhận giá trị True: hình ảnh tự co giãn sao cho vừa vặn trong đối tƣợng, nếu nhận giá trị False: hình ảnh không co giãn 3.8.2. Điều khiển hộp hình Điều khiển hộp hình PictureBox có biểu tƣợng trong hộp công cụ là
. Điều
khiển hộp hình đƣợc sử dụng để hiển thị đồ hoạ, làm đối tƣợng chứa các đối tƣợng
khác, và hiển thị đầu ra của các phƣơng thức đồ hoạ cũng nhƣ văn bản của phƣơng 90 thức Print.
Điều khiển hộp hình cũng tƣơng tự nhƣ điều khiển ảnh Image, chúng đều đƣợc sử
dụng để hiển thị hình ảnh và cùng hỗ trợ các định dạng ảnh nhƣ nhau. Tuy nhiên, điều khiển hộp hình có nhiều chức năng mà điều khiển ảnh không có ví dụ nhƣ chức năng làm đối tƣợng chứa cho các đối tƣợng khác và hỗ trợ các phƣơng thức đồ hoạ.
Điều khiển hộp hình có thể hiển thị các file ảnh có định dạng nhƣ BMP, WMF, GIF, JPEG, ICO. Khi điều khiển hộp hình đã đƣợc đặt lên Form ta có thể nạp hình ảnh vào nó lúc thiết kế bằng cách chọn thuộc tính Picture từ cửa sổ Properties của điều khiển hoặc
khi thi hành ứng dụng bằng cách sử dụng thuộc tính Picture và hàm LoadPicture. Ví dụ: Picture1.Picture = LoadPicture("c:\windows\setup.bmp") Để xoá hình ảnh khỏi điều khiển ta có thể sử dụng một trong hai lệnh sau:
Picture1.Picture = LoadPicture Hoặc Set Picture1.Picture = Nothing Ngầm định hình ảnh đƣợc nạp vào hộp hình với kích thƣớc nguyên bản của chúng, điều đó có nghĩa là nếu hình ảnh có kích thƣớc lớn hơn kích thƣớc của điều khiển thì hình ảnh sẽ bị cắt bớt đi ta chỉ nhìn thấy đƣợc một phần của nó và điều khiển không tạo ra các thanh cuộn. Để điều khiển tự động thay đổi kích thƣớc sao cho vừa với kích thƣớc của bức ảnh ta thiết lập giá trị True cho thuộc tính AutoSize. Giống nhƣ Form, điều khiển hộp hình có thể đƣợc sử dụng để nhận đầu ra của các
phƣơng thức đồ hoạ nhƣ Circle, Line, và Point v.v…Ví dụ ta có thể dùng phƣơng thức Circle để vẽ một vòng tròn trong hộp hình nhƣ sau: Private Sub Form_Click() Picture1.AutoRedraw = True Picture1.Circle (1200, 1000), 750 End Sub 91 Chạy chƣơng trình và nhấp chuột vào Form, chúng ta sẽ thấy nhƣ hình dƣới đây: Để đầu ra của các phƣơng thức đƣợc vẽ vào điều khiển và tự động vẽ lại khi điều khiển thay đổi kích thƣớc hoặc hiển thị lại khi bị một đối tƣợng khác che khuất ta
thiết lập giá trị True cho thuộc tính AutoRedraw. Ta cũng có thể đƣa văn bản ra điều khiển hộp hình bằng cách sử dụng phƣơng thức Print và thiết lập giá trị True cho thuộc tính AutoRedraw. Ví dụ: Picture1.Print "Trƣờng Đại học SPKT Nam Định" Khi sử dụng phƣơng thức Print ta cũng có thể thay đổi kiểu font, cỡ chữ hoặc sử dụng các thuộc tính CurrentX, CurrentY, Height, và Width để căn lề cho văn bản trong hộp hình. DriveListBox là một điều khiển có dạng giống một ComboBox và nội dung của DriveListBox là các kí tự ổ đĩa và nhãn của nó. DirListBox là một danh sách đặc biệt hiển thị cây thƣ mục. Điều khiển FileListBox là một điều khiển hộp danh sách với mục đích là hiển thị tất cả các tệp tin trong thƣ mục đã cho, chọn lọc chúng theo tên, phần mở rộng và thuộc tính. Các điều khiển này thƣờng đƣợc thiết kế trên cùng một Form, khi ngƣời sử dụng chọn một ổ đĩa trong DriveListBox thì điều khiển DirListBox đƣợc cập nhật để hiển thị cây thƣ mục của ổ đĩa đó, khi ngƣời sử dụng chọn một thƣ mục (đƣờng dẫn) trong điều khiển DirListBox điều khiển FileListBox sẽ hiển thị các tệp tin của thƣ mục đó. Tuy nhiên, các thao tác này không thực hiện một cách tự động mà ta phải viết mã để thực hiện chúng. Ta có thể sử dụng một số thuộc tính sau của các điều khiển: Drive: Là thuộc tính của điều khiển DriveListBox, nó trả về tên ổ đĩa đƣợc chọn
trong điều khiển DriveListBox lúc chƣơng trình đang chạy. Path: Là thuộc tính của điều khiển DirListBox, nó dùng để thiết lập hoặc trả về đƣờng dẫn đến thƣ mục đƣợc chọn trong DirListBox. Path cũng là một thuộc tính
của FileListBox, nó dùng để thiết lập hoặc trả về đƣờng dẫn đến thƣ mục chứa tệp
tin đƣợc chọn trong FileListBox.
Pattern: Là thuộc tính của FileListBox dùng để lọc loại tệp tin sẽ đƣợc hiển thị
trong FileListBox.
Filename: Là thuộc tính của FileListBox, nó trả về tên tệp tin đƣợc chọn trong 92 FileListBox.
Ví dụ: Dùng các điều khiển DriveListBox, DirListBox, FileListBox và điều khiển
Image để lập chƣơng trình hiển thị file ảnh định dạng *.jpg và *.gif, theo form mẫu
sau: Bƣớc 1. Thiết kế form: đƣa các điều khiển lên form, xác lập vị trí, kích thƣớc cho các điều khiển cho phù hợp.
Bƣớc 2. Thiết lập giá trị một số thuộc tính cho các điều khiển theo bảng: Thuộc TT Điều khiển Giá trị Ghi chú tính Name Form1 1 Form Caption Xem ảnh Name O_dia 2 DriveListBox Name Thu_muc 3 DirListBox Name Tep 4 FileListBox Name Hinh 5 Image Bƣớc 3. Mở cửa sổ Code của Form1 và gõ vào các dòng lệnh: Private Sub O_dia_Change() Thu_muc.Path = Left(O_dia.Drive, 1) & ":\" End Sub „--------------------------------------------------------------------------- Private Sub Thu_muc_Change() Tep.Path = Thu_muc.Path Tep.Pattern = "*.jpg;*.gif" End Sub „--------------------------------------------------------------------------- Private Sub Tep_Click() FileName = Tep.Path If Right$(FileName, 1) <> "\" Then FileName = FileName & "\" FileName = FileName & Tep.FileName 93 Hinh.Picture = LoadPicture(FileName) End Sub Bƣớc 4. Chạy chƣơng trình (F5). Điều khiển Timer có biểu tƣợng trong hộp công cụ là
. Điều khiển Timer cho
phép ta theo dõi thời gian. Điều khiển Timer nhƣ một chiếc đồng hồ kích hoạt một sự kiện của chƣơng trình sau các khoảng thời gian đều đặn mà ta chỉ ra. Sự kiện khi Timer kích hoạt đƣợc gọi là sự kiện Timer, ta có thể viết mã trong sự kiện này để thực hiện một công việc nào đó.
Điều khiển Timer có hai thuộc tính quan trọng đó là Interval và Enabled. Thuộc tính Interval là khoảng thời gian đƣợc tính bằng mili giây giữa hai sự kiện Timer. Giá trị của Interval có thể từ 0 đến 64.767 nghĩa là khoảng thời gian dài nhất giữa
hai sự kiện Timer không lâu hơn 64.8 giây. Khi mới đƣợc đặt lên form thì thuộc tính Interval có giá trị bằng 0, ta có thể gán cho nó một giá trị phù hợp tại cửa sổ Properties hoặc trong thủ tục Form_Load của chƣơng trình nhƣ sau: Private Sub Form_Load() Timer1.Interval = 1000 'Một giây sự kiện Timer đƣợc thực hiện một lần. End Sub Thuộc tính Enabled cho phép ta khởi động hoặc dừng sự hoạt động của Timer. Ví dụ:
Sử dụng các điều khiển: Timer, Line, Shape viết chƣơng trình mô tả đèn giao 94 thông tại ngã tƣ, nhƣ hình sau: Bƣớc 1. Thiết kế form: Đƣa các điều khiển Line, Shape lên form để vẽ ngã tƣ, hộp đèn và 2 bộ 3 đèn ở hai góc ngã tƣ là đèn xanh, vàng, đỏ.
Bƣớc 2. Gán thuộc name của các điều khiển Shape dùng để vẽ 2 bộ 3 đèn là: Xanh1, Vang1, Do1 và Xanh2, Vang2, Do2; thuộc tính FillStyle của các điều khiển này là 0-Solid Bƣớc 3. Mở cửa sổ lệnh (Code) và gõ vào các dòng lệnh sau:
Dim t As Byte, d As Boolean Private Sub Form_Load() t = 0 d = True
Timer1.Interval = 10000 End Sub „--------------------------------------------------------------------------- Private Sub Timer1_Timer() If t = 0 Then xanh1.FillStyle = 0 do2.FillStyle = 0 xanh2.FillStyle = 1 do1.FillStyle = 1
vang1.FillStyle = 1 vang2.FillStyle = 1 t = 2 Timer1.Interval = 10000 Else If t = 2 Then xanh1.FillStyle = 1 do2.FillStyle = 0 xanh2.FillStyle = 1
do1.FillStyle = 1
vang1.FillStyle = 0
vang2.FillStyle = 1
t = 4
Timer1.Interval = 1000 Else
If t = 4 Then xanh1.FillStyle = 1 95 do2.FillStyle = 1 xanh2.FillStyle = 0 do1.FillStyle = 0
vang1.FillStyle = 1 vang2.FillStyle = 1 t = 6 Timer1.Interval = 10000
Else xanh1.FillStyle = 1 do2.FillStyle = 1 xanh2.FillStyle = 1
do1.FillStyle = 0 vang1.FillStyle = 1 vang2.FillStyle = 0 t = 0 Timer1.Interval = 1000 End If End If End If End Sub Một số sự kiện xảy ra do những tác động của ngƣời sử dụng đối với chuột. Những sự kiện đó là: Sự kiện Giải thích MouseDown Xảy ra khi ngƣời sử dụng nhấn một nút chuột bất kỳ. MouseUp Xảy ra khi ngƣời sử dụng thả một nút chuột bất kỳ. MouseMove Xảy ra khi con trỏ chuột di chuyển đến một điểm mới trên mà hình Các Tham số truyền vào các sự kiện gồm: Tham số Giải thích Button Cho biết nút chuột nào đƣợc nhấn Shift Cho biết phím SHIFT, CTRL hay ALT đƣợc nhấn X,Y Vị trí con trỏ chuột, với hệ toạ độ của đối tƣợng bắt sự kiện. Ta có thể dùng thuộc tính MousePointer và MouseIcon để hiện thị một biểu tƣợng 96 con trỏ màn hình hay con trỏ chuột. Thuộc tính MousePointer cho phép chọn một trong mƣời sáu kiểu con trỏ. Giá trị mặc định của thuộc tính MousePointer là 0- Default và hiển thị theo kiểu Windows quy định. Hằng Diễn giải Giá trị 0 ccDefault (Default) Shape determined by the object. 1 ccArrow Arrow. 2 ccCross Cross (cross-hair pointer). 3 ccIbeam I Beam. 4 ccIcon Icon (small square within a square). 5 ccSize Size (four-pointed arrow pointing north, south,
east, and west). 6 ccSizeNESW Size NE SW (double arrow pointing northeast and southwest). 7 ccSizeNS Size N S (double arrow pointing north and south). 8 ccSizeNWSE Size NW, SE. 9 Size E W (double arrow pointing east and west). ccSizeEW ccUpArrow 10 Up Arrow. ccHourglass 11 Hourglass (wait). ccNoDrop 12 No Drop. ccArrowHourglass 13 Arrow and hourglass. ccArrowQuestion 14 Arrow and question mark. ccSizeAll 15 Size all. Sự kiện chuột và bàn phím có vai trò chủ yếu trong hoạt động tƣơng tác giữa ngƣời sử dụng và chƣơng trình. Ta có thể kiểm soát phím nhấn theo 2 mức: điều
khiển hoặc biểu mẫu. Mức điều khiển cho phép lập trình với điều khiển, mức biểu
mẫu cho phép ta lập trình với ứng dụng. Sự kiện bàn phím Xảy ra KeyPress Khi một phím có mã ASCII đƣợc nhấn KeyDown Khi một phím bất kỳ đƣợc nhấn KeyUp Khi một phím bất kỳ đƣợc thả. 97 Chỉ có điều khiển đang focus mới bắt sự kiện bàn phím. Đối với biểu mẫu, nó chỉ
bắt đƣợc khi nó đƣợc kích hoạt và mọi điều khiển trên biểu mẫu đều không có focus. Điều này chỉ xảy ra với biểu mẫu trống hoặc biểu mẫu có điều khiển bị cấm. Tuy nhiên, nếu quy định thuộc tính KeyPreview của biểu mẫu thành True, biểu mẫu sẽ
nhận mọi sự kiện bàn phím của mọi điều khiển trên nó trƣớc khi các điều khiển này nhận đƣợc. Cách này hữu dụng khi ta muốn thi hành cùng một hoạt động khi một phím bất kỳ đƣợc nhấn, bất kể điều khiển nào đang forcus. KeyDown và KeyUp có thể phát hiện những tình huống mà KeyPress không thể
phát hiện: - Tổ hợp phím SHIFT, CTRL và ALT - Phím định hƣớng (← → ↑ ↓) lƣu ý rằng một số điều khiển (nút lệnh, nút tuỳ chọn, và hộp đánh dấu) không bắt sự kiện phím định hƣớng. Thay vào đó, các phím này
gây ra sự dịch chuyển của một điều khiển khác. - PageUp và PageDown - Phân biệt đƣợc phím số ở bàn phím phải với phím số ở bàn phím trái - Đáp ứng khi thả phím - Phím chức năng không trùng với menu. Sự kiện bàn phím không loại trừ nhau. Khi ngƣời sử dụng nhấn một phím, cả KeyDown và KeyPress cùng phát. Khi ngƣời sử dụng nhấn một trong những phím mà KeyPress không phát hiện đƣợc, chỉ có KeyDown và xảy ra, đó là KeyUp. Trƣớc khi dùng KeyUp, KeyDown phải đảm bảo rằng KeyPress không làm đƣợc.
Sự kiện này phát hiện các phím có mã ASCII chuẩn: Chữ cái, chữ số, dấu ngắt câu, Enter, Tab và Backspace. Nói chung, viết chƣơng trình cho sự kiện KeyPress thì dễ hơn. 1) Chọn đúng nút lệnh đƣợc ngƣời sử dụng nhấn biết hàm Msgbox trả về giá trị 6 b. Cancel a. Ok c. Retry d. Yes 2) Chọn đúng điều khiển để hiển thị một danh sách thƣ mục lƣu trên máy a. DirListBox
b. DriveListBox
c. FileListBox
d. ComboBox 3) Chọn đúng thuộc tính để lấy tên tập tin đƣợc chọn trong điều khiển FileListBox khi chạy chƣơng trình 98 a. Path
b. FileName
c. Drive d. Pattern 4) Chọn đúng sự kiện xảy ra khi ngƣời sử dụng sửa đổi chuỗi ký tự trong
ComboBox hoặc trong TextBox a. Click b. Change c. Keypress
d. Cả 3 sự kiện trên 5) Chọn đúng thuộc tính để thiết lập tiêu đề cho form a. Appearence b. Caption
c. BorderStyle d. Backcolor 6) Chọn đúng thuộc tính để qui định TextBox có nhìn thấy hay không khi chạy chƣơng trình a. Visible b. Text c. Multiline d. Enable 7) Chọn đúng thuộc tính để lấy số phần tử trong Listbox a. ListCount b. ListIndex c. Text d. List 8) Chọn đúng thuộc tính để lấy nội dung văn bản trong TextBox a. Alignment b. Seltext c. Multiline d. Text 9) Chọn đúng sự kiện xảy ra khi ngƣời sử dụng nhấn phím bất kỳ trên bàn phím khi
chƣơng trình đang thực hiện a. Change
b. Click
c. KeyDown d. Keypress 10) Chọn đúng thuộc tính để qui định văn bản trong TextBox có thể hiển thị trên nhiều dòng 99 a. Alignment b. Name c. Multiline
d. Forecolor 11) Thuộc tính nào dùng để qui định vị trí cho các điều khiển a. Top, Width b. Height, Left
c. Width, Height d. Top, Left 12) Chọn đúng sự kiện xảy ra khi ngƣời sử dụng kích đúp chuột khi đối tƣợng đang trong tầm ngắm
a. Change b. Click c. DblClick d. Keypress 13) Chọn đúng phƣơng thức để xoá tất cả các phần tử khỏi ListBox lúc chạy chƣơng trình a. Add b. Remove c. Clear
d. RemoveItem 14) Chọn đúng thuộc tính để lấy giá trị tƣơng ứng với vị trí của thanh cuốn ngang - HScrollBar a. SmallChange b. LargeChange c. Max d. Value 15) Chọn đúng thuộc tính qui định hình ảnh trong điều khiển Image tự co giãn để vừa với kích thƣớc của điều a. Stretch
b. AutoSize
c. Picture
d. BorderStyle 100 Bài tập 1: Lập chƣơng trình tạo form và viết mã cho các nút lệnh dùng để sao chép,
cắt, dán các đoạn văn bản đƣợc chọn giữa hai khối văn bản đƣợc gõ vào 2 Textbox
nhƣ sau: Bài tập 2: Lập chƣơng trình sử dụng các điều khiển thông dụng để vẽ hình theo các
tuỳ chọn và tô màu cho hình theo mẫu. Bài tập 3: Lập chƣơng trình sử dụng các điều khiển thông dụng cho phép thực hiện 2 phép toán tìm ƣớc số chung lớn nhất và bội số chung nhỏ nhất của hai số nguyên
dƣơng theo form mẫu: 101 Bài tập 4: Lập trình chọn file ảnh từ hộp thoại Open, hiển thị ảnh dùng điều khiển
Picture. Thiết lập thuộc tính để hình ảnh tự co giãn cho vừa với kích thƣớc của điều
khiển Picture. Bài tập 5: Lập chƣơng trình sử dụng các điều khiển : Listbox, Commandbutton,
Label thiết kế fỏm và viết mã cho các nút lệnh để bổ sung và loại bỏ các phần tử giữa hai danh sách theo mẫu : 102 Bài tập 6: Lập trình vẽ hình, phối màu và tô màu cho hình theo mẫu : Điều khiển hộp thoại thông dụng (Common Dialog) cung cấp một tập các hộp
thoại chuẩn cho các thao tác nhƣ mở và lƣu trữ tệp tin, thiết lập các tuỳ chọn in, lựa chọn font chữ, màu. Điều khiển hộp thoại thông dụng cho phép ta hiển thị 6 loại hộp thoại thông dụng đó là: Open, Save As, Color, Font, Print, Help. Điều khiển hộp thoại thông dụng không phải điều khiển nội tại trong hộp công cụ. Muốn đƣa điều khiển hộp thoại thông dụng ra hộp công cụ, ta thực hiện các thao tác: Từ thực đơn
Project ta chọn Components, xuất hiện hộp thoại Components, trong tab Control của hộp thoại ta tích vào mục Microsoft Common Dialog Control, sau đó kích OK. Muốn hiển thị hộp thoại thông dụng nào, ta đƣa điều khiển hộp thoại thông dụng lên Form, sau đó thiết lập các thuộc tính và gọi phƣơng thức hiển thị hộp thoại phù hợp. Các phƣơng thức tƣơng ứng để hiển thị các hộp thoại thông dụng: Phƣơng thức Hiển thị hộp thoại ShowOpen
ShowSave
ShowColor
ShowFont
ShowPrinter
ShowHelp Open
Save As
Color
Font
Print
Help 4.1.1. Open Dialog, Save Dialog Hộp thoại Open Dialog dùng để hiển thị hộp thoại Open (mở file). Hộp thoại Save Dialog dùng để hiển thị hộp thoại Save As (lƣu file). Hai hộp thoại này có một số thuộc tính chung, thông dụng gồm: Thuộc tính Giải thích CancelError Dùng để bắt lỗi khi ngƣời sử dụng nhấn nút Cancel nếu đƣợc gán giá trị True. DefaultExt Xác định phần mở rộng ngầm định của file DialogTitle Xác định tiêu đề của hộp thoại FileName Xác định tên và đƣờng dẫn của tệp tin mà ngƣời sử dụng đã chọn FileTitle Xác định tên tệp tin đƣợc chọn, không chứa đƣờng dẫn 103 Filter Dùng để lọc kiểu tệp tin mà hộp thoại sẽ hiển thị FilterIndex Chỉ ra bộ lọc đƣợc sử dụng đầu tiên. InitDir Xác định thƣ mục sẽ hiển thị khi hộp thoại xuất hiện Ví dụ:
Viết chƣơng trình sử dụng điều khiển hộp thoại Open và hộp thoại Save As để thực hiện mở, lƣu tập tin văn bản theo thiết kế sau: Mở tệp văn bản và hiển thị nội dung tệp trên textbox Mở tệp văn bản và lƣu nội dung trong textbox vào tệp Giải:
Bƣớc 1. Thiết kế form theo mẫu bằng cách đƣa vào form 4 commandbutton, 1 textbox, sau đó xác định vị trí, kích thƣớc cho các điều khiển cho phù hợp. Bƣớc 2. Thiết lập một số thuộc tính cho các điều khiển nhƣ bảng sau: TT Điều khiển Thuộc tính Giá trị Ghi chú Name Form1 1 Form Caption Commondialog Name cmdopen 2 CommandButton Caption Open Name cmdsave 3 CommandButton Caption Save Name cmdappend 4 CommandButton Caption Append Name cmdexit 5 CommandButton Kết thúc chƣơng
trình Caption Exit Bƣớc 3. Mở cửa sổ lệnh của Form1 và gõ vào các dòng lệnh sau: Dim f As Integer 'khai bao bien tep 104 Private Sub cmdappend_Click() cdlhopthoai.ShowSave Open cdlhopthoai.FileName For Append As #f
Print #f, Txtnd.Text Close f End Sub „------------------------------------------------------------------------------
Private Sub cmdexit_Click() End End Sub Private Sub cmdopen_Click()
Dim s As String cdlhopthoai.ShowOpen Open cdlhopthoai.FileName For Input As #f 'Mo tep de doc Do While EOF(f) = False Line Input #f, s Txtnd.Text = Txtnd.Text & s & Chr(13) & Chr(10) Loop Close f 'dong tep End Sub
„------------------------------------------------------------------------------ Private Sub cmdsave_Click() cdlhopthoai.ShowSave Open cdlhopthoai.FileName For Output As #f Print #f, Txtnd.Text 'Ghi van ban vao tep Close f End Sub Private Sub Form_Load() f = FreeFile
End Sub Bƣớc 4. Chạy chƣơng trình (F5). 4.1.2. Color Dialog Hộp thoại Color cho phép ngƣời sử dụng chọn và hiển thị một màu từ bảng màu. Để hiển thị hộp thoại khi thi hành ta thực hiện nhƣ sau: Thiết lập giá trị cdlCCRGBInit cho thuộc tính Flags. 105 Sử dụng phƣơng thức ShowColor để hiển thị hộp thoại. Sử dụng thuộc tính Color để lấy ra giá trị RGB của màu mà ngƣời sử dụng đã chọn. 4.1.3. Font Dialog Hộp thoại Font cho phép ngƣời sử dụng thay đổi font chữ, màu chữ, cỡ chữ, kiểu
chữ. Khi ngƣời sử dụng thực hiện lựa chọn trong hộp thoại Font các thuộc tính sau sẽ lƣu trữ các thông tin về sự lựa chọn của ngƣời sử dụng. Thuộc tính Giải thích Color Trả về màu đã đƣợc ngƣời sử dụng chọn. FontBold Cho biết kiểu chữ đậm có đƣợc chọn hay không FontItalic Cho biết kiểu chữ nghiêng có đƣợc chọn hay không FontStrikethru Cho biết kiểu chữ gạch ngang (strikethrough)có đƣợc chọn hay không FontUnderline Cho biết kiểu chữ gạch dƣới (underline)có đƣợc chọn hay không FontName Trả về tên của font đã đƣợc ngƣời sử dụng chọn FontSize Trả về cỡ chữ đã đƣợc ngƣời sử chọn Để hiển thị hộp thoại font ta thực hiện nhƣ sau: Thiết lập một trong các giá trị hằng cho thuộc tính Flags: o cdlCFScreenFonts (fonts màn hình) o cdlCFPrinterFonts (fonts máy in) o cdlCFBoth (fonts màn hình và fonts máy in) Sử dụng phƣơng thức ShowFont để hiển thị hộp thoại. Điều khiển này chứa các hình ảnh để dùng với các điều khiển khác nhƣ là ListView, TreeView, TabStrip, ToolBar, PictureBox, Image. ImageList hỗ trợ các loại file ảnh nhƣ : bitmap (*.bmp), biểu tƣợng (*.ico), GIF (*.gif), JPEG (*.jpg) và con trỏ (*.cur). Để có thể dùng các điều khiển ImageList, ToolBar, StatusBar, ListView, TreeView... trong đề án Visual Basic ta thực hiện nhƣ sau: Từ menu Project ta chọn Components xuất hiện hộp thoại Components, trong danh sách các thành phần ta tích mục “Microsoft Windows Common Controls 6.0 (SP6) sau đó nhấn OK. Các 106 điều khiển trên đƣợc thêm vào hộp công cụ của Visual Basic. 4.2.1. Thêm phần tử ảnh cho ImageList lúc thiết kế Sau khi đã tạo một thể hiện của điều khiển ImageList lên form ta thực hiện các
bƣớc sau: Nhấn nút phải chuột lên điều khiển ImageList và chọn Properties Chọn Tab Images để xem trang thuộc tính của điều khiển Nhấn Insert Picture để hiển thị hộp thoại Select picture Dùng hộp thoại để tìm tệp tin hình ảnh, rồi nhấn Open. Ta có thể chọn nhiều tệp tin cùng lúc. Chỉ ra thuộc tính Key bằng cách chọn hộp Key và nhập một chuỗi. Hình 4.1. Hộp thoại Property Pages 4.2.2. Thêm phần tử ảnh cho ImageList vào lúc thi hành Để thêm hình ảnh lúc thi hành ta sử dụng phƣơng thức Add của thuộc tính ListImage của đối tƣợng ImageList với cú pháp nhƣ sau:
ListImage.Add([Index], [Key], [Picture])
Trong đó:
Tham số Index xác định vị trí phần tử ảnh đƣợc bổ sung vào danh sách, nếu bỏ
qua tham số này, phần tử ảnh đƣợc bổ sung vào cuối danh sách ảnh.
Tham số Key dùng để đặt tên cho phần tử ảnh, có thể sử dụng sau này để truy xuất vào phần tử ảnh đƣợc đặt tên đó.
Tham số Picure xác định phần tử ảnh nào đƣợc bổ sung vào danh sách. 107 ImageList1.ListImages.Add ,"Cut", LoadPicture("d:\bitmaps\cut.bmp") Ví dụ: 4.2.3. Gỡ bỏ phần tử ảnh khỏi ImageList vào lúc thi hành Để gỡ bở một phần tử ảnh khỏi danh sách, ta sử dụng phƣơng thức Remove của
thuộc tính ListImage của đối tƣợng ImageList và truyền cho nó Index hoặc Key của phần tử cần loại bỏ. Ví dụ: ImageList1.ListImages.Remove “Cut” 4.2.4. Truy xuất phần tử ảnh trong ImageList. Để truy xuất hình ảnh từ ImageList và gán cho các đối tƣợng khác ta sử dụng thuộc tính Picture của ListImage. Ví dụ: Lập chƣơng
trình sử dụng các điều khiển: ImageList, Image,
Commandbutton, Timer, Commondialog tạo album ảnh bằng cách bổ sung ảnh vào ImageList lúc thi hành rồi hiển thị ảnh lần lƣợt 2 giây một ảnh, theo form mẫu: Giải:
Bƣớc 1. Thiết kế form bằng cách đƣa các điều khiểnImageList, Image, Commandbutton, Timer, Commondialog lên form sau đó xác định vị trí, kích thƣớc của các điều khiển cho phù hợp.
Bƣớc 2. Xác định giá trị cho một số thuộc tính của các điều khiển theo bảng sau: TT Điều khiển Thuộc tính Giá trị Ghi chú Name Form1 1 Form Caption Album Name Image1 2 Image Name ImageList1 3 ImageList 108 Name Timer1 4 Timer Interval 2000 Name cmdadd Bổ sung ảnh vào 5 Commandbutton Imagelist Caption Add Name cmddisplay 6 Commandbutton Hiển thị ảnh Caption Display 7 Commondialog Name Commondialog1 Bƣớc 3. Mở cửa sổ Code của form1 và gõ vào các dòng lệnh sau: Dim i As Byte Private Sub cmdAdd_Click()
commondialog1.Filter = "Graphics file|*.jpg" commondialog1.ShowOpen
imagelist1.ListImages.Add imagelist1.ListImages.Count + 1, , LoadPicture(commondialog1.FileName) End Sub „---------------------------------------------------------------------------------------- Private Sub cmddisplay_Click() If i <= imagelist1.ListImages.Count Then image1.Picture = imagelist1.ListImages(i).Picture i = i + 1 Else i = 1 End If End Sub „---------------------------------------------------------------------------------------- Private Sub Form_Load() i = 1 End Sub
„----------------------------------------------------------------------------------------
Private Sub Timer1_Timer() If i <= imagelist1.ListImages.Count Then
image1.Picture = imagelist1.ListImages(i).Picture
i = i + 1 Else
i = 1 End If End Sub 109 Bƣớc 4. Chạy chƣơng trình (F5). Điều khiển MicroSoft Masked Edit cho phép định dạng dữ liệu nhập theo một
định dạng đƣợc ấn định. Nó không những cung cấp một gợi ý trực quan để ngƣời sử dụng nhập liệu trong một trƣờng cụ thể mà còn cung cấp kiểm tra ở mức giao diện ngƣời sử dụng, để ngăn cản ngƣời sử dụng nhập các thông tin không hợp lệ vào điều khiển.
Điều khiển MaskedEdit không có sẵn trong hộp công cụ. Nếu muốn sử dụng nó, ta thực hiện các thao tác sau để đƣa điều khiển vào hộp công cụ: Trong Visual Basic, chọn menu Project / Components. Hộp thoại Components xuất hiện. Trong danh sách các thành phần, tích vào mục “Microsoft MaskedEdit Control 6.0” rồi nhấn OK. 4.3.1. Dùng thuộc tính Mask để quy định mặt nạ nhập. Khi dùng điều khiển MaskedEdit, ta có khả năng ép ngƣời sử dụng nhập những thông tin theo một điều kiện nào đó. Ví dụ, với trƣờng mã khách hàng, ta có thể ép ngƣời sử dụng nhập tự 6 ký tự. Các quy tắc để quản lý những gì ngƣời sử dụng nhập vào trong một điều khiển Masked Edit đƣợc gọi là “Mặt nạ nhập- Masked”. Ta dùng thuộc tính Mask của điều khiển để gán mặt nạ nhập cho một điều khiển Masked Edit. Thuộc tính Mask đƣợc cấu tạo gồm một chuỗi ký tự thể hiện một mẫu để nhập dữ liệu trong hộp Masked Edit. Sau đây là các ký tự có thể đƣợc dùng trong chuỗi ký tự: Mô tả Ký tự Chữ số # Số thập phân . Dấu phân cách hàng nghìn , Dấu phân cách giờ và phút : Dấu phân cách ngày tháng / \ Mã escape để xử lý ký tự kế tiếp trong chuỗi tƣờng minh theo tứ tự
từ trái qua phải Dành chỗ cho ký tự & Chuyển đổi ký tự thành ký tự in hoa > Chuyển đổi ký tự thành ký tự thƣờng < Yêu cầu ký tự thuộc bảng chữ cái hay chữ số A Tuỳ chọn ký tự thuộc bảng chữ cái hay chữ số a 110 Tuỳ chọn chữ số 9 Tuỳ chọn ký tự hay khoảng trắng C 1 từ ? tự Hiển thị đúng nhƣ gõ vào Các ký
khác Ví dụ, nếu ta ép ngƣời sử dụng nhập một số điện thoại 7 chữ số, ta quy định thuộc
tính Mask nhƣ sau: # # # # # # # Lƣu ý: Nếu quy định thuộc tính Mask là một chuỗi rỗng, điều khiển Mask Edit sẽ hoạt động tƣơng tự điều khiển TextBox thông thƣờng. Nếu ngƣời sử dụng vi phạm điều kiện mặt nạ đã quy định, ứng dụng sẽ phát một tiếng “beep”, và ký tự bất hợp lệ sẽ không đƣợc chấp nhận. 4.3.2. Dùng thuộc tính Format để thay đổi hiển thị thông tin. Ngoài việc sử dụng thuộc tính Mask để yêu cầu ngƣời sử dụng nhập thông tin theo một điều kiện nào đó, ta còn có thể chỉ ra thông tin trong điều khiển sẽ đƣợc định dạng nhƣ thế nào trên màn hình. Ta thực hiện điều này bằng cách sử dụng thuộc tính Format của điều khiển Masked Edit. Ví dụ, nếu một trƣờng chứa 1 số điện thoại ta định hiển thị với dấu ngoặc và dấu gạch nối, ta dùng chuỗi Format nhƣ sau: (# # #) # # # - # # # # Điều này có nghĩa là ngƣời sử dụng chỉ cần nhập số điện thoại 10 chữ số. Các ký tự định dạng mở rộng, nhƣ là dấu ngoặc, đƣợc hiển thị tự động. Điều khiển ToolBar là một thanh công cụ chứa các nút (botton) mà ta có thể điều khiển đƣợc. Ta có thể chèn hình ảnh lên các nút nhờ đối tƣợng ImageList. Điều khiển ToolBar nằm trong nhóm các điều khiển thông dụng của Windows, nó cùng nhóm với điều khiển ImageList. 4.4.1. Thêm một nút lên thanh ToolBar Kích chuột phải vào điều khiển ToolBar và chọn Properties, hộp thoại Property
Pages sẽ xuất hiện với 3 tab: General, Buttons và Picture. Chọn tab Button sau đó
kích vào nút Insert Button để thêm một nút trên thanh ToolBar. Ta cần đƣa vào
thuộc tính Key để phân biệt giữa các nút. 4.4.2. Chèn hình ảnh từ ImageList lên các nút Trong tab General của hộp thoại Property Pages chọn thuộc tính Imagelist là tên 111 đối tƣợng ImageList mà ta đã đặt lên Form. Trong tab Buttons, thuộc tính Image sẽ lấy chỉ số của hình cần chèn đƣợc đặt trong ImageList, chỉ số này cho biết hình cần chèn là hình nào. 4.2.3. Các thuộc tính chính của Button trên ToolBar Trong tab Buttons thể hiện thuộc tính của các nút, Trong đó: Index: Xác định chỉ số của Button Caption: Xác định xâu ký tự hiển thị trên Button
Key: Là xâu ký tự có thể dùng để phân biệt các Button Style: Xác định dạng hiển thị của Button, nó có thể nhận một trong các giá trị 0 – tbrDefault: Dạng mặc định của Button 1 – tbrCheck: Giống nhƣ CheckBox, nó lún xuống khi kích lần thứ nhất và trở về
trạng thài ban đầu khi nhấn lần nữa. 2 – tbrButtonGroup: Khi ta lập 2 nút trở lên thành một nhóm thì khi kích nút nào thì nút đó sẽ nhấn xuống, khi kích một nút khác trong nhóm thì nút đƣợc kích sẽ lún xuống và nút đang lún trƣớc đó sẽ nổi lên. 3 - tbrSeparator: Tạo một dấu gạch ngăn cách giữa các nút hay nhóm nút. 4 - tbrPlaceHolder: Cho phép làm vật chứa cho nút điều khiển khác. 5 – tbrDropDown: Nút có thêm một phím mũi tên, cho phép liệt kê một số nút khác
khi kích vào mũi tên này. Value: Xác định trạng thái của Button khi chƣơng trình thi hành là nhấn hay chƣa đƣợc nhấn, nó nhận một trong hai giá trị: 0 – tbrUnpressed: Mặc định nút chƣa đƣợc nhấn 1 – tbrPressed: Mặc định nút đƣợc nhấn Là điều khiển dùng để trình bày cấu trúc tổ chức của một đối tƣợng nhƣ cấu trúc cây thƣ mục, tổ chức một cơ quan, một đơn vị. 4.5.1. Các thuộc tính Nodes: Thuộc tính quan trọng nhất của TreeView, là một danh sách các đối tƣợng
Node (nút). Mỗi Node đƣợc xem là một cây con, có các nút con, nút cháu....
ImageList: Tham chiếu đến đối tƣợng ImageList chứa danh sách hình ảnh liên kết
với TreeView. Ta có thể gán giá trị cho thuộc tính này trong hộp thoại Property 112 Pages hoặc bằng câu lệnh nhƣ sau:
Set TreeView1.ImageList = ImageList1
CheckBoxes (True/False): Làm xuất hiện CheckBox bên trái mỗi nút
LabelEdit: Xác định chế độ sửa giá trị nhãn (0-tvwAutomatic, 1-tvwManual) LineStyle: Xác định kiểu đƣờng nối giữa nút cha và các nút con (0-tvwTreeLines, 1-tvwRootLines)
SelectedItem: Trả về một Node đƣợc chọn trong TreeView hoặc dùng để chọn một Node trong TreeView Chọn nút gốc trong TreeView: Set TreeView1.SelectedItem = TreeView1.Nodes(“Root”) In giá trị nút đang đƣợc chọn
Dim nd As Node Set nd = TreeView1.SelectedItem Debug.Print nd.Text Các thuộc tính của đối tƣợng Node
Child: Tham chiếu đến nút con đầu tiên Children: Trả về số con
Expanded (True/False): Làm xuất hiện/ẩn các nút con của một nút, tƣơng đƣơng với việc kích chuột vào nút +/- để triển khai/thu gọn một nút.
FirstSubling: Tham chiếu đến nút con đầu tiên ở cùng cấp LastSubling: Tham chiếu đến nút con cuối cùng ở cùng cấp Next:Tham chiếu đến nút con tiếp theo ở cùng cấp Previous:Tham chiếu đến nút con liền trƣớc ở cùng cấp Parent: Tham chiếu đến nút cha của một nút Root: Tham chiếu đến nút gốc Sorted: Sắp xếp các nút cùng cấp theo thứ tự Alphabet Text: Chuỗi xuất hiện bên trái của nút Index: Số thứ tự của nút trong mảng chứa các nút cùng cấp Chƣơng trình con sau in ra nhãn (text) của nút con của một nút Private Sub List Children(pnod As Node)
Dim pnodeCurrent As Node
Set pnodeCurrent = pnod.Child
For i = 1 to pnod.Children Debug.Print pnodCurrent.Text
Set pnodeCurrent = pnodeCurrent.Next Next End Sub In các nút con của nút gốc Private Sub Command1_Click()
Dim nd As Node
Set nd = TreeView1.Nodes(“Root”)
ListChildren nd 113 End Sub 4.5.2. Phương thức Thêm một nút vào danh sách Add [Relative][,Relationship][,Key][,Text][,Image][,SelImage] Trong đó: Relative: Nhận giá trị là Key hoặc Index của nút mà nút mới đƣợc thêm vào. Quan hệ của nút mới thêm vào và nút đó nhƣ sau: 0-tvwFirst: Nút đƣợc thêm vào là nút đầu tiên so với các nút cùng cấp với nút đƣợc cho trong tham số Relative 1-tvwLast: Nút đƣợc thêm vào là nút cuối cùng so với các nút cùng cấp với nút đƣợc cho trong tham số Relative Relationship 2-tvwNext: Nút đƣợc thêm vào là nút tiếp theo của nút đƣợc cho trong tham số Relative 3-tvwPrevious: Nút đƣợc thêm vào là nút kế trƣớc của nút đƣợc cho trong tham số Relative 4-tvwChild: Nút đƣợc thêm vào là nút con của nút đƣợc cho trong tham số Relative Key: Chuỗi văn bản duy nhất cho mỗi nút Text: Chuỗi văn bản xuất hiện bên trái mỗi nút Image: Hình ảnh của nút ở trạng thái bình thƣờng SelImage: Hình ảnh của nút ở trạng thái đƣợc chọn Remove Index/Key: Xoá nút đƣợc xác định bởi Index/Key Clear: Xoá toàn bộ cây trong TreeView 4.5.3. Sự kiện NodeClick: Là sự kiện xảy ra khi ngƣời sử dụng kích chuột vào một nút Điều khiển Multimedia MCI quản lí việc ghi và phát các tệp tin đa phƣơng tiện trên thiết bị giao tiếp điều khiển truyền thông (Media Control Interface - MCI). Điều khiển này chứa một loạt các nút bấm để phát ra các lệnh tới các thiết bị nhƣ CD- ROM, audio, video v.v... Điều khiển Multimedia không có sẵn trong hộp công cụ. Để đƣa điều khiển 114 Multimedia vào hộp công cụ, ta làm nhƣ sau: - Trong Visual Basic, chọn menu Project / Components. Hộp thoại Components xuất hiện.
- Trong danh sách các thành phần, tích chọn “Microsoft Multimedia Control 6.0”. - Nhấn OK. Điều khiển Multimedia (MMControl) đƣợc thêm vào hộp công cụ của Visual Basic. Nháy đúp chuột vào điều khiển MMControl để đƣa điều khiển lên Form. Khi đó
Form có dạng: Với các nút tƣơng ứng là: Prev, Next, Play, Pause, Back, Step, Stop, Record, và Eject. Sau khi nạp điều khiển MCI vào đề án, bạn đặt nó lên biểu mẫu và định cỡ nó theo nhu cầu. Do điều khiển MCI có thể truy xuất nhiều kiểu phƣơng tiện khác nhau, chúng ta phải báo cho điều khiển biết sẽ dùng kiểu nào bằng cách thiết lập giá trị cho thuộc tính DeviceType một trong các giá trị sau: Giá trị Phƣơng tiện CDAudio CD audio DAT Digital Audio Tape DigitalVideo Digital video Other Other Overlay Overlay Scanner Scanner Sequencer Sequencer VCR Vcr AVIVideo AVI Videodisc Videodisc Waveaudio Wave audio Sau khi xác lập DeviceType, ta phải mở thiết bị sử dụng lệnh Open. Lệnh này có
cú pháp nhƣ sau: MMControl1.Command = “Open”
Trong đó, MMControl1 là tên của điều khiển của MMControl. Thông thƣờng trƣớc khi sử dụng lệnh Open ta thiết lập giá trị cho một số thuộc 115 tính. Ví dụ: MMControl1.Notify = False MMControl1.Wait = True
MMControl1.Shareable = False MMControl1.Command = True MMControl1.DeviceType = "CDAudio" MMControl1.FileName = Audio_fname „Chỉ ra tên tập tin âm thanh MMControl1.Command = "Open" Nếu tính chất Notify đƣợc ấn dịnh theo True, điều khiển sẽ phát sinh sự kiện Done sau khi một lệnh đƣợc phát ra. Trong hầu hết các ứng dụng, tính chất Notify thƣờng không đƣợc dùng, do đó ở đây nó đƣợc ấn định theo False. Tính chất Wait
đƣợc dùng để xác định cách thức mà chƣơng trình bắt đầu lại điều khiển sau khi truy xuất thiết bị Multimedia. Nếu tính chất Wait đƣợc ấn định theo False, điều khiển MCI sẽ không chờ cho phƣơng tiện đã chỉ định phát xong thì mới trả quyền điều khiển. Nếu tính chất Wait đƣợc ấn định theo True, quyền điều khiển chƣơng trình sẽ không trở về chƣơng trình của bạn cho đến khi phƣơng tiện đã chỉ định phát xong. Tính chất Shareable xác định một chƣơng trình khác sẽ đƣợc phép dùng chung thiết bị MCI. Tính chất này đƣợc ấn định theo True nếu nó đƣợc phép và False nếu nhƣ không. Giá trị của các tính chất này có thể thay đổi trong các chƣơng trình, nhƣng điều quan trọng phải biết đó là nếu dự định xác lập các giá trị này, chúng phải đƣợc
ấn định trƣớc khi phát ra lệnh Open. Các lệnh tiếp theo có thể dùng với điều khiển MMControl là: Open, Close, Play, Pause, Stop, Back, Step, Prev, Next, Seek, Record, Eject, Save. Ví dụ: Ta dùng lệnh Play để mở tập tin âm thanh MMControl1.Command = “Play” Ta cũng có thể phát các lệnh khác tuỳ ý, nhƣ Pause và Stop. Để phát các lệnh này, ta dùng cú pháp giống nhƣ với lệnh Play. Khi phát xong kiểu phƣơng tiện mong muốn, ta phải đóng thiết bị, cũng nhƣ phải đóng một tập tin Visual Basic sau khi mở nó để bảo toàn tài nguyên. Để đóng thiết
bị, ta phát lệnh Close, giống cú pháp của lệnh Play ở trên. Có hai loại menu thƣờng gặp là menu thả xuống (drop-down menu) và menu hiện
lên (pop-up menu). Chúng ta thƣờng dùng menu drop-down làm menu chính cho 116 chƣơng trình, nó thƣờng nằm theo chiều ngang, nếu ta nhấp chuột vào một mục
chọn (menu command) thì chƣơng trình sẽ thả xuống một menu với những mục
chọn con (MenuItems) nằm dọc theo chiều thẳng đứng. Nếu ta nhấp chuột lên mục
chọn con nào đó có dấu hình tam giác nhỏ bên phải thì chƣơng trình sẽ hiện lên một menu nhƣ trong ví dụ sau đây: Nhấp chuột vào mục chọn đơn “Mầu sắc” chƣơng trình sẽ thả xuống một menu (drop-down menu); nhấp chuột vào mục chọn con
“Chọn mầu”, chƣơng trình sẽ hiện lên một menu (pop-up menu). Ví dụ: Chúng ta quy ƣớc gọi lệnh đơn (mục chọn đơn) là Menu Command, và lệnh con (mục chọn con) là MenuItems. Thiết kế menu gồm 2 công việc: - Thiết kế giao diện. - Viết lệnh cho các thủ tục đáp ứng sự kiện chọn các mục menu. Chúng ta sẽ trình bày phần này bằng chƣơng trình chọn mầu nền cho Form và thay đổi kích thƣớc của Form. Chƣơng trình sẽ cung cấp một menu gồm có 2 trình đơn: “Mầu sắc” và “Kích thƣớc”. Trình đơn “Mầu sắc” cho phép ta thay đổi mầu nền của Form, trình đơn “Kích thƣớc” cho phép ta thay đổi kích thƣớc Form. - Trong trình đơn “Mầu sắc” có 2 mục là “Chọn mầu” và “Thoát”. Khi chọn mục “Chọn mầu” trong trình đơn “Mầu sắc”, một menu xuất hiện với 3 mục là “Xanh”, “Đỏ” và “Trắng”, đay là các mầu ta có thể chọn làm mầu nền Form. Khi ta chọn mục “Thoát” trong trình đơn “Mầu sắc”, chƣơng trình kết thúc. - Trong trình đơn “Kích thƣớc” có 2 mục là “Phóng to” và “Thu nhỏ”. Khi chọn mục “Phóng to”, kích thƣớc của Form sẽ phóng to chiếm toàn bộ màn hình. Khi chọn mục “Thu nhỏ”, kích thƣớc của Form sẽ thu nhỏ nhƣ lúc ban đầu. a) Thiết kế giao diện Bƣớc 1. Chọn một Form để thiết kế menu. Ví dụ Form có tên là frmMenu, có thuộc tính Caption là “Chon mau nen va kich thuoc Form”. Bƣớc 2. Gọi Menu Editor bằng 2 cách: 117 Cách 1: Trên menu của Visual Basic chọn Tools -> chọn mục Menu Editor. Hình 4.2. Lệnh đơn Menu Editor Cách 2: Nhấn nút lệnh Menu Editor ( ) trên thanh công cụ chuẩn. Menu Editor Hình 4.3. Công cụ Menu Editor Bƣớc 3. Tạo các mục chọn trên menu: Sau khi gọi Menu Editor thì cửa sổ “Menu Editor” sẽ xuất hiện: Hình 4.4. Hộp thoại Menu Editor
- Gõ tên mục chọn trong hộp gõ văn bản Caption. Ví dụ ta gõ “&Mầu sắc”. Nếu muốn dùng phím thay thế khi sử dụng menu, ta có thể đặt dấu & ở ngay trƣớc ký tự mà ta muốn trong phần Caption này, ví dụ nhấn Alt-M sẽ cho chọn mục “Mầu sắc”. 118 Để tạo gạch ngang phân cách giữa các mục chọn, tại hộp gõ văn bản ta gõ dấu trừ “-
“. - Gõ tên mục chọn trong hộp văn bản “Name”, quy ƣớc có “mnu” ở tên để phân biệt với các đối tƣợng khác trong Form. Ví dụ, đặt tên cho mục chọn đơn là
“mnuMausac”. Nhấp chuột vào nút “Next” để tạo các mục chọn khác menu. Tƣơng tự nhƣ đã tạo Menu Command “Mầu sắc” ở trên, ta tạo Menu Command “Kích thƣớc”. Trong các Menu Command thƣờng có các MenuItems. Tất cả các MenuItems của Menu Command đều nằm thụt vào bên phải với 4 dấu chấm “….” ở phía trƣớc. Khi ta nhấp chuột vào dấu mũi tên chỉ sang bên phải
trong cửa sổ Menu Editor thì
MenuItems ta đang chỉnh sửa sẽ có thêm 4 dấu chấm “….”, tức là thụt vào một bậc trong Menu. Nếu muốn tạo MenuItems có cấp thấp hơn nữa thì ta lại tiếp tục nhấp mũi tên 119 sang phải , MenuItems lại thụt tiếp một bậc nữa. Tƣơng tự, nếu ta nhấp mũi tên sang trái thì MenuItems đang chỉnh sửa sẽ mất 4 dấu chấm “….” phía trƣớc, tức là nó đã đƣợc trồi ra một bậc.
Ta tạo các MenuItems cho Menu Command “Mầu sắc” gồm: “Chọn mầu”, dấu
gạch ngang và “Thoát”. Menu Command “Kích thƣớc” có các MenuItems là “Phóng to” và “Thu nhỏ” bằng cách tạo nhƣ các Menu Command rồi nhấp vào mũi tên sang phải để nó trở thành các MenuItems, ta cũng có thể thay đổi thứ tự các mục chọn trong menu sử dụng các phím mũi tên lê, mũi tên xuống. Để chèn một dòng mới vào menu đã có sẵn, ta đặt thanh sáng ở dòng muốn chèn vào trƣớc nó rồi nhấn vào nút “Insert”. Để xoá một dòng trong menu, ta chọn dòng muốn xoá rồi nhấn nút “Delete”.
Mỗi MenuItems có thêm một tính năng nữa, đó là ta có thể tạo phím tắt cho nó trong mục “Shortcut”. Ví dụ, ta có thể dùng phím tắt Ctrl-E để thay cho việc chọn lệnh đơn “Thoát”. Có một số tuỳ chọn trong Menu Editor chúng ta có thể chọn nhƣ Mục “Visible” dùng để hiện/ẩn một mục chọn trong menu. Mục “Enable” dùng để cho phép/vô hiệu hoá một mục chọn trong menu Mục “Check” dùng để thêm/không thêm dấu kiểm bên trái một mục chọn trong menu khi nó đƣợc chọn. Sau đây là bảng danh mục các mục chọn trên menu của Form “frmMenu”: Caption Name Checked Mục chọn &Mầu sắc mnumausac Mầu sắc ….&Chọn mầu mnuchonmau Chọn mầu ……..&Xanh mnuXanh x Xanh ……..&Đỏ mnuDo x Đỏ 120 ……..&Trắng mnuTrang x Trắng Dấu gạch ngang ….- mnugach Thoát ….&Thoát mnuThoat Kích thƣớc &Kích thƣớc mnukichthuoc Phóng to ….&Phóng to mnuTo x Thu nhỏ ….&Thu nhỏ mnuNho x Ghi chú: Muốn hiển thị đƣợc menu tiếng Việt, ta chọn bộ mã TCVN3 để gõ tên
mục chọn trong Menu Editor. Trƣớc khi chạy chƣơng trình ta thiết lập thuộc tính font cho menu của hệ thống nhƣ sau: Kích phải chuột vào màn hình nền, chọn Properties để hiển thị hộp thoại Display Properties, chọn Tab Appearance, rồi nhấn nút Advanced, trong mục Item chọn Menu, sau đó chọn font .vntime, cỡ 12 rồi nhấn nút OK, tiếp đó nhấn nút Apply và cuối cùng là nhấn nút OK. Đừng bận tâm nếu
trong hộp thoại Menu Editor không hiển thị đúng tiếng Việt. b) Viết lệnh cho các thủ tục đáp ứng sự kiện chọn (Click) mục chọn
Mỗi mục chọn trên menu có một thủ tục đáp ứng sự kiện Click của ngƣời sử dụng chƣơng trình. Ví dụ, khi ngƣời sử dụng chọn mục “Thoát” trong trình đơn “Mầu sắc” thì thủ tục mnuthoat_Click( ) đƣợc thực hiện. Thủ tục Form_Load ( )
Thủ tục này thực hiện ngay khi ta khởi động chƣơng trình. Thủ tục làm nhiệm vụ ẩn đi 2 mục “Trắng” và “Thu nhỏ” bằng cách đặt thuộc tính “Enable” có giá trị là False. Private Sub Form_Load() mnutrang.Enabled = False
mnunho.Enabled = False End Sub Thủ tục mnudo_Click ( )
Thủ tục đƣợc thực hiện khi ta chọn mục “Đỏ”. Thủ tục có nhiệm vụ đổi mầu nền của Form thành mầu đỏ và cho ẩn đi mục “Đỏ”, đồng thời bật các mục “Xanh” và
“Trắng” lên. Private Sub mnuDo_Click() frmMenu.BackColor = vbRed ' Đặt mầu nền là đỏ mnudo.Enabled = False ' Vô hiệu hoá mục chọn “Đỏ” mnuxanh.Enabled = True ' Cho phép sử dụng mục chọn “Xanh” mnutrang.Enabled = True ' Cho phép sử dụng mục chọn “Trắng” End Sub 121 Thủ tục mnuTrang_Click ( ) Tƣơng tự thủ tục mnuDo_Click(), nhƣng đổi mầu nền của Form thành mầu trắng và cho vô hiệu hoá mục chọn “Trắng”. Thủ tục mnuXanh_Click ( )
Tƣơng tự thủ tục mnuDo_Click(), nhƣng đổi mầu nền của Form thành màu xanh và cho vô hiệu hoá mục chọn “Xanh”. Thủ tục mnuTo_Click ( )
Thủ tục thực hiện khi ta chọn mục “Phóng to”. Thủ tục làm nhiệm vụ đƣa cửa sổ Form về dạng lớn và vô hiệu hoá mục chọn “Phóng to” đi, đồng thời bật mục “Thu nhỏ”. Private Sub mnuTo_Click() frmMenu.WindowState = 2 'Đặt thủ tục Form ở dạng lớn mnuTo.Enabled = False 'Vo hiệu hoá mục chọn “Phóng to” mnunho.Enabled = True 'Cho phép đổi cửa sổ Form sang dạng nhỏ End Sub Thủ tục mnuNho_Click ( )
Thủ tục thực hiện tƣơng tự thủ tục mnuTo_Click() thực hiện thu nhỏ cửa sổ. Thủ tục mnuThoat_Click ( )
Thủ tục thực hiện khi ta chọn mục “Thoát”. Thủ tục làm nhiệm vụ kết thúc chƣơng trình. Private Sub mnuthoat_Click() End End Sub Điều khiển RichTextBox cho phép ngƣời sử dụng nhập và sửa văn bản đồng thời
cũng tạo ra nhiều đặc tính định dạng hơn điều khiển TextBox thông thƣờng 122 Điều khiển RichTextBox tạo ra một số các thuộc tính mà ta có thể sử dụng để
thay đổi định dạng của bất cứ phần nào thuộc văn bản trong điều khiển. Sử dụng các
thuộc tính này ta có thể thay đổi màu chữ, chữ đậm hoặc nghiêng, tạo chỉ số trên, chỉ số dƣới. Ta cũng có thể điều chỉnh định dạng đoạn nhƣ canh lề trái, lề phải của đoạn.
Muốn sử dụng điều khiển RichTextBox thì trên thanh công cụ phải có biểu tƣợng . Trƣờng hợp nó không xuất hiện ta thực hiện nhƣ sau: Từ thực đơn Project ta chọn Components, xuất hiện hộp thoại Components, trong tab Control của hộp thoại
ta tích chọn mục Microsoft Rich TextBox Control 6.0 (SP4) sau đó nhấn nút OK. Có thể sử dụng RichTextBox nhƣ một hộp văn bản (TextBox) có khả năng lƣu trữ cao cho phép một ứng dụng có thể đọc các tệp tin văn bản có kích thƣớc lớn, cũng có thể dùng RichTextBox để tạo một bộ soạn thảo văn bản với đầy đủ các đặc tính vào một ứng dụng bất kì. 4.8.1. Các thuộc tính Thuộc tính Giải thích SelFontName Xác định tên Font chữ cho phần văn bản đƣợc chọn trong RichTextBox SelFontSize Xác định cỡ chữ (Font Size) cho phần văn bản đƣợc chọn trong RichTextBox SelFontColor Xác định màu chữ (Font Color) cho phần văn bản đƣợc chọn trong RichTextBox SelColor Xác định màu chữ (Font Color) cho phần văn bản đƣợc chọn trong RichTextBox SelBold Xác định chữ đậm (Bold) cho phần văn bản đƣợc chọn trong RichTextBox SelItalic Xác định chữ nghiêng (Italic) cho phần văn bản đƣợc chọn trong RichTextBox 4.8.2. Các phương thức LoadFile Filename: Mở và đọc file có định dạng RTF và ASCII .
SaveFile Filename: Mở và ghi file có định dạng RTF và ASCII .
SelPrint- In tất cả hoặc một phần của văn bản trong điều khiển.
Add- Nhúng các đối tƣợng nhƣ: ảnh bitmap, các biểu tƣợng (Icons) vào trong điều
khiển khi thi hành. Đây là phƣơng thức của đối tƣợng OLEObject của RichTextBox. 1) Chọn loại hộp thoại mà điều khiển CommonDialog có thể hiển thị đƣợc 123 a. Open b. Font c. Color
d. Cả 3 loại hộp thoại trên 2) Chọn loại định dạng file ảnh mà điều khiển ImageList có thể chứa: a. *.jpg b. *. bmp
c. *.cur d. Cả 3 loại trên 3) Chọn phƣơng thức để hiển thị hộp thoại Printer a. ShowOpen
b. ShowPrinter c. ShowColor d. ShowFont 4) Chọn phƣơng thức để bổ sung một phần tử (ảnh) vào ImageList lúc thi hành chƣơng trình. a. LoadPicture b. Add c. AddItem d. Remove 5) Chọn phƣơng thức để loại một phần tử (ảnh) ra khỏi ImageList lúc thi hành chƣơng trình. a. LoadPicture b.RemoveItem c. AddItem d. Remove 6) Chọn thuộc tính dùng để kiểm tra một Button trên Toolbar có đƣợc nhấn khi thi hành không a. Index
b. Key
c. Caption
d. Value 7) Chọn thuộc tính để xác định chỉ số của các Button trên Toolbar a. Index b. Key
c. Caption 124 d. Value Bài tập 1: Tạo một chƣơng trình hiển thị một danh sách chọn lựa cho ngƣời dùng
trong một ListBox, sau đó xử lý với cấu trúc quyết định Select Case. Mục đích của điều khiển sự kiện này là hiển thi một danh sách các quốc gia, sau đó hiển thị một thông điệp chào mừng bằng ngôn ngữ bản xứ khi ngƣời dùng chọn quốc gia của họ. Chẳng hạn:
Tiếng Anh: Hello, programmer Tiếng Đức: Hallo, programmierer Tiếng Tây Ban Nha: Hola, programador Tiếng Ý: Ciao, programmatori Bài tập 2: Lập trình sử dụng các hộp thoại thông dụng : Open, Save, Font, Color để mở, lƣu tập tin văn bản, thay đổi font, màu của chữ trong hộp văn bản
(RichTextbox) theo mẫu: Bài tập 3: Lập chƣơng trình sử dụng điều khiển Toolbar tạo một thanh công cụ trên 125 đó có 3 nút thực hiện các chức năng sao chép, cắt, dán đoạn văn bản trong
Richtextbox sử dụng Clipboard theo mẫu sau: Chú ý: Hình ảnh của mỗi nút trên Toolbar do sinh viên tự lựa chọn cho phù hợp. Bài tập 4: Viết chƣơng trình trình chiếu ảnh tự động cứ 2 giây một ảnh sử dụng điều khiển Timer, ImageList và điều khiển Image nhƣ hình sau: Bài tập 5: Viết chƣơng trình trò chơi Puzzle. Trò chơi đƣợc mô tả nhƣ sau: Không gian chơi gồm 16 ô số, đƣợc xếp trên 4 hàng, mỗi hàng gồm 4 cột. Trong đó có 15 ô 126 có giá trị từ 1 đến 15 đƣợc phân bổ theo thứ tự ngẫu nhiên và 1 ô trống, nhƣ hình sau Ngƣời chơi phải tiến hành sắp lại các ô số này theo thứ tự để đƣợc kết quả nhƣ hình thì trò chơi kết thúc. Chƣơng trình hiển thị câu chúc mừng: “Chuc mung! Ban da thanh cong!!!” & tổng thời gian chơi. Ngƣời chơi có thể thực hiện chơi lại bằng cách chọn File\New. Chƣơng trình sẽ tự động xáo lại các ô chứa số & ô trống theo thứ tự ngẫu nhiên. Việc sắp xếp lại các ô số đƣợc thực hiện bằng cách sử dụng ô trống. Ngƣời dùng có thể chuyển một số từ các ô lân cận đến ô trống bằng cách nhấp chuột lên ô số đó. Chú ý rằng ngƣời dùng chỉ có thể di chuyển các số thuộc những ô lân cận trống.
Bài tập 6: Lập chƣơng trình quản lý cây gia phả của một dòng họ sử dụng điều khiển TreeView, cây gia phả đƣợc hiển thị dƣới dạng cây thƣ mục. Bài tập 7: Thiết kế chƣơng trình nhƣ ứng dụng Notepad của Windows. Yêu cầu Thiết kế giao diện nhƣ sau: 127 Xử lý các sự kiện Mỗi khi Form thay đổi kích thƣớc, TextBox cũng thay đổi theo cho phù hợp với Form New
Open, Save, Save As: mở hộp thoại Common Dialog cho phép chọn tập tin để
mở hay lƣu. Sử dụng đối tƣợng FileSystemObject để thao tác với tập tin văn bản.
Exit
Font: Mở ra hộp thoại chọn Font, thiết lập Font của TextBox chính là Font đƣợc chọn trong hộp thoại. Xử lý mở rộng:
Khi ngƣời dùng đã lƣu tập tin rồi, lần thứ hai bấm vào Save thì không mở hộp
thoại Common Dialog nữa mà sẽ lƣu với tên tập tin đã chọn trong lần Save đầu tiên. Mỗi khi ngƣời dùng thay đổi nội dung của một tập tin, sau đó họ chọn Exit để
đóng ứng dụng lại; một hộp thông điệp (Message Box) sẽ mở ra hỏi có lƣu 128 tập tin hay không? 5.1.1. Khái niệm cơ sở dữ liệu Cơ sở dữ liệu là một kho chứa thông tin. Có nhiều loại cơ sở dữ liệu, nhƣng ở đây chúng ta chỉ đề cập đến cơ sở dữ liệu quan hệ (relational database) là loại cơ sở dữ
liệu phổ biến nhất hiện nay. Cơ sở dữ liệu quan hệ (CSDLQH) là kho thông tin có các đặc tính sau: - CSDLQH chứa dữ liệu trong các bảng (table) đƣợc cấu tạo bởi các bản ghi (record) và các trƣờng (field). - CSDLQH cho phép lấy về (hay truy vấn) các tập hợp dữ liệu con từ các bảng.
- CSDLQH cho phép kết nối các bảng dữ liệu với nhau để truy cập các bản ghi liên
quan với nhau chứa trong các bảng khác nhau. 5.1.2. Engine (bộ máy) CSDL Chức năng cơ bản của một CSDL đƣợc cung cấp bởi một bộ máy (Engine) cơ sở dữ liệu, đó là một hệ thống chƣơng trình quản lý cách thức chứa và trả về dữ liệu. 5.1.3. Bảng (Table), Trường (Field), Bản ghi (Record) CSDL đƣợc cấu tạo từ các bảng (table). Có thể hình dung bảng nhƣ là một lƣới hình chữ nhật ở đó trƣờng (field) là tên của các cột của lƣới chữ nhật, còn bản ghi (record) là một dòng của lƣới chữ nhật, mỗi dòng là một bộ giá trị của các trƣờng. Ví dụ: Bảng (table) danh sách học sinh gồm 4 cột hay là trƣờng (field) là MaHS (mã học sinh), HoTen (họ tên), NamSinh (năm sinh), (điểm thi): MaHS HoTen NamSinh Diem A100 Nguyễn Đình Thắng 1990 8.5 A121 Trần Văn Minh 1991 7.0 A155 Lê Bình 1990 6.5 A110 Vũ Thuý Hằng 1989 7.5 Mỗi dòng của bảng là một bản ghi (record), chẳng hạn dòng thứ nhất (bản ghi thứ
nhất) có mã học sinh (MaHS) là “A100”, họ và tên (HoTen) là “Nguyễn Đình 129 Thắng”, năm sinh (NamSinh) là 1990, điểm thi (Diem) là 8,5.
Bảng có cấu trúc đƣợc định nghĩa sẵn và chứa dữ liệu phù hợp với cấu trúc này.
Để tạo một cơ sở dữ liệu, trƣớc hết ta phải xác định thông tin gì cần theo dõi. Sau
đó, ta thiết kế cơ sở dữ liệu, tạo bảng chứa các trƣờng định nghĩa kiểu dữ liệu sẽ có. Sau khi tạo ra cấu trúc cơ sở dữ liệu, tạo bảng chứa các trƣờng định nghĩa kiểu dữ liệu sẽ có.
Ví dụ: ta tạo các bảng Danh sách khách hàng (tblDS_KH) và bảng Đơn đặt hàng (tblD_DH) nhƣ sau: Bảng tblDS_KH Field Mô tả Type Size Makh Mã khách hàng Text 6 Tenkh Tên khách hàng Text 50 Diachi Địa chỉ Text 200 Dienthoai Điện thoại Text 10 Fax Số Fax Text 10 Company Tên công ty Text 200 Utien Ƣu tiên Binary Email Thƣ điện tử Text 50 Bảng tblD_DH Field Mô tả Type Size Maddh Mã đơn đặt hàng Text 30 Makh Mã khách hàng Text 6 Ngaydh Ngày đặt hàng Date/Time Ngayhg Ngày hẹn giao hàng Date/Time Ddgiao Địa điểm giao hàng Text 200 Ta có thể kết nối hai bảng thông qua trƣờng Makh. Đây là mối quan hệ một - nhiều, đối với một bản ghi trong tblDS_KH, có thể không có, hoặc có nhiều bản ghi tƣơng ứng trong bảng tblD_DH. 5.1.4. Recordset Thao tác trên các bảng liên quan đến việc nhập và lấy về dữ liệu từ các bảng cũng
nhƣ việc kiểm tra và sửa đổi cấu trúc các bảng. Để thao tác với cấu trúc bảng chúng ta dùng các câu lệnh định nghĩa dữ liệu. Để thao tác dữ liệu trong một bảng chúng ta
dùng Recordset. Một Recordset là một tập hợp con các bản ghi đƣợc lấy từ cơ sở dữ liệu. Về khái niệm Recordset tƣơng tự nhƣ một bảng nhƣng có các thuộc tính và phƣơng thức riêng. Chúng ta có thể lập trình để tạo và sử dụng các recordset theo một trong ba kỹ thuật kết nối cơ sở dữ liệu: Các đối tƣợng truy cập dữ liệu (DAO), các đối tƣợng 130 truy cập từ xa (RDO) và các đối tƣợng dữ liệu ActiveX (ADO). 5.2.1. Tạo cơ sở dữ liệu
Để tạo cơ sở dữ liệu dùng Visual Basic, ta có thể dùng tiện ích gọi là Visual Data Manager (VisData). Để chạy VisData, ta thực hiện các bƣớc sau : Bƣớc 1. Từ menu của Visual Basic chọn mục Add-ins, VisData, cửa sổ VisData sẽ
xuất hiện. Hình 5.1. Cửa sổ Visual Data Manager (VisData) Bƣớc 2. Từ menu của VisData, chọn File, New. Từ menu con, chọn Microsoft Access, Version 7.0 MDB. Một hộp thoại tập tin xuất hiện. Chọn thƣ mục ta muốn
lƣu cơ sở dữ liệu mới rồi gõ tên cơ sở dữ liệu chẳng hạn Education. Nhấn chuột vào nút Save. Cơ sở dữ liệu mới đƣợc tạo và VisData sẽ hiển thị một vài cửa sổ cho phép ta làm việc với cơ sở dữ liệu đƣợc hiển thị nhƣ hình dƣới đây. Hình 5.2. Các thành phần trong cửa sổ VisData
Cửa sổ DataBase của VisData chứa tất cả các thành phần của cơ sở dữ liệu. Trong 131 cửa sổ này ta có thể xem các thuộc tính, kiểm tra các bảng và các phần tử khác và thêm các thành phần mới vào cơ sở dữ liệu. Để xem các thuộc tính, ta nhấn chuột vào dấu cộng ở bên trái của mục Properties. Mục này sẽ mở ra nhƣ hình dƣới đây. Hình 5.3. Cửa sổ Data Window 5.2.2. Tạo bảng Để tạo một bảng cơ sở dữ liệu ta thực hiện các bƣớc sau: Bƣớc 1. Trong cửa sổ Database của VisData, nhấn chuột phải vào Properties. Một menu ngữ cảnh của cửa sổ sẽ xuất hiện, chọn New Table. Hộp thoại Table Structure sẽ xuất hiện nhƣ hình dƣới đây. Hình 5.4. Hộp thoại Table Structure 132 Bƣớc 2. Khai báo tên bảng (Table name);
Bƣớc 3. Khai báo danh sách trƣờng (Field): Tên trƣờng, kiểu dữ liệu, độ rộng. Ví dụ, ta sẽ tạo cấu trúc bảng để chứa danh sách khách hàng bằng cách thực hiện các thao tác:
- Gõ Student trong ô Table Name. - Nhấn chuột vào nút Add Field. Hộp thoại Add Field sẽ xuất hiện cho phép ta khai báo tên trƣờng, kiểu dữ liệu và độ rộng của trƣờng. Hộp thoại Add Field đƣợc hiển thị nhƣ hình dƣới đây: Hình 5.5. Hộp thoại Add Field
Trong ô Name gõ ID. Đây sẽ là tên của trƣờng mà ta tạo trong bảng Student. Trong ô size gõ 5. Điều này chỉ ra rằng mã sinh viên có thể lên đến 5 ký tự, nhƣng không thể dài hơn. Chọn Fixed Field để chỉ ra rằng đây không phải là trƣờng có chiều dài biến đổi, rổi nhấn nút OK. Trƣờng đƣợc thêm vào cấu trúc cơ sở dữ liệu. Bằng các thao tác tƣơng tự sử dụng Add Field, ta thêm các trƣờng: Name, Age, Sex, Add vào bảng Student. Khi ta hoàn tất việc nhập trƣờng, nhấn nút bấm Close. Bƣớc 4. Chỉ định chỉ mục và khoá chính Một chỉ mục là một thuộc tính ta có thể gán cho một trƣờng để tạo sự dễ dàng cho bộ máy cơ sở dữ liệu khi lấy về thông tin chứa trong trƣờng đó. Ví dụ, trong cơ sở dữ liệu theo dõi sinh viên, ứng dụng có thể tìm kiếm các sinh viên theo họ tên sinh viên hoặc mã sinh viên. Do đó, cần thiết phải tạo các chỉ mục trên những trƣờng này
để giúp cho quy trình tìm bản ghi dựa trên các trƣờng này nhanh hơn.
Khoá chính là kiểu chỉ mục đặc biệt. Một trƣờng đƣợc coi là một khoá chính của
bảng phục vụ cho việc xác định duy nhất bản ghi. Vì vậy, không nhƣ các kiểu chỉ
mục khác, sẽ không có hai bản ghi trên cùng một bảng mà có cùng giá trị cho trƣờng khoá chính. Tƣơng tự, khi thiết kế một trƣờng làm khoá chính, không có bản ghi nào chứa giá trị rỗng, giá trị NULL ở trƣờng này. Khi chỉ ra một trƣờng làm khoá chính 133 của bảng, ta có thể tạo mối quan hệ giữa bảng này với các bảng khác trong cơ sở dữ
liệu. Mỗi bảng mà ta thiết kế phải có ít nhất một khoá chính, và nó phải đƣợc đánh số chỉ mục trên những trƣờng mà ta mong đợi sẽ đƣợc truy vấn nhiều nhất. Trong
trƣờng hợp của bảng Student khoá chính sẽ là trƣờng ID. Các chỉ mục phụ là trƣờng Name. Để tạo các chỉ mục và các khoá chính, ta thực hiện các thao tác sau : - Trong hộp thoại Table Structure, nhấn chuột vào nút Add Index. Hộp thoại Add
Index xuất hiện. Hình 5.6. Hộp thoại Add Index to... - Gõ IDindex trong hộp văn bản Name - Nhấn đúp chuột vào trƣờng ID trong danh sách các trƣờng có sẵn. ID đƣợc thêm vào danh sách các trƣờng có chỉ mục. Hộp đánh dấu Primary và Unique phải đƣợc chọn theo mặc định. - Nhấn OK, giờ đây ta có thể tạo thêm chỉ mục cho trƣờng Name. - Gõ tên chỉ mục Nameindex trong hộp văn bản Name - Nhấn đúp chuột trên trƣờng Name trong danh sách các trƣờng hiện có, Name đƣợc thêm vào trong danh sách các trƣờng có chỉ mục. - Bỏ chọn các hộp đánh dấu Primary và Unique, sau đó nhấn nút OK. - Nhấn nút chuột Close. Ta sẽ gặp lại hộp hội thoại Table Structure. Bƣớc 5. Tạo bảng, nhấn nút Build the Table. Bảng sẽ đƣợc tạo và thêm vào cửa sổ Database của VisData. 5.2.3. Tạo form dữ liệu tự động Để tạo form dữ liệu (frmStudent) tự động, ta sử dụng công cụ Data Form Designer... của VisData. Ta thực hiện các bƣớc sau: 134 Bƣớc 1. Từ cửa sổ VisData, chọn lệnh đơn Utility/Data Form Designer.. Hình 5.7. Mục chọn Data Form Designer tạo Form tự động xuất hiện cửa sổ Data Form Designer. Bƣớc 2. Từ cửa sổ Data Form Designer, nhập tên Student trong mục Form Name, chọn bảng Student trong mục RecordSource. Danh sách trƣờng trong bảng Student xuất hiện trong mục Available Fields. Hình 5.8. Hộp thoại Data Form Designer 135 Bƣớc 3. Chọn các trƣờng sẽ thể hiện trên form Bƣớc 4. Nhấn nút Build Form, ta thu form frmStudent nhƣ sau: Bƣớc 5. Chỉnh sửa form cho hợp lý Ta có thể sử dụng một điều khiển để truy cập dữ liệu trong cơ sở dữ liệu. Có một số điều khiển thƣờng đƣợc sử dụng nhƣ: TextBox, DBGrid, CheckBox, ComboBox,… 5.3.1. Sử dụngTextBox Tại thuộc tính DataSource của TextBox ta chọn một điều khiển dữ liệu đã đặt lên Form ví dụ Data1. Tại thuộc tính DataField ta chọn tên trƣờng hiện có trong danh sách. Khi đó dữ liệu của trƣờng đƣợc chọn sẽ hiện ra trong hộp TextBox và nếu ta thay đổi nội dung 136 của hộp TextBox thì nội dung của trƣờng cũng thay đổi theo. 5.3.2. Sử dụng DBGrid So với TextBox thì DBGrid thuận tiện hơn nhiều vì nó cho hiển thị nhiều trƣờng
và nhiều bản ghi phụ thuộc vào số cột có thể chọn và số bản ghi của tệp dữ liệu. Điều khiển này cho phép ta hiển thị dữ liệu dƣới dạng bảng. Để hiển thị dữ liệu bằng một DBGrid ta thực hiện nhƣ sau: Chọn điều kiển DBGrid trong hộp công cụ và vẽ điều khiển này lên Form. Nếu
điều khiển này chƣa có trong hộp công cụ thì ta bổ sung vào hộp công cụ bằng các cách sau: Vào thực đơn Project chọn Components. Sẽ xuất hiện hộp thoại cho phép ta bổ sung các điều khiển vào ToolBox. Trong hộp thoại Components ta chọn tab Control sau đó chọn “Microsoft Data Bound Grid Control 5.0 (SP3)”.
Điều khiển này có mặt ngay trong hộp TextBox. Tại thuộc tính DataSource ta chọn tên một điều khiển dữ liệu đã có. Tại thuộc tính DataMode chọn Bound. Khi đó nếu nguồn dữ liệu của điều khiển dữ liệu mà thay đổi thì dữ liệu trong bảng cũng thay đổi theo. 5.3.3. Sử dụng các điều khiển khác CheckBox : Điều khiển cung cấp một điều kiện đúng / sai. Nó chủ yếu rằng buộc với trƣờng Boolean, hay Yes/ No trong một cơ sở dữ liệu. DBCombo: Điều khiển cần dùng dữ liệu này hỗ trợ một danh sách xổ xuống tƣơng tự điều khiển hộp kết hợp chuẩn của Visual Basic, nhƣng nó có thể điền vào danh sách các dữ liệu lấy từ một bảng của cơ sở dữ liệu. DataGrid : Lƣới hiển thị dữ liệu của cơ sở dữ liệu theo dòng và cột. Phiên bản
thƣơng phẩm của điều khiển này là điều khiển Apex True DB Grid. DateTimePicker : Điều khiển này có thể rằng buộc ngày hoặc giờ trong một cơ sở dữ liệu. Nó giúp ngƣời sử dụng chọn ngày, giờ một cách dễ dàng dƣới dạng đồ hoạ. DBList : Điều khiển hộp danh sách này tƣơng tự điều khiển hộp danh sách chuẩn (ListBox) của Visual Basic, nhƣng nó có thể điền dữ liệu vào danh sách từ một bảng cơ sở dữ liệu.
Hierarchical FlexGrid : Điều khiển cho phép thao tác với nhiều bản ghi quan hệ
trong một điều khiển lƣới. PictureBox : Điều khiển hiển thị hình ảnh lấy từ cơ sở dữ liệu.
Label : Điều khiển này cho phép trình bày văn bản từ một trƣờng cơ sở dữ liệu, nhƣng không cho phép ngƣời sử dụng sửa đổi nó.
MaskedEdit : Điều khiển này tƣơng tự một hộp văn bản, nhƣng cung cấp một chức năng kiểm tra nội tại cũng nhƣ một hiển thị mặc định gợi ý cho ngƣời sử dụng điều kiện nhập vào hộp văn bản. 137 MSChart : Điều khiển ràng buộc biểu đồ trực tiếp với một điều khiển dữ liệu. MSFlexGrid : Điều khiển này cho ta trình bày dữ liệu dƣới dạng lƣới. Ta còn có thể sử dụng điều khiển để xử lý dữ liệu, gộp nhóm và sắp xếp. Phiên bản thƣơng
phẩm của điều khiển này là VideoSoft VSLEX. Để làm việc với CSDL ta có thể dùng điều khiển Data. Điều khiển này cho phép ta truy cập đến một CSDL bất kì trong Windows. Để có thể truy cập đến CSDL ta
thực hiện nhƣ sau: Trong hộp công cụ ToolBox, ta chọn điều khiển Data và đặt nó lên Form. Xác định các thuộc tính cho điều khiển. Viết các lệnh để truy xuất dữ liệu. 5.4.1. Các thuộc tính Điều khiển Data có các thuộc tính sau:
Name: Tên của điều khiển, nếu ta không đặt lại tên thì tên của nó là Data1, Data2... Connect: Thuộc tính này qui định môi trƣờng CSDL mà ta muốn truy cập, môi trƣờng ngầm định là Access. Ta có thê thay đổi thuộc tính này để kết nối đến các CSDL khác nhƣ Foxpro, Excel, Dbase v.v... DataBase: Tên CSDL mà ta muốn truy cập. Muốn làm việc với CSDL nào đó ta phải gán tên cùng đƣờng dẫn của nó cho thuộc tính này. Các CSDL ngầm định là đƣợc tạo bởi Access. Các CSDL trong Access có đuôi là *.mdb. Ví dụ ta chọn QTKD.mdb. Để gán cho điều khiển một CSDL nào đó khi thiết kế thì tại thuộc tính này ta kích nút Build và chọn CSDL trong một thƣ mục nào đó. Nếu khi thi hành đề án mà ta muốn thay đổi CSDL thì ta có thể dùng lệnh sau: Data1.DataBase = TenCSDL Trong đó TenCSDL là một chuỗi kí tự chứa đƣờng dẫn và tên của CSDL cần mở. Ví dụ:
Data1.DataBase = “D:\DH SPKT ND\QTKD.mdb”
RecordSource: Sau khi chọn CSDL ta phải chọn một bảng cụ thể trong CSDL.
Mỗi CSDL có tập hợp các bảng khác nhau. Ta chỉ việc mở thuộc tính này và chọn
một bảng nào đó. Nếu không muốn chọn ta có thể bỏ trống thuộc tính này và viết
câu lệnh sau: Data1.RecordSource = TableName
Trong đó Data1 là tên của điều khiển, còn TableName là tên của một bảng nào đó
trong CSDL. Ngoài ra ta có thể gán cho thuộc tính này một biểu thức là một câu 138 lệnh SQL. RecordSetType: Xác định kiểu tệp dữ liệu của điều khiển dữ liệu. Thuộc tính này có thể nhận một trong 3 giá trị sau: Table, Dynaset, SnapShot. Nếu ta chọn thuộc
tính này là Table thì ta có thể thao tác với một bảng của CSDL. Nếu ta chọn Dynaset thì ta có thể thao tác với một Query thành lập từ nhiều bảng của CSDL và có thể thay đổi tập dữ liệu (RecordSet). Còn nếu ta chọn SnapShot thì ta có thể làm việc với tệp các bảng dữ liệu tĩnh mà không thay đổi đƣợc chúng. Giá trị ngầm định của
thuộc tính này là Dynaset. ReadOnly: Thuộc tính này có 2 giá trị là True và False (ngầm định). Nếu chọn True thì ta không thể cập nhật đƣợc dữ liệu của RecordSet. Visible: Thuộc tính này cho phép (True) hay không cho phép (False) hiện ra điều
khiển dữ liệu. Nếu ta không muốn điều khiển dữ liệu hiện ra khi thi hành thì ta gán thuộc tính này là False. Exclusive: Thuộc tính này dùng để cho phép (False) hay không cho phép (True) nhiều ngƣời dùng CSDL hiện tại. 5.4.2. Cách sử dụng điều khiển Data a) Thao tác với CSDL
Khi thay đổi một CSDL (thay DataBaseName, thay Connect) hoặc thay một bảng
mới (thay đổi tính chất của RecordSource) hoặc thay đổi tính chất của ReadOnly, Exclusive... thì ta phải kích hoạt phƣơng pháp Refresh của điều khiển dữ liệu nhƣ sau: Data1.Refresh Sự thay đổi trong CSDL của điều khiển dữ liệu đƣợc thực hiện bằng lệnh trong thời gian thực hiện project. Sự thay đổi đƣợc thực hiện bằng cách gán các thuộc tính DataBaseName, Connect, RecordSetType, RecordSource của Data Control bằng một giá trị mới. Mỗi khi có sự thay đổi nhƣ thế thì phải Refresh( ) lại điều khiển dữ liệu. b) Đối tƣợng RecordSet
Tập hợp các dữ liệu đƣợc chọn thông qua thuộc tính RecordSource đƣợc gọi là RercodSet của điều khiển dữ liệu. Hay nói cách khác RecordSet là tập dữ liệu đã
chọn của điều khiển dữ liệu. Dù thuộc tính RecordSource có thay đổi nhƣ thế nào thì
tập dữ liệu của điều khiển dữ liệu vẫn là RecordSet. Đây là một đối tƣợng quan
trọng nhất của điều khiển dữ liệu.
Điều khiển CSDL chính là thực hiện thao tác trên RecordSet. Để điều khiển RecordSet ta sử dụng các phƣơng pháp và thuộc tính của nó.
Sau đây ta xét một số phƣơng thức và thuộc tính của nó: 139 Thuộc tính BOF và EOF Các thuộc tính EOF và BOF của RecordSet cho ta biết trạng thái cuối hay đầu của RecordSet. Nếu con trỏ đang ở cuối File thì giá trị RecordSet.EOF = True. Còn nếu
con trỏ đang ở đầu RecordSet thì giá trị RecordSet.BOF = True. Ví dụ: If not Data1.RecordSet.BOF Then Data1.RecordSet.MovePrevious hoặc If not Data1.RecordSet.EOF Then Data1.RecordSet.MoveNext Các phƣơng thức di chuyển trong CSDL
Muốn di chuyển trong CSDL ta sử dụng các phƣơng pháp sau: MoveFirst: Chuyển đến đầu RecordSet
MoveLast: Chuyển đến cuối RecordSet MovePrevious: chuyển đến bản ghi trƣớc RecordSet MoveNext: Chuyển đến bản ghi sau RecordSet Đối tƣợng Fields
RecordSet có các đối tƣợng con khác nhau trong đó có một đối tƣợng quan trọng và hay đƣợc dùng đó là đối tƣợng Fields. Đối tƣợng này của RecordSet cho phép ta truy cập đến từng trƣờng của bảng dữ liệu. Để trỏ tới trƣờng thứ i nào đó ta viết Fields(i). Số hiệu của các trƣờng bắt đầu từ 0 đến n-1, trong đó n là số lƣợng các trƣờng. Ngoài ra ta có thể thay đổi số hiệu trƣờng bằng tên trƣờng. Ví dụ trƣờng số 1
có tên là Makh thì 2 lệnh sau là tƣơng đƣơng. Print Data1.RecordSet.Fields(1) Print Data1.RecordSet.Fields(“Makh”) Cả 2 lệnh này đều cho ta nội dung trƣờng “Makh” của bản ghi hiện thời Thuộc tính RecordCount
Số lƣợng các bản ghi trong một bảng đƣợc lƣu trữ trong thuộc tính RecordCount. Số hiệu các bản ghi đƣợc bắt đầu từ 0 đến RecordCount – 1 Sửa và bổ sung dữ liệu
Để thêm mới, bổ sung, sửa chữa các bản ghi của CSDL ta dùng các phƣơng thức
sau:
AddNew: Thêm bản ghi mới vào cuối bảng. Khi thực hiện phƣơng pháp này thì ta
sẽ có một bản ghi trống và ta có thể bổ sung dữ liệu cho bản ghi này.
Edit: Cho phép sửa bản ghi hiện hành. Sau phƣơng pháp này ta có thể thay đổi nội
dung của bản ghi hiện tại. Update: Cập nhật bản ghi vừa đƣợc tạo hoặc sửa chữa.
Delete: Xoá bản ghi hiện hành. Sau khi xoá bản ghi ta phải di chuyển đến bản ghi khác bằng các phƣơng pháp di chuyển đã nêu ở trên. 140 Close: Dùng để đóng một bảng. 5.4.3. Ví dụ minh hoạ Tạo cơ sở dữ liệu qltv.mdb gồm 3 bảng:
Sach(Mas, Tens, Tacgia, Nhaxb, Namxb) Docgia(Madg, Tendg, Diachi, Dienthoai) Muontra(Madg, Mas, Ngaym, Ngayht, Ngayt) sử dụng Visual Data Manager. Sau đó, lập một chƣơng trình gồm 3 form: Sách- thao
tác trên bảng Sach, Độc giả- thao tác trên bảng Docgia, Mƣợn trả- thao tác trên bảng Muontra theo mẫu: Yêu cầu: 141 Form Sách tạo bằng công cụ tạo form tự động Form Độc giả sử dụng công cụ Data ở mức độ đơn giản Form Mƣợn trả lập trình sử dụng các thuộc tính, phƣơng thức của điều khiển Data, đối tƣợng Recordset, đối tƣợng Fields Giải:
Bƣớc 1.Tạo cơ sở dữ liệu qltv.mdb sử dụng Visual Data Manager (VisData) Bƣớc 2. Tạo các bảng: Sach, Docgia, Muontra, trong đó: Mas là khoá chính của bảng Sach, Madg là khoá chính của bảng Docgia, Mas và Madg là khoá ngoại của bảng Muontra. Khi tạo xong cơ sở dữ liệu qltv.mdb, ta thu đƣợc kết quả sau trong cửa sổ VisData. Bƣớc 3. Tạo form Sach sử dụng công cụ Data Form Designer - Từ cửa sổ VisData chọn Utility/Data Form Designer - Trên cửa sổ Data Form Designer, nhập tên form trong mục Form name, chọn bảng sach trong mục RecordSource, đƣa tất cả các trƣờng trong bảng Sach trong mục Available Fields sang mục Included Fields, nhƣ hình sau: 142 - Nhấn nút Build Form, sau đó nhấn Close ta thu đƣợc form sau - Gán lại giá trị thuộc tính Caption của form frmSach và các label, ta thu đƣợc form sau: Bƣớc 4. Tạo form Độc giả và lập trình sự kiện cho các nút lệnh Từ menu hệ thống chọn Project/Add Form/Open để bổ sung một form mới vào
project hiện hành, sau đó bổ sung vào form các điều khiển và gán cho một số điều khiển các giá trị theo bảng sau: Ghi TT Điều khiển Thuộc tính Giá trị chú Name frmDocgia 1 Form Caption Độc giả Name cmdfirst 2 CommandButton Caption Về đầu Name cmdpre 3 CommandButton Caption Về trƣớc Name cmdadd 4 CommandButton Caption Thêm Name cmdedit 5 CommandButton Caption Sửa Name cmddel 6 CommandButton Caption Xóa 143 Name cmdnext 7 CommandButton Caption Về sau Name cmdlast 8 CommandButton Caption Về cuối 9 Label Caption Mã độc giả 10 Label Caption Họ và tên 11 Label Caption Địa chỉ 12 Label Caption Điện thoại Databasename D:\Bai tap VB\ QLTV\qltv.mdb Name DataDocgia 13 Data RecordSource Docgia Visible False Name txtmadg 14 TextBox DataSource DataDocgia DataField Madg Name Txttendg 15 TextBox DataSource DataDocgia DataField Tendg Name txtDiachi 16 TextBox DataSource DataDocgia DataField Diachi Name txtDienthoai 17 TextBox DataSource DataDocgia DataField Dienthoai Sau khi thiết lập giá trị cho các thuộc tính ta thu đƣợc form kết quả nhƣ sau: Lập trình sự kiện cho các nút lệnh: Mở cửa sổ Code của form frmDocgia và gõ 144 vào các dòng lệnh sau: Private Sub cmdAdd_Click() If cmdadd.Caption = "Thêm" Then
datadocgia.Recordset.AddNew cmdadd.Caption = "Lưu" txtmadg.SetFocus Else
datadocgia.UpdateRecord datadocgia.Recordset.Bookmark = datadocgia.Recordset.LastModified cmdadd.Caption = "Thêm" End If
End Sub „------------------------------------------------------------------------------- Private Sub cmddel_Click() Dim traloi As Byte traloi = MsgBox("Bạn muốn xoá bản ghi này", vbYesNo + vbQuestion, "Xoá dữ liệu") If traloi = 6 Then If cmddel.Caption = "Xoá" Then datadocgia.Recordset.Delete
cmddel.Caption = "Lưu" Else datadocgia.UpdateRecord cmddel.Caption = "Xoá" cmdnext_Click End If End If End Sub „---------------------------------------------------------------------------------------Private
Sub cmdedit_Click()
If cmdedit.Caption = "Sửa" Then
datadocgia.Recordset.Edit
cmdedit.Caption = "Lưu"
txtmadg.SetFocus Else
datadocgia.UpdateRecord datadocgia.Recordset.Bookmark = datadocgia.Recordset.LastModified 145 cmdedit.Caption = "Sửa" End If End Sub
„--------------------------------------------------------------------------------------- Private Sub cmdfirst_Click() If datadocgia.Recordset.RecordCount > 0 Then datadocgia.Recordset.MoveFirst
End If End Sub „---------------------------------------------------------------------------------------Private Sub cmdlast_Click()
If datadocgia.Recordset.RecordCount > 0 Then datadocgia.Recordset.MoveLast End If End Sub „--------------------------------------------------------------------------------------- Private Sub cmdnext_Click() If datadocgia.Recordset.RecordCount > 0 Then If datadocgia.Recordset.EOF = False Then datadocgia.Recordset.MoveNext
End If End If End Sub „--------------------------------------------------------------------------------------- Private Sub cmdpre_Click() If datadocgia.Recordset.RecordCount > 0 Then If datadocgia.Recordset.BOF = False Then datadocgia.Recordset.MovePrevious End If
End If
End Sub Bƣớc 5. Tạo form Mƣợn trả và lập trình sự kiện cho các nút lệnh Từ menu hệ thống chọn Project/Add Form/Open để bổ sung một form mới vào
project hiện hành, sau đó bổ sung vào form các điều khiển và gán cho một số
điều khiển các giá trị theo bảng sau: TT Điều khiển Thuộc tính Giá trị Ghi chú 146 Name frmMuontra 1 Form Caption Mƣợn trả Name cmdfirst 2 CommandButton Caption Về đầu Name cmdpre 3 CommandButton Caption Về trƣớc Name cmdadd 4 CommandButton Caption Thêm Name cmdedit 5 CommandButton Caption Sửa Name cmddel 6 CommandButton Caption Xóa Name cmdnext 7 CommandButton Caption Về sau Name cmdlast 8 CommandButton Caption Về cuối Name cmdfind 9 CommandButton Caption Tìm Name optMadg 10 OptionButton Caption Mã độc giả Name optMas 11 OptionButton Caption Mã sách 12 Label Caption Mã độc giả 13 Label Caption Mã sách 14 Label Caption Ngày mƣợn 15 Label Caption Ngày hẹn trả 16 Label Caption Ngày trả 17 Frame Caption Tìm kiếm theo Databasename D:\Bai tap VB\ QLTV\qltv.mdb Name DataMuontra 18 Data RecordSource Muontra Visible False Name txtmadg 19 TextBox DataSource DataMuontra DataField Madg 147 20 TextBox Name txtmas DataSource DataMuontra DataField Mas Name TxtNgaym 21 TextBox DataSource DataMuontra DataField Ngaym Name txtNgayht 22 TextBox DataSource DataMuontra DataField Ngayht Name txtNgayt 23 TextBox DataSource DataMuontra DataField Ngayt Sau khi thiết lập giá trị cho các thuộc tính ta thu đƣợc form kết quả nhƣ sau: Private Sub cmdAdd_Click() If cmdadd.Caption = "Thêm" Then datamuontra.Recordset.AddNew cmdadd.Caption = "Lưu" txtmadg.SetFocus
Else
datamuontra.UpdateRecord
datamuontra.Recordset.Bookmark = datamuontra.Recordset.LastModified
cmdadd.Caption = "Thêm"
End If End Sub „--------------------------------------------------------------------------------------------- Private Sub cmddel_Click() 148 Dim traloi As Byte traloi = MsgBox("Ban muon xoa ban ghi nay khong", vbYesNo + vbQuestion, "Xoá dữ liệu")
If traloi = 6 Then If cmddel.Caption = "Xoá" Then datamuontra.Recordset.Delete cmddel.Caption = "Lưu"
Else datamuontra.UpdateRecord cmddel.Caption = "Xoá" cmdnext_Click
End If End If End Sub „-------------------------------------------------------------------------------------------Private Sub cmdedit_Click() If cmdedit.Caption = "Sửa" Then datamuontra.Recordset.Edit cmdedit.Caption = "Lưu" txtmadg.SetFocus
Else datamuontra.UpdateRecord datamuontra.Recordset.Bookmark = datamuontra.Recordset.LastModified cmdedit.Caption = "Sửa" End If End Sub „-------------------------------------------------------------------------------------------Private Sub cmdfind_Click() If optmas.Value = True Then
Dim masach As String * 3
masach = InputBox("Nhập mã sách cần tìm")
datamuontra.Recordset.FindFirst "mas = '" & masach & "'"
If datamuontra.Recordset.NoMatch = True Then
MsgBox "Không tìm thấy", , "Kết quả tìm kiếm" End If
Else Dim madocgia As String * 3 149 madocgia = InputBox("Nhập mã độc giả cần tìm") datamuontra.Recordset.FindFirst "madg = '" & madocgia & "'"
If datamuontra.Recordset.NoMatch = True Then
MsgBox "Không tìm thấy", , "Kết quả tìm kiếm"
End If
End If
End Sub
„-------------------------------------------------------------------------------------------
Private Sub cmdfirst_Click()
If datamuontra.Recordset.RecordCount > 0 Then
datamuontra.Recordset.MoveFirst
End If
End Sub
„-------------------------------------------------------------------------------------------
Private Sub cmdlast_Click()
If datamuontra.Recordset.RecordCount > 0 Then
datamuontra.Recordset.MoveLast
End If
End Sub
„-------------------------------------------------------------------------------------------Private Sub cmdnext_Click() If datamuontra.Recordset.RecordCount > 0 Then If datamuontra.Recordset.EOF = False Then datamuontra.Recordset.MoveNext End If End If End Sub „-------------------------------------------------------------------------------------------Private Sub cmdpre_Click() If datamuontra.Recordset.RecordCount > 0 Then If datamuontra.Recordset.BOF = False Then
datamuontra.Recordset.MovePrevious
End If
End If End Sub Ta có thể dùng DAO ( đối tượng truy vấn cơ sở dữ liệu –Data Access Object) 150 để thao tác với cơ sở dữ liệu thông qua lập trình với Visual Basic. Với DAO, ta có thể thi hành các câu truy vấn, cập nhật giá trị trong các bảng cơ sở dữ liệu và tạo cấu trúc cơ sở dữ liệu bao gồm các bảng , các câu truy vấn chứa sẵn và mối quan hệ giữa các bảng. DAO đƣợc các nhà lập trình Visual Basic sử dụng để truy cập các cơ sở dữ liệu trên máy tính cá nhân hay Client / Server. Nhƣng với sự ra đời của ADO, giờ đây nó chỉ thích hợp để dùng cơ sở dữ liệu Jet mà thôi. Còn đối với việc phát triển các hệ
Client / Server mới, chủ yếu ta tận dụng thế mạnh của ADO. 5.5.1. Tham chiếu đến thư viện đối tượng của DAO DAO cung cấp nhiều đối tƣợng cho phép ứng dụng truy cập dữ liệu trên cơ sở dữ
liệu. Để dùng các đối tƣợng đƣợc cung cấp bởi DAO, ta thực hiện các thao tác sau: Từ menu Project, chọn References. Hộp thoại References xuất hiện. Từ danh sách các thƣ viện, chọn và tích vào “Microsoft DAO 3.5.1 Object Library”. Nhấn OK. Giờ đây, ta có thể dùng đối tƣợng đƣợc cung cấp bởi thƣ viện đối tƣợng DAO. Mô hình cây phân cấp của đối tƣợng DAO: 151 Hình 5.9. Mô hình cây phân cấp của đối tƣợng DAO Giả sử cho cơ sở dữ liệu Education.mdb trong đó có bảng Student có cấu trúc nhƣ sau: TT Tên trƣờng Kiểu dữ liệu Độ rộng Ghi chú 1 ID Text 5 Mã sinh viên (khoá chính-IDindex) 2 Name Text 30 Họ tên (Nameindex) 3 Age Byte 1 Tuổi 4 Sex Boolean 1 Giới tính 5 Add Text 30 Địa chỉ Yêu cầu: Lập một chƣơng trình, trong đó có form Student cho phép ngƣời sử dụng thực hiện các thao tác: duyệt danh sách sinh viên, bổ sung, sửa, xoá, tìm kiểm thông tin về sinh viên đƣợc lƣu trữ trong bảng Student. Form Student có dạng: TT Điều khiển Thuộc tính Giá trị Ghi chú Name frmStudent 1 Form Caption Student Name lblID 2 Label Caption ID Name lblName 3 Label Caption Name Name lblAge 4 Label Caption Age Name lblSex 5 Label Caption Sex Name lblAdd 6 Label Caption Add 152 Name txtID 7 Textbox 8 Textbox Name txtName 9 Textbox Name txtAge 10 Textbox Name txtAdd Name cmdFirst Chuyển về bản ghi đầu 11 CommandButton tiên Caption &First cmdPrevious Name 12 CommandButton Chuyển về bản ghi tiếp
theo &Previous Caption Name cmdAdd Bổ sung một bản ghi 13 CommandButton Caption &Add Name cmdEdit Sửa nội dung bản ghi 14 CommandButton hiện hành Caption &Edit Name cmdDelete 15 CommandButton Xoá bản ghi hiện hành Caption &Delete Name cmdSearch 16 CommandButton Tìm kiếm bản ghi Caption &Search Name cmdNext Chuyển về bản ghi tiếp 17 CommandButton theo Caption &Next Name cmdLast Chuyển về bản ghi cuối 18 CommandButton cùng Caption &Last Name optMale 19 OptionButton Caption Male Name optFemale 20 OptionButton Caption Female Name optID 21 OptionButton Caption ID Name optName 22 OptionButton Caption Name Name fraSearchfor 23 Frame Caption Search for 5.5.2. Đối tượng Workspace Đối tƣợng Workspace cung cấp phƣơng thức OpenDatabase dùng để mở cơ sở dữ liệu. Phƣơng thức này trả về một đối tƣợng Database. Cú pháp:
OpenDatabase(dbName, [options], [readonly],[connect]) Tham số Mô tả 153 dbName Tên cơ sở dữ liệu cần mở (đây là tham số bắt buộc) Options Nếu tham số này là True, cơ sở dữ liệu mở trong chế độ loại trừ; không ai có thể mở cơ sở dữ liệu trong chế độ loại trừ. Nếu giá trị này là False, những ngƣời khác có thể mở cơ sở dữ liệu. Readonly Nếu tham số này là True, ta không thể sửa đổi cơ sở dữ liệu. Connect Là một xâu ký tự chỉ ra cách thức kết nối với cơ sở dữ liệu; chuỗi thƣờng chỉ đƣợc dùng cho những nguồn dữ liệu Client / Server và ODBC. Ví dụ: Để mở cơ sở dữ liệu Education.mdb ta viết nhƣ sau: Dim db As Database Set db = OpenDatabase("..\..\Education.mdb") 5.5.3. Đối tượng Database Đối tƣợng Database là nơi để ứng dụng bắt đầu phần lớn các truy cập cơ sở dữ liệu của nó. Sử dụng phƣơng thức Execute của đối tƣợng Database để thi hành một câu lệnh SQL trên SQL cho phép: cập nhật, xoá hay sao chép bản ghi, sửa cấu trúc dữ liệu. 5.5.4 Đối tượng Recordset Đối tƣợng Recordset dùng để thao tác với các bản ghi trong DAO. a) Các thuộc tính EOF(end of file): nhận giá trị True khi ta di chuyển quá bản ghi cuối cùng của Recordset. BOF(begin of file): nhận giá trị True khi ta di chuyển đến một vị trí trƣớc
bản ghi thứ nhất trong Recordset. Nếu cả EOF và BOF đều nhận giá trị True có nghĩa là Recordset không chứa bản ghi nào. RecordCount: Dùng để xác định số bản ghi trong một Recordset. Giá trị của
RecordCount sẽ không hợp lệ nếu ta chƣa chuyển đến bản ghi cuối cùng 154 trong Recordset. Fields: Là một thuộc tính kiểu Collection, dùng để truy cập vào các trƣờng trong một bản ghi b) Các phƣơng thức
Tạo đối tƣợng Recordset
Để tạo một đối tƣợng Recordset ta sử dụng phƣơng thức OpenRecordset của đối
tƣợng Database. OpenRecordset là một hàm trả về một đối tƣợng Recordset. Cú pháp: OpenRecordset(Recordsource,Options) Tham số Options của phƣơng thức OpenRecordset xác định một số cách thức thao tác với bản ghi. Hằng Ý nghĩa dbOpentable Trong một workspace của Microsoft Jet, tạo một đối tƣợng
Recordset kiểu bảng (bảng đƣợc đánh chỉ mục chỉ sử dụng một bảng) dbOpenDynamic Trong một workspace kiểu ODBCDirect, mở một đối tƣợng Recordset kiểu dynamic (cập nhật đƣợc dữ liệu khi ngƣời khác sửa đổi và truy vấn dữ liệu qua nhiều bảng) dbOpenDynaset Mở một đối tƣợng kiểu Dynaset (tham chiếu đến recordset của nhiều bảng hoăc từ nhiều cơ sở dữ liệu khác) dbOpenForwardonly Mở một đối tƣợng Recordset mà con trỏ của nó chỉ có thể di chuyển tới Ví dụ:
Dim db As Database Dim rs As Recordset Set db = OpenDatabase("..\..\Education.mdb") Set rs = db.OpenRecordset("Student") Tham số bắt buộc duy nhất của phƣơng thức OpenRecordset là nguồn dữ liệu.
Đây là chuỗi ký tự, theo nguyên tắc là tên của một bảng hoặc một định nghĩa truy
vấn chứa sẵn. Nhƣng nó cũng có thể là một câu lệnh SELECT SQL. Ví dụ:
Set rs = db.OpenRecordset("SELECT * FROM Student")
Nếu trong một câu lệnh SQL có chứa thành phần dạng xâu ký tự, ta dùng cặp „ „
để biểu diễn xâu ký tự đó tránh bị nhầm sang cặp dấu “ “. Ví dụ:
Ta có câu lệnh SQL: 155 SELECT * FROM Student WHERE [ID]="IT003" Khi đƣa vào phƣơng thức OpenRecordset ta viết: Set rs = db.OpenRecordset("SELECT * FROM Student" & _ " WHERE [ID]='IT003'") Nếu thành phần của câu lệnh SQL đƣợc truyền vào từ biến, ví dụ từ một biến có tên SID thì ta viết: '" & SID &"'. Ví dụ:
Set rs = db.OpenRecordset("SELECT * FROM Student" & _ " WHERE [SID]='" & SID &"'") Thêm một bản ghi mới
AddNew: là phƣơng thức dùng để thêm một bản ghi mới, trắng vào cuối của
recordset. Để bổ sung bản ghi mới vào trong đối tƣợng Recordset ta thực hiện 3 bƣớc sau: Bƣớc 1. Gọi phƣơng thức AddNew của RecordSet để thêm một bản ghi mới, trắng vào cuối của recordset. Bƣớc 2. Gán giá trị cho các trƣờng trong bản ghi mới bằng cách sử dụng câu lệnh gán mà ta thƣờng dùng với các trƣờng cơ sở dữ liệu. Bƣớc 3. Dùng phƣơng thức Update để ghi bản ghi mới vào cơ sở dữ liệu. Ví dụ: Thủ tục Input_Data và sự kiện Click của nút Add sau đây cho phép thêm một bản ghi mới vào bảng Student.
Private Sub Input_Data()‟Thủ tục Input_Data để gán giá trị cho các trường rs.Fields("ID") = txtID.Text rs.Fields("Name") = txtName.Text rs.Fields("Age") = Val(txtAge.Text) If optMale.Value = True Then rs.Fields("Sex") = True Else rs.Fields("Sex") = False End If
rs.Fields("Add") = txtAdd.Text End Sub
„--------------------------------------------------------------
Private Sub cmdAdd_Click() If cmdAdd.Caption = "&Add" Then txtID.Text = ""
txtName.Text = "" txtAge.Text = "" 156 txtAdd.Text = "" txtID.SetFocus rs.AddNew
cmdAdd.Caption = "&Save" Else Call Input_Data rs.Update
cmdAdd.Caption = "&Add" End If End Sub Duyệt qua các bản ghi MoveFirst : là phƣơng thức cho phép di chuyển đến bản ghi đầu tiên trong recordset. MoveNext : là phƣơng thức cho phép di chuyển đến bản ghikế tiếp trong recordset. MovePrevious : là phƣơng thức cho phép di chuyển về bản ghi trƣớc đó trong recordset. MoveLast: là phƣơng thức cho phép di chuyển đến bản ghi cuối cùng trong recordset. Move : là phƣơng thức cho phép di chuyển đến bản ghi đã đƣợc chỉ định trƣớc. Ví dụ: Sự kiện Click của các nút lệnh: First, Previous, Next, Last cho phép duyệt các bản ghi trong bảng Student. Private Sub cmdFirst_Click() If rs.RecordCount > 0 Then rs.MoveFirst Call Output_Data End If End Sub
„--------------------------------------------------------------
Private Sub cmdLast_Click()
If rs.RecordCount > 0 Then
rs.MoveLast
Call Output_Data End If
End Sub
„-------------------------------------------------------------- 157 Private Sub cmdNext_Click() If rs.RecordCount > 0 And rs.EOF = False Then rs.MoveNext
If rs.EOF = False Then Call Output_Data End If End Sub „--------------------------------------------------------------
Private Sub cmdPrevious_Click() If rs.RecordCount > 0 And rs.BOF = False Then rs.MovePrevious If rs.BOF = False Then Call Output_Data
End If End Sub Sửa nội dung bản ghi
Ta có thể sửa nội dung bản ghi hiện hành trong một đối tƣợng Recordset bằng cách dùng phƣơng thức Edit và Update của Recordset. Muốn sửa đổi giá trị của một trƣờng trong một Recordset, theo các bƣớc sau : Bƣớc 1. Dùng các phƣơng thức duyệt của đối tƣợng Recordset để di chuyển đến bản ghi cần sửa đổi. Bƣớc 2. Thi hành phƣơng thức Edit của Recordset.
Bƣớc 3. Dùng thuộc tính Fields của đối tƣợng Recordset để gán giá trị cho trƣờng trong bản ghi. Bƣớc 4. Lƣu bản ghi vào cơ sở dữ liệu bằng cách dùng phƣơng thức Update của Recordset. Ví dụ: Sự kiện Click của nút Edit sau cho phép sửa đổi nội dung bản ghi hiện hành trong bảng Student. Private Sub cmdEdit_Click() If cmdEdit.Caption = "&Edit" Then txtID.SetFocus
rs.Edit
cmdEdit.Caption = "&Save"
Else
Call Input_Data
rs.Update cmdEdit.Caption = "&Edit"
End If End Sub 158 Tìm kiếm bản ghi Để tìm một bản ghi trong một Recordset, ta dùng một trong bốn phƣơng thức tìm kiếm của đối tƣợng Recordset: FindFirst FindLast FindNext FindPrevious Cú pháp của bốn phƣơng thức nhƣ nhau - để sử dụng một trong bốn phƣơng thức tìm kiếm này, ta truyền một mệnh đề WHERE của SQL vào phƣơng thức chỉ ra thông tin ta cần tìm kiếm. Sau khi thi hành phƣơng thức, bản ghi hiện hành trong đối tƣợng Recordset trở thành bản ghi thoả mãn tiêu chí WHERE. Nếu tìm kiếm không
định vị đƣợc bản ghi yêu cầu, thuộc tính NoMatch của đối tƣợng Recordset có giá trị là True. Loại phƣơng thức ta dùng cũng xác định cách thức tìm thấy bản ghi. Ví dụ, nếu dùng FindFirst , bộ máy cơ sở dữ liệu sẽ di chuyển đến bản ghi thứ nhất trong recordset thoả tiêu chí. FindNext và FindPrevious, ngƣợc lại, tìm các bản ghi hiện hành. Điểm quan trọng cần lƣu ý là, khác với một câu truy vấn SELECT của SQL, tìm kiếm không sinh ra một recordset. Khi bộ máy cơ sở dữ liệu tìm ra bản ghi thoả tiêu chí tìm kiếm, nó di chuyển đến bản ghi đó; bản ghi trở thành bản ghi hiện hành. Nếu không có bản ghi tìm thấy, bản ghi hiện hành sẽ đƣợc giữ nguyên và thuộc tính NoMatch của đối tƣợng Recordset có giá trị là True.
Ví dụ: Để tìm kiếm thông tin về sinh viên có mã sinh viên (SID) hoặc họ tên sinh viên (SName) đƣợc nhập từ bàn phím, ta có thể tìm kiếm tuần tự sử dụng phƣơng thức FindFirst nhƣ trong sự kiện Click của nút Search sau: Private Sub cmdSearch_Click() n = rs.Bookmark If optID.Value = True Then Dim SID As String * 5 SID = InputBox("Enter the Student ID")
rs.FindFirst "ID = '" & SID & "'"
If rs.NoMatch = True Then
MsgBox "Not found", vbOKOnly + vbExclamation, "Search result"
rs.Bookmark = n
Else Call Output_Data End If Else 159 Dim SName As String * 30 SName = InputBox("Enter the Student Name") rs.FindFirst "Name = '" & SName & "'"
If rs.NoMatch = True Then MsgBox "Not found", vbOKOnly + vbExclamation, "Search result" rs.Bookmark = n Else
Call Output_Data End If End If End Sub Chú ý: Chỉ có thể sử dụng phƣơng thức tìm kiếm tuần tự khi đối tƣợng Recordset đƣợc tạo bởi câu lệnh SQL. Nếu đối tƣợng Recordset đƣợc tạo dạng bảng thì chỉ có thể tìm kiếm theo chỉ mục bằng phƣơng thức Seek. Tìm kiếm bản ghi theo chỉ mục
Để tiến hành một tìm kiếm trên một chỉ mục, trƣớc hết bảng phải có một chỉ mục. Sau đó ta dùng phƣơng thức Seek của đối tƣợng Recordset. Cú pháp: Seek Toán_tử, Biểu_thức Ví dụ: Để tìm kiếm thông tin về sinh viên có mã sinh viên (SID) hoặc họ tên sinh viên (SName) đƣợc nhập từ bàn phím, ta có thể tìm kiếm theo chỉ mục sử dụng
phƣơng thức Seek nhƣ trong sự kiện Click của nút Search nhƣ sau: Private Sub cmdSearch_Click() n = rs.Bookmark If optID.Value = True Then Dim SID As String * 5 SID = InputBox("Enter the Student ID") rs.Index = "IDindex" rs.Seek "=", SID If rs.NoMatch = True Then
MsgBox "Not found", vbOKOnly + vbExclamation, "Search result"
rs.Bookmark = n
Else
Call Output_Data
End If Else
Dim SName As String * 30 SName = InputBox("Enter the Student Name") 160 rs.Index = "Nameindex" rs.Seek "=", SName If rs.NoMatch = True Then
MsgBox "Not found", vbOKOnly + vbExclamation, "Search result" rs.Bookmark = n Else Call Output_Data
End If End If End Sub Điểm hạn chế của phƣơng thức Seek là khả năng tìm kiếm trên một trƣờng duy
nhất và nó phải đƣợc đánh chỉ mục. Ngoài ra nó chỉ sử dụng các toán tử sau : >; <; >=; <=; = Khác với phƣơng thức Seek, vốn hạn chế thì phƣơng thức Find cho phép ta sử dụng các toán tử có sẵn của SQL nhƣ Like , In . Xoá bản ghi
Để xoá bản ghi hiện hành, ta dùng phƣơng thức Delete của đối tƣợng Recordset, phƣơng thức Delete thực hiện việc xoá ngay bản ghi hiện hành khỏi bảng mà không cần gọi phƣơng thức Update nhƣ đối với việc bổ sung và sửa nội dung bản ghi. Vì vậy, trong lập trình trƣớc khi gọi phƣơng thức Delete ta cần đối thoại với ngƣời sử
dụng, và chỉ xoá bản ghi khi đã đƣợc ngƣời sử dụng xác nhận lại nhƣ trong thủ tục sự kiện Click của nút Delete sau: Private Sub cmdDelete_Click() Dim answer As Byte answer = MsgBox("Do you want to delete the record?", vbYesNo + vbQuestion, "Delete data") If answer = 6 Then rs.Delete If rs.RecordCount > 0 Then
If rs.EOF = False Then
rs.MoveNext
Else
rs.MoveFirst
End If Call Output_Data
End If 161 End Sub Đóng Recordset
Ta thực hiện điều này khi chƣơng trình hoàn tất sử dụng đối tƣợng Recordset, sử dụng phƣơng thức Close. Ví dụ: rs.Close „rs là một Recordset Điểm đặc biệt quan trọng khi đóng một đối tƣợng Recordset là nếu đối tƣợng đặt một khoá (lock) trên bảng. Đóng một Recordset sẽ nhả khoá ứng dụng thiết lập trên đối tƣợng cơ sở dữ liệu, cho phép ngƣời sử dụng khác truy cập đến nó. Trong đối tƣợng khác trong DAO nhƣ: Workspace, Connection, Database và QueryDef cũng có phƣơng thức Close. 5.5.4. Đối tượng Field Đối tƣợng Field thể hiện một trƣờng trong một cấu trúc dữ liệu. Các đối tƣợng TableDef, Recordset, Relation và Index đều chứa các tập hợp trƣờng. Ta có thể lấy giá trị của một trƣờng bằng cách kiểm tra giá trị của thuộc tính Value của một đối tƣợng Field. (Bởi vì thuộc tính Value là thuộc tính mặc định của đối tƣợng Field, ta chỉ cần tham chiếu đến đối tƣợng Field; ta không nhất thiết phải tham chiếu tƣờng minh đến thuộc tính Value). ADO (ActiveX Data Objects) là công nghệ truy cập cơ sở dữ liệu hƣớng đối tƣợng tƣơng tự nhƣ DAO. Hiện nay, ADO đƣợc Microsoft xem kỹ thuật chính để truy cập dữ liệu từ Web Server. ADO sử dụng OLEDB nhƣ là trình cung cấp dữ liệu cơ sở. Trình cung cấp OLE DB cho phép ngƣời lập trình có thể truy xuất dữ liệu từ cả hai nguồn: quan hệ và phi quan hệ. VB6.0 đã hỗ trợ các trình cung cấp cục bộ cho SQL Server, Oracle và Microsoft Jet/Access. 5.6.1. Tham chiếu đến ADO Để có thể sử dụng kỹ thuật ADO kết nối đến CSDL chúng ta phải tham chiếu đến đối tƣợng này vì ADO không phải là điều khiển có sẵn trong hộp công cụ. Chúng ta thực hiện đƣa ADO vào hộp công cụ nhƣ sau: Bƣớc 1. Từ menu Project, chọn mục Components, hoặc chúng ta có thể chọn bằng 162 cách kích chuột phải vào hộp công cụ, sau đó chọn mục Components: Hình 5.10. Đƣa them điều khiển vào hộp công cụ Bƣớc 2. Tích chọn “Microsoft ADO Data Control 6.0 (OLEDB)” trong một danh sách điều khiển. Bƣớc 3. Nhấn nút Apply, và đóng cửa sổ lại. Lúc này trên hộp công cụ xuất hiện biểu tƣợng . Điều khiển ADO đã đƣợc đƣa vào hộp công cụ. 5.6.2. Mô hình đối tượng của ADO Connection Command Errors Properties Parameters Properties Recordset Fields Properties Properties Hình 5.11. Mô hình đối tƣợng của ADO Mô hình ADO có 3 đối tƣợng cốt lõi:
Connection: kết nối CSDL thật sự.
Command: thực thi các câu truy vấn dựa vào kết nối dữ liệu.
RecordSet: là tập các bản ghi đƣợc chọn từ câu truy vấn thông qua đối tƣợng Command. 5.6.3. Các đối tượng trong mô hình ADO 163 a) Đối tƣợng Connection Đối tƣợng Connection cung cấp phƣơng thức Open dùng để thiết lập kết nối với nguồn dữ liệu. Để thực hiện điều này ta cần phải thông báo với ADO thông tin kết
nối với dạng chuỗi theo kiểu chuỗi kết nối của ODBC. Thuộc tính ConnectionString thực hiện điều này. Ngoài ra ta còn có thể chọn trình cung cấp bằng cách quy định giá trị của thuộc tính Provider của đối tƣợng. Để nối kết với dữ liệu, ta cần xác định trình cung cấp OLE DB và chuỗi kết nối. Nếu
không xác định đƣợc hai yếu tố này, ta sẽ sử dụng trình cung cấp mặc định là ODBC: MSDASQL. Một số trình cung cấp có sẵn: Microsoft OLEDB cho các trình điều khiển ODBC. Microsoft OLEDB cho Oracle. Microsoft Jet 3.51 OLEDB (Access). Microsoft Jet 4.0 OLEDB (Access) Microsoft OLEDB cho SQL Server. Microsoft OLEDB cho các dịch vụ thƣ mục. Ví dụ:
Đối với trình cung cấp ODBC, thuộc tính ConnectionString có thể là một DSN. Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Provider = "MSDASQL" cn.ConnectionString = "DSN=Education" cn.Open hay là kết nối DSN cấp thấp: Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Provider = "MSDASQL" cn.ConnectionString = "DRIVER={SQL Server};” & _ “DATABASE=Baigiang;UID=myuser;PWD=mypassword;"
cn.Open Trong trƣờng hợp này việc kết nối với cơ sở dữ liệu Server đƣợc thực hiện nhanh
hơn vì chƣơng trình không cần đọc thông tin về các DSN trên máy Client, tuy nhiên
thông tin về nguồn cơ sở dữ liệu lại kết chặt với chƣơng trình đã biên dịch.
Để kết nối với cơ sở dữ liệu Access, ta dùng trình cung cấp Jet với chuỗi kết nối là đƣờng dẫn đến tập tin .mdb 164 Dim cn As ADODB.Connection
Set cn = New ADODB.Connection
cn.Provider = "MicroSoft.Jet.OLEDB.4.0" cn.ConnectionString = "D:\data\Education.mdb" cn.Open
Đối với cơ sở dữ liệu SQL Server, ta có thể dùng trình cung cấp SQLOLEDB.1, trong trƣờng hợp này, chuỗi kết nối tƣơng tự nhƣ trƣờng hợp kết nối dùng trình cung cấp ODBC không có DSN, tuy nhiên ta không cần xác định giá trị của DRIVER: Dim cn as ADODB.Connection
Set cn = New ADODB.Connection cn.Provider = “SQLOLEDB.1” cn.ConnectionString = “DATABASE=DBHH;” & _ “SERVER=www;UID=user;PWD=user”
cn.Open Mở nối kết nguồn dữ liệu
Để phát các yêu cầu đến nguồn dữ liệu sử dụng ADO, ta cần mở kết nối đến nguồn dữ liệu đó bằng phƣơng thức Open của đối tƣợng Connection. Cú pháp đầy đủ nhƣ sau: connection.Open [connect], [userid], [password] Tất cả các tham số của phƣơng thức Open đều là tùy chọn, nếu nhƣ các thông số này đã đƣợc xác định thông qua các thuộc tính khác của đối tƣợng Connection thì ta không cần mô tả chúng ở đây. Đóng nối kết nguồn dữ liệu
Khi đã hoàn thành tất cả các thao tác liên quan đến nối kết này, ta cần phải đóng nối kết một cách tƣờng minh thông qua phƣơng thức Close của đối tƣợng Connection. connection.Close Đóng nối kết một cách tƣờng minh sẽ đảm bảo rằng tất cả các tài nguyên liên quan đến nối kết này trên Server cũng nhƣ Client đều đƣợc giải phóng một cách hợp lý. Xác định vị trí con trỏ
Con trỏ (Cursor): một tập các bản ghi đƣợc trả về cho chƣơng trình. Vị trí con trỏ
đƣợc xác định nhờ thuộc tính CursorLocation (có ở cả đối tƣợng Recordset). Có 2
giá trị có thể chỉ định: adUseClient: con trỏ phía Client. adUseServer: con trỏ phía Server (mặc định). 165 Thực thi các câu truy vấn hành động
Các câu truy vấn hành động (Insert, Update, Delete) đƣợc thực hiện nhờ phƣơng
thức Execute của đối tƣợng Connection; ngoài ra phƣơng thức này cũng có thể đƣợc sử dụng để thực thi các thủ tục lƣu trữ sẵn trong cơ sở dữ liệu hay các câu SELECT. Cú pháp phƣơng thức này nhƣ sau: Nếu không có kết quả trả về:
connection.Execute CommandText, RecordsAffected, Options Có kết quả trả về:
Set recordset = connection.Execute (CommandText, RecordsAffected, Options) Trong đó: - connection: Đối tƣợng Connection. - recordset: Đối tƣợng Recordset là kết quả trả về của phƣơng thức Execute, tuy nhiên, ngƣời ta thƣờng ít khi sử dụng cách này. Thay vào đó, ngƣời ta thƣờng sử
dụng phƣơng thức Open của đối tƣợng Recordset.
- CommandText: là một chuỗi xác định câu truy vấn hành động, SELECT, thủ tục lƣu trữ sẵn hay tên một bảng trong cơ sở dữ liệu. - RecordEffected: Tùy chọn, là một số nguyên dài (Long) xác định trình cung cấp trả về bao nhiêu bản ghi thỏa điều kiện. - Options: Tùy chọn, là một số nguyên dài (Long) xác định trình cung cấp sẽ đánh giá các đối số của CommandText nhƣ thế nào. Thuộc tính Mode: Xác định trình cung cấp có thể hạn chế truy cập đến cơ sở dữ liệu khi có một recordset đang mở. Các giá trị có thể là: Hằng số Giá trị Ý nghĩa Mặc định, chỉ định quyền hạn chƣa adModeUnknown 0 thiết lập hay không thể xác định adModeRead Mở Recordset với quyền chỉ đọc 1 adModeWrite Mở Recordset với quyền chỉ ghi 2 adModeReadWrite Mở Recordset với quyền đọc/ghi 3 adModeShareDenyRead Ngăn ngƣời khác mở kết nối với 4 quyền chỉ đọc adModeShareDenyWrite 8 Ngăn ngƣời khác mở kết nối với
quyền chỉ ghi adModeShareExclusive Ngăn ngƣời khác mở kết nối 12 adModeShareDenyNone 16 Ngăn ngƣời khác mở kết nối với bất
cứ quyền nào 166 b) Đối tƣợng Recordset
Để có thể khởi tạo một đối tƣợng Recordset ta có thể thực hiện một trong hai
cách: Cách 1. Dùng phƣơng thức Execute của đối tƣợng Connection. Tuy nhiên, cách này ta chỉ tạo đƣợc các Recordset chỉ đọc và chỉ có thể di chuyển tới.
Cách 2. Xác lập các thông số thích hợp cho đối tƣợng Recordset rồi thực thi phuơng thức Open của đối tƣợng Recordset. Điều này đƣợc thực hiện nhờ các bƣớc: Bƣớc 1. Sau khi khởi tạo đối tƣợng Connection, chỉ định Recordset là của đối tƣợng Connection trên.
Bƣớc 2. Thiết lập các thuộc tính thích hợp của Recordset (Source, LockType…). Bƣớc 3. Thực thi câu truy vấn nối kết nhờ phƣơng thức Open. Thuộc tính CursorType
CursorType là thuộc tính dùng để xác định loại con trỏ đƣợc trả về từ cơ sở dữ
liệu. Các giá trị có thể nhận: Hằng Giá trị Mô tả adOpenForwardOnly Chỉ có thể di chuyển phía trƣớc 0 Không thể thấy các bản ghi do ngƣời dùng khác thêm vào nhƣng adOpenKeyset 1 khi họ xóa hay sửa đổi bản ghi sẽ làm ảnh hƣởng đến các bản ghi ta đang làm việc. Có thể thấy toàn bộ sự thay đổi do adOpenDynamic 2 ngƣời dùng khác tác động. Bản sao tĩnh của tập mẩu tin. Mọi adOpenStatic 3 sự thay đổi của ngƣời dùng khác ta không thấy đƣợc Thuộc tính LockType
Thuộc tính LockType xác định cách thức khóa bản ghi trong Recordset. Dùng thuộc tính này khi muốn kiểm soát cách thức cập nhật bản ghi với nhiều ngƣời dùng trong cơ sở dữ liệu. Hằng Giá trị Mô tả adLockReadOnly 1 Mặc định - Chỉ đọc. Khóa trang bi quan. Bản ghi trong
RecordSet bị khóa khi bắt đầu sửa đổi adLockPessimistic 2 & tiếp tục khóa cho đến khi thi hành phƣơng thức Update hay di chuyển 167 sang bản ghi khác. Khóa trang lạc quan. Bản ghi chỉ bị khóa ngay lúc thi hành phƣơng thức adLockOptimistic 3 Update hay di chuyển sang bản ghi
khác. Khóa trang lạc quan hàng loạt. Hỗ trợ adLockBatchOptimistic 4 cập nhật nhiều bản ghi cùng một lúc. Thuộc tính Source
Đây là một chuỗi xác định câu truy vấn để lấy dữ liệu, có thể là tên của bảng hay
tên của thủ tục lƣu trữ sẵn.
Thuộc tính ActiveConnection
Đây là một thuộc tính đối tƣợng xác định Recordset là của nối kết nào trong
chƣơng trình.
Ví dụ:
Đƣa vào form frmBook điều khiển lƣới DataGrid (Microsoft DataGrid Control
6.0), khai báo các đối tƣợng: Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Tiếp theo, đƣa các dòng lệnh sau vào sự kiện Form_Load
Private Sub Form_Load()
Set cn = New ADODB.Connection
cn.Provider = "Microsoft.Jet.OLEDB.3.51"
cn.ConnectionString = "d:\Bai tap VB\Library\Data\Library.mdb"
cn.Open
Set rs = New ADODB.Recordset
rs.Source = "SELECT * FROM Book"
Set rs.ActiveConnection = cn
rs.CursorLocation = adUseClient
rs.Open
Set DataGrid1.DataSource = rs
End Sub 168 Kết quả thực thi chƣơng trình này nhƣ sau: Thêm bản ghi mới Mở Recordset Thi hành phƣơng thức AddNew Gán giá trị cho các trƣờng trong bản ghi của Recordset Lƣu lại bản ghi bằng cách thi hành phƣơng thức Update (hay UpdateBatch). Cập nhật bản ghi Mở Recordset Thực hiện câu lệnh truy vấn để nhận về các bản ghi thích hợp. Di chuyển đến bản ghi cần cập nhật lại giá trị. Gán lại giá trị cho các trƣờng. Thi hành phƣơng thức Update (hay UpdateBatch tùy thuộc vào LockType).
Lƣu ý: Chế độ khóa bản ghi mặc định trong ADO là chỉ đọc, vì vậy ta phải đổi thuộc tính LockType của đối tƣợng Recordset sang chế độ soạn thảo trƣớc khi thi hành cập
nhật hay thêm mới mẩu tin. Thuộc tính CursorLocation
Xác định tập bản ghi trả về từ cơ sở dữ liệu đƣợc lƣu ở đâu (Server hay Client, Server là mặc định). Thuộc tính cũng giống thuộc tính CursorLocation của đối tƣợng Connection. Ngắt kết nối
Khi chúng ta dùng con trỏ phía Client, ta có khả năng ngắt kết nối với Server cơ sở dữ liệu mà vẫn tiếp tục làm việc với dữ liệu. Cách này cho phép ứng dụng trở nên linh hoạt hơn bởi vì nhiều ngƣời dùng có thể làm việc với cùng một dữ liệu tại một thời điểm nếu nhƣ họ không có nối kết với server. Để ngắt nối kết với Server, ta quy định thuộc tính ActiveConnection của đối tƣợng Recordset là Nothing. Ví dụ: Dim cn As ADODB.Connection Private Sub Form_Load()
Set cn = New ADODB.Connection
cn.Provider = "Microsoft.Jet.OLEDB.3.51"
cn.ConnectionString = "F:\Data\GiangDay.mdb"
cn.Open 169 End Sub
Public Function GetList (strState As String) _
As ADODB.Recordset
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset Set rs.ActiveConnection = cn rs.CursorLocation = adUseClient
rs.LockType = adLockBatchOptimistic rs.CursorType = adOpenKeyset rs.Open strState Set rs.ActiveConnection = Nothing
Set GetList = rs Set rs = Nothing End Function Để thi hành cùng một hành động trên một mẩu tin, ta sửa đổi lại các thuộc tính
của đối tƣợng Recordset. rs.LockType = adLockBatchOptimistic rs.CursorType = adOpenKeyset Chúng ta thiết lập giá trị các thuộc tính lại nhƣ trên để xác nhận rằng Recordset có thể nối kết lại để cập nhật về sau. Sau đó, ta sẽ thiết lập một hàm nhận Recordset ngắt kết nối làm tham biến để tạo một đối tƣợng Recordset khác cập nhật dữ liệu. Public Sub WriteData(rsDis As ADODB.Recordset) Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset Set rs.ActiveConnection = cn rs.Open rsDis, cn rs.UpdateBatch End Sub Gọi thực thi thủ tục WriteData: Private Sub cmdWrite_Click() WriteData GetList("Select * From THanghoa") End Sub c) Đối tƣợng Command
Đây là đối tƣợng đƣợc ngƣời lập trình sử dụng khi muốn thi hành các thủ tục lƣu
trữ sẵn hay những câu truy vấn có tham số.
Với đối tƣợng Command ta có thể thi hành một số công việc nhƣ sau: Sử dụng thuộc tính CommandText để định nghĩa các đoạn Text thi hành đƣợc.
Thông thƣờng thuộc tính này dùng để thiết lập một câu lệnh SQL hoặc một lời
gọi thủ tục lƣu trữ sẵn, hay những dạng khác mà trình cung cấp hỗ trợ Xây dựng chuỗi các đối số của câu truy vấn cũng nhƣ các tham số của các thủ tục 170 lƣu trữ sẵn thông qua đối tƣợng Parameter hoặc tập hợp Parameters. Thực hiện một câu truy vấn và trả về đối tƣợng Recordset thông qua phƣơng thức Execute. Xác định kiểu của đối tƣợng Command để nâng cao hiệu quả thông qua thuộc tính CommandType. Xác định số giây mà trình cung cấp phải chờ khi thi hành một đối tƣợng Command thông qua thuộc tính CommandTimeOut. Các kiểu của đối tƣợng Command đƣợc trình bày trong bảng dƣới đây: Hằng Ý nghĩa Định giá thuộc tính CommandText dƣới dạng Text của adCmdText một câu lệnh hoặc một lời gọi thủ tục lƣu trữ sẵn. Định giá thuộc tính CommandText nhƣ là tên của một adCmdTable bảng khi tất cả các trƣờng của bảng đó sẽ đƣợc trả về bởi câu lệnh truy vấn nội tại. Định giá thuộc tính CommandText nhƣ là tên của một adCmdTableDirect bảng khi mà tất cả các trƣờng của bảng đó sẽ đƣợc trả về. Định giá thuộc tính CommandText nhƣ là tên của một adCmdStoredProc thủ tục lƣu trữ sẵn. Chỉ định rằng thuộc tính CommandText là một câu lệnh hoặc một thủ tục lƣu trữ sẵn không trả về bất kỳ adExecuteNoRecords dòng nào (ví dụ nhƣ lệnh thêm mới dữ liệu …). Cấu trúc này luôn bao hàm adCmdText, adCmdStoredProc. Thuộc tính Parameter đƣợc xác lập thông qua hai phƣơng thức CreateParameter và Append Set parameter = command.CreateParameter (Name, Type, _ Direction, Size, Value) Name: tùy chọn, chuỗi xác định tên của đối tƣợng Parameter. Type, Direction: giá trị xác địn kiểu của đối tƣợng Parameter Size: giá trị xác định độ dài tối đa của giá trị đối tƣợng Parameter bằng ký tự hoặc Byte. Value: biến xác định giá trị của Parameter truyền.
Những giá trị có thể của thuộc tính Direction: Hằng Mô tả 171 adParamUnknown Không biết chiều của Parameter. adParamInput Mặc định, xác định đây là tham số đầu vào. adParamOutput Tham số đầu ra. adParamInputOutput Vừa là tham số đầu vào vừa là tham số đầu ra. adParamReturnValue Đây là giá trị trả về. Phƣơng thức Append dùng để đƣa đối tƣợng Parameter vừa tạo vào tập hợp. Chúng ta sẽ xét qua ví dụ dau đây: Public Sub ActiveConnectionX() 172 Dim cnn1 As ADODB.Connection
Dim cmdByRoyalty As ADODB.Command
Dim prmByRoyalty As ADODB.Parameter
Dim rstByRoyalty As ADODB.Recordset
Dim rstAuthors As ADODB.Recordset
Dim intRoyalty As Integer
Dim strAuthorID As String
Dim strCnn As String
' Định nghĩa 1 đối tượng command cho một thủ tục lưu trữ sẵn
Set cnn1 = New ADODB.Connection
cnn1.Provider = "SQLOLEDB.1"
cnn1.ConnectionString = "DATABASE=Pubs;" & _
"SERVER=(local);UID=user;PWD=user;"
cnn1.Open
Set cmdByRoyalty = New ADODB.Command
Set cmdByRoyalty.ActiveConnection = cnn1
cmdByRoyalty.CommandText = "byroyalty"
cmdByRoyalty.CommandType = adCmdStoredProc
cmdByRoyalty.CommandTimeout = 15
' Định nghĩa đối số đầu vào cho thủ tục lưu trữ
intRoyalty = Trim(InputBox( "Enter royalty:"))
Set prmByRoyalty = New ADODB.Parameter
prmByRoyalty.Type = adInteger
prmByRoyalty.Size = 3
prmByRoyalty.Direction = adParamInput
prmByRoyalty.Value = intRoyalty
cmdByRoyalty.Parameters.Append prmByRoyalty
' Tạo một recordset bằng cách thi hành đối tượng Command.
Set rstByRoyalty = cmdByRoyalty.Execute()
' Mở bảng Authors để lấy tên hiển thị
Set rstAuthors = New ADODB.Recordset rstAuthors.Open "authors", cnn1, , , adCmdTable Debug.Print "Authors with " & intRoyalty & _
" percent royalty" Do While Not rstByRoyalty.EOF strAuthorID = rstByRoyalty!au_id Debug.Print , rstByRoyalty!au_id & ", ";
rstAuthors.Filter = "au_id = '" & _ strAuthorID & "'" Debug.Print rstAuthors!au_fname & “ - “ & _ rstAuthors!au_lname
rstByRoyalty.MoveNext Loop rstByRoyalty.Close rstAuthors.Close cnn1.Close End Sub d) Đối tƣợng Field
Dùng đối tƣợng Field và tập hợp Fields khi ta muốn truy cập giá trị của một trƣờng của một Recordset nào đó, kỹ thuật này tƣơng tự nhƣ đối với DAO. Chúng ta có thể sử dụng kỹ thuật ADO để kết nối đến CSDL và sử dụng các điều khiển thông thƣờng khác nhƣ: TextBox, Label, CheckBox… để ràng buộc dữ liệu (data binding) và kết xuất dữ liệu. Hình 5.12. Điều khiển Adodc 173 Tên mặc định của điều khiển này là Adodc1 (chúng ta có thể đổi thành tên khác). a) Một số thuộc tính của điều khiển Adodc:
ConnectionString: Chuỗi kết nối đến CSDL
CommandType: Kiểu lệnh thi hành
CursorType: Kiểu trỏ
LockType: Kiểu khoá
RecordSource: Nguồn dữ liệu
b) Truy cập đến dữ liệu trong cơ sở dữ liệu
Chúng ta thực hiện 2 bƣớc: Bƣớc 1 là tạo kết nối đến CSDL, bƣớc 2 là thiết lập
nguồn dữ liệu (RecordSource) từ CSDL cho điều khiển Adodc.
Bƣớc 1: Tạo một kết nối (Connection) đến CSDL:
Kích chuột chọn Adodc1, trong cửa sổ Properties chọn thuộc tính
, chúng ta kích chuột vào nút này sẽ ConnectionString, khi đó xuất hiện nút
xuất hiện ra cửa sổ Property Pages. Hình 5.13. Thuộc tính ConnectionString trong cửa sổ thuộc tính Cửa sổ Property Pages mở ra: 174 Hình 5.14. Hộp thoại Property Pages Trong cửa sổ Property Pages có 3 lựa chọn: - Use Data Link File: Cho phép chúng ta nạp những thông số kết nối đã đƣợc lƣu trƣớc trong MDL file (Microsoft Data Link). - Use ODBC Data Source Name: Chúng ta có thể chọn một Data Source Name
(DSN) từ những DSN trong ODBC của máy chúng ta (chúng ta phải thiết lập
DSN này trong ODBC trƣớc), hoặc chúng ta có thể tạo mới DSN ngay lúc này bằng cách nhấp chọn “New” và cấu hình cho DSN này. - Use Connection String: Chúng ta phải chỉ ra một chuỗi kết nối trực tiếp.
Chúng ta sử dụng lựa chọn thứ ba là “Use Connection String”, sau đó kích chuột vào nút Build, chọn Provider là “Microsoft Jet 4.0 OLE DB Provider” để kết nối
đến CSDL Access, rồi nhấn nút Next. Nếu kết nối đến CSDL SQL Server thì chọn Microsoft OLE DB Provider for SQL Server, rồi nhấn nút Next. Giả sử chúng ta chọn Provider là “Microsoft Jet 4.0 OLE DB Provider” để kết nối đến CSDL Microsoft Access, sau đó nhấn nút Next. 175 Hình 5.15. Hộp thoại Data Link Properties
Sau khi nhấn nút Next, cửa sổ chuyển sang thẻ Connection: Tại hộp “Select or enter a database name”, chúng ta nhấn nút ở bên phải để tìm đến CSDL Microsoft Access có tên là QTKD.mdb. Hình 5.16. Cửa sổ Select Access Database Sau khi chọn xong, chúng ta kích vào nút “Open” để chỉ ra tên của CSDL cần kết nối. Sau đó chúng ta nhấn nút “Test Connection” phía dƣới để kiểm tra xem kết nối có đƣợc thiết lập tốt không? Nếu kết nối thành công thì cửa sổ sau sẽ xuất hiện: Bƣớc 2: Thiết lập nguồn dữ liệu (Record source) từ CSDL cho điều khiển Adodc1: Trong cửa sổ Property- Adodc1 chọn thuộc tính RecordSource, khi đó xuất hiện 176 nút , kích chuột vào nút này sẽ hiện ra cửa sổ Property Pages. Khi chọn hộp ComboBox “Command Type” (Kiểu lệnh thi hành) xổ xuống sẽ có các lựa chọn sau:
8 – adCmdUnknown: Kiểu lệnh không xác định. 1 – adCmdText: Kiểu lệnh thi hành một câu truy vấn (câu SELECT) trên nguồn dữ liệu, câu SELECT này đƣợc ghi ở hộp “Command Text (SQL)” bên dƣới, kết quả trả về tập hợp các bản ghi thoả mãn câu SELECT trên.
2 – adCmdTable: Tên của một bảng (table) cụ thể , kết quả trả về toàn bộ các bản ghi của bảng. 4 – adCmdStoredProc: Kiểu lệnh thi hành một Stored Procedure trên CSDL, tên của Stored Procedure này (có thể có tham số đi kèm) ghi ở hộp “Command Text (SQL)”
bên dƣới. Tuỳ thuộc chúng ta chọn kiểu lệnh nào thì hộp Combobox “Table or Stored Procedure Name” bên dƣới có thể Enable hoặc không. Để truy xuất danh sách khách hàng trong CSDL, chúng ta chọn Command Type là “2 – adCmdTable” , sau đó chọn bảng tblDS_KH trong hộp combobox và nhấn nút OK: Sau khi thực hiện xong việc kết nối và chọn nguồn dữ liệu để hiển thị từ ADO
Data Control.
Bƣớc 3. Sử dụng các điều khiển thông dụng nhƣ: Textbox, Checkbox…để ràng buộc
dữ liệu với ADO Data Control này.
Do bảng tblDS_KH có 8 trƣờng: Makh (mã khách hàng), Tenkh (họ tên khách hàng), Diachi (địa chỉ khách hàng), Dienthoai (điện thoại), Fax (số Fax), Company
(Tên công ty), Utien (ƣu tiên), Email (địa chỉ thƣ điện tử) nên khi thiết kế Form
chúng ta dùng 8 TextBox và đặt tên cho chúng là TxtMakh, TxtTenkh, TxtDiachi, TxtDienthoai, TxtFax, TxtCompany, TxtUtien, TxtEmail. Chúng ta cũng sử dụng 8 177 Label đặt trƣớc 8 TextBox này với các tên là LblMakh, LblTenkh, LblDiachi, LblDienthoai, LblFax, LblCompany, LblUtien, LblEmail. Ngoài ra, ta sử dụng một Label có tên là LblDS có Caption là “Danh sách khách hàng”. Tiếp theo, chúng ta phải ràng buộc mỗi TextBox với từng trƣờng (field) cụ thể của bảng (Table) tblDS_KH dựa vào hai thuộc tính quan trọng của TextBox là 178 DataSource và DataField. Ở đây DataSource của 8 textbox đều là Adodc1: Đối với thuộc tính DataField của txtmakh, ta nhấp chuột vào nút của hộp Combobox để hiển thị tất cả các trƣờng trong bảng tblDS_KH: makh, tenkh, diachi,
dienthoai, fax, company, utien, email, rồi nhấp chuột chọn trƣờng “makh”: Ta làm tƣơng tự cho các textbox còn lại. (Start) hoặc nhấn phím F5, ta thấy 179 Thực thi chƣơng trình bằng cách nhấp nút
kết quả của chƣơng trình nhƣ sau: Nhấn chuột vào ô sẽ hiển thị bản ghi kế tiếp sau. Nhấn chuột vào ô sẽ hiển thị bản ghi cuối cùng. Nhấn chuột vào ô sẽ hiển thị bản ghi ở ngay trƣớc bản ghi hiện thời. Nhấn chuột vào ô sẽ hiển thị bản ghi đầu tiên. 5.6.4. Ví dụ minh hoạ Cho cơ sở dữ liệu qltv.mdb chứa trong thƣ mục “D:\Bai tap VB\ADO Form luoi”,
gồm 3 bảng dữ liệu:
Sach(Mas, Tens, Tacgia, Nhaxb, Namxb)
Docgia(Madg, Tendg, Diachi, Dienthoai)
Muontra(Madg, Mas, Ngaym, Ngayht, Ngayt)
Hãy lập một chƣơng trình (project), trong đó có form Sách dùng để thao tác với
bảng Sach theo mẫu sau: Giải:
Bƣớc 1. Đƣa điều khiển ADODC, DataCombo, DataGrid vào hộp công cụ: Từ menu 180 hệ thống, chọn Project/Components, đánh dấu kiểm vào các mục chọn nhƣ hình sau: Khi đó trên hộp công cụ sẽ có các điều khiển sau: Bƣớc 2. Đƣa vào form điều khiển ADODC và gán giá trị cho một số thuộc tính sau: Name = AdodcSach Connectiontring = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Bai tap VB\ADO Form luoi\qltv.mdb;Persist Security Info=False” RecordSource = Sach Bƣớc 3. Đƣa vào form điều khiển DataGrid và thực hiện các thao tác sau: Gán giá trị cho một số thuộc tính sau:
Name = DataGridSach AllowAddNew =True AllowDelete =True DataSource =AdodcSach Nhấn phải chuột vào điều khiển DataGrid chọn Edit, sau đó nhấn phải chuột vào
điều khiển DataGrid 3 lần nữa, mỗi lần chọn Insert để thêm 3 cột vào DataGrid Tiếp tục nhấn phải chuột vào điều khiển DataGrid chọn Property để mở hộp thoại 181 Property Pages, nhƣ hình sau: Trên hộp thoại Property Pages, lần lƣợt chọn cột trong mục Column, sau đó gán
tiêu đề cho cột trong mục Caption và chọn nguồn dữ liệu (tên trƣờng) trong mục DataField. Có thể thiết lập Font, màu, định dạng cho các cột bằng cách chọn các Tab: Font, Color, Format...trên hộp thoại Property Pages. Bƣớc 4. Đƣa thêm điều khiển Adodc thứ hai vào form và thiết lập các thuộc tính
sau: Name = AdodcTacgia Connectiontring = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Bai tap VB\ADO Form luoi\qltv.mdb;Persist Security Info=False” RecordSource = “Select distinct Tacgia from Sach”
Bƣớc 5. Đƣa thêm điều khiển Adodc thứ ba vào form và thiết lập các thuộc tính sau: Name = AdodaNhaxb Connectiontring = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Bai tap VB\ADO Form luoi\qltv.mdb;Persist Security Info=False”
RecordSource = “Select distinct Nhaxb from Sach” Bƣớc 6. Đƣa điều khiển Frame lên form rồi thiết lập giá trị cho thuộc tính Caption của nó là “Lọc theo”. Sau đó, đƣa điều khiển 2 điều khiển DataCombo lên trên Frame đó, rồi thiết lập giá trị cho các thuộc tính của hai điều khiển DataCombo. Đối với DataCombo thứ nhất: Name: cboTacgia BoundColumn =Tacgia DataField =Tacgia DataSource =AdodcTacgia ListField =Tacgia RowSource =AdodcTacgia Đối với DataCombo thứ hai, ta thiết lập giá trị cho một số thuộc tính sau: Name = cboNhaxb BoundColumn = Nhaxb
DataField = Nhaxb
DataSource = AdodcNhaxb
ListField =Nhaxb
RowSource = AdodcNhaxb
Bƣớc 7. Đƣa thêm 8 điều khiển CommandButton và 2 điều khiển Label lên form,
xác định vị trí và các thƣớc của tất cả các điều khiển trên form cho phù hợp, rồi thiết
lập một số thuộc tính của các điều khiển mới đƣa lên form theo bảng sau: TT Điều khiển Thuộc tính Giá trị Ghi chú 182 1 CommandButton Name cmdfirst Caption Về đầu Name cmdpre 2 CommandButton Caption Về trƣớc Name cmdadd 3 CommandButton Caption Thêm Name cmdedit 4 CommandButton Caption Sửa Name cmddel 5 CommandButton Caption Xóa Name cmdundo 6 CommandButton Caption Bỏ lọc Name cmdnext 7 CommandButton Caption Về sau Name cmdlast 8 CommandButton Caption Về cuối 9 Label Caption Tác giả 10 Label Caption Nhà xuất bản Đến đây ta thu đƣợc form có dạng sau Bƣớc 8. Mở cửa sổ Code của form frmSach và gõ vào các dòng lệnh sau: Dim Cnn As New ADODB.Connection
Private Sub cbonhaxb_Click(Area As Integer)
Dim x As String
If cbotacgia.Text = "" Then
x = "select * from sach where nhaxb like '" & Trim(cbonhaxb.Text) & "'"
Else 183 x = "select * from sach where (tacgia like '" & Trim(cbotacgia.Text) & "'" &
") and ( nhaxb like '" & Trim(cbonhaxb.Text) & "')"
End If
Dim rsxem As New ADODB.Recordset rsxem.CursorLocation = adUseClient rsxem.Open x, Cnn, adOpenStatic, adLockReadOnly
Set DataGrid1.DataSource = rsxem End Sub „--------------------------------------------------------------------------------------- Private Sub cbotacgia_Click(Area As Integer)
Dim x As String If cbonhaxb.Text = "" Then x = "select * from sach where tacgia like '" & Trim(cbotacgia.Text) & "'" Else
x = "select * from sach where (tacgia like '" & Trim(cbotacgia.Text) & "'" & ") and ( nhaxb like '" & Trim(cbonhaxb.Text) & "')" End If Dim rsxem As New ADODB.Recordset rsxem.CursorLocation = adUseClient rsxem.Open x, Cnn, adOpenStatic, adLockReadOnly Set DataGrid1.DataSource = rsxem End Sub „---------------------------------------------------------------------------------------
Private Sub cmdadd_Click() Adodc1.Recordset.AddNew End Sub „--------------------------------------------------------------------------------------- Private Sub cmddel_Click() Adodc1.Recordset.Delete End Sub „--------------------------------------------------------------------------------------- Private Sub cmdedit_Click()
If cmdedit.Caption = "Söa" Then
cmdedit.Caption = "L u"
Else
Adodc1.Recordset.Update
Form1.Refresh cmdedit.Caption = "Söa"
End If End Sub 184 „--------------------------------------------------------------------------------------- Private Sub cmdfirst_Click() Adodc1.Recordset.MoveFirst
End Sub „--------------------------------------------------------------------------------------- Private Sub cmdlast_Click() Adodc1.Recordset.MoveLast
End Sub „--------------------------------------------------------------------------------------- Private Sub cmdnext_Click() Adodc1.Recordset.MoveNext
End Sub „--------------------------------------------------------------------------------------- Private Sub cmdpre_Click() Adodc1.Recordset.MovePrevious End Sub Private Sub cmdundo_Click() Set DataGrid1.DataSource = Adodc1 End Sub „---------------------------------------------------------------------------------------
Private Sub Form_Load() Cnn.ConnectionString = "provider=microsoft.jet.oledb.4.0; data source= " & App.Path & "\qltv.mdb" Cnn.Open End Sub 185 Bƣớc 9. Chạy chƣơng trình (Nhấn F5), ta thu đƣợc form kết quả nhƣ sau: 5.7.1. Tạo liên kết dữ liệu sử dụng Data View Cửa sổ Data View, cho phép ta làm việc với một cơ sở dữ liệu không cần phải sử dụng công cụ bên ngoài hay công cụ bổ sung Add-in. Để dùng cửa sổ Data View ta thực hiện các bƣớc sau: Bƣớc 1. Từ menu View ta chọn Data View, hay nhấn nút Data View trên thanh công cụ chuẩn. Cửa sổ Data View xuất hiện, cửa sổ cho ta hai thƣ mục, Data Links và Data Environment Connections. Bƣớc 2. Trong cửa sổ Data View, nhấn nút phải chuột lên thƣ mục Data Links. Từ menu bật ra, chọn Add a Data Link, cửa sổ Data Link Properties xuất hiện. Bƣớc 3. Chọn trình cung cấp Microsoft Jet, rồi nhấn Next. Tab Connection xuất hiện. Nhập đƣờng dẫn và tên tập tin cơ sở dữ liệu ta muốn dùng. Bƣớc 4. Nhấn nút Test Connection tạo phần dƣới của cửa sổ để kiểm tra kết nối đến cơ sở dữ liệu. Bƣớc 5. Nhấn OK, liên kết dữ liệu đƣợc thiết lập, và cửa sổ Data View nhắc ta nhập 186 vào tên của liên kết. Gõ vào QTKD, rồi nhấn Enter. Data links (Liên kết dữ liệu) cung cấp một cách nhìn tóm lƣợc về nguồn dữ liệu. Mỗi lần ta tạo một liên kết dữ liệu, ta có thể duyệt bằng cách sử dụng phần tử trong danh sách tóm lƣợc. Thực hiện điều này bằng cách nhấn vào dấu cộng bên trái mỗi phần tử. Cơ sở dữ liệu mở rộng đầy đủ trong cửa sổ xem dữ liệu. 5.7.2. Tạo trình thiết kế môi trường dữ liệu sử dụng Data View Ta có thể tạo một thiết kế Data Environment để quản lý một cách trực quan kết nối với một cơ sở dữ liệu. Khi ta có một thiết kế Data Environment đƣợc chứa trong tập tin nhị phân của ứng dụng lúc biên dịch, vì vậy không cần lo ngại về những phụ thuộc bên ngoài. Để thêm một thiết kế Data Environment vào ứng dụng dùng cửa sổ Data View, theo các bƣớc sau : Bƣớc 1. Trong của sổ Data View, nhấn nút Add Data Environment. Data Environment mới sẽ xuất hiện trong project. Một kết nối mặc định, gọi là Connection1 xuất hiện trong thiết kế Có thể điều chỉnh một cách thủ công kết nối mặc định trong một thiết kế Data
Environment để nó trỏ đến cơ sở dữ liệu. Nhƣng cơ sở dữ liệu đã có sẵn trong cửa sổ
Data View, ta chỉ cần kéo và thả bảng vào thiết kế. Để thực hiện điều này, ta làm 187 nhƣ sau: Khởi động cửa sổ Data view, chọn một bảng trong thƣ mục Tables (nhƣ là tblDS_KH) Kéo bảng lên trên thiết kế Data Environment. Một kết nối mới gọi là Connection2
xuất hiện trong thiết kế, với bảng xuất hiện dƣới. Đến đây, ta có thể kéo các bảng
khác vào thiết kế nếu cần. Khi hoàn tất, ta có : 5.7.3. Tạo báo cáo dữ liệu Thiết lập báo cáo trên cơ sở dữ liệu không chỉ đơn giản là hiển thị dữ liệu từ cơ sở dữ liệu. Hầu hết các báo cáo cơ sở dữ liệu liên quan một số hoạt động khác trên dữ liệu nhƣ:
Truy vấn dữ liệu để trả về, hiển thị và in ra những phần ta muốn. Ta gọi là lọc Sắp xếp dữ liệu sao cho nó xuất hiện theo một thứ tự có ý nghĩa. Phân nhóm dữ liệu để hiển thị một cách gọn gàng. Có nhiều phƣơng pháp để tạo báo cáo nhƣ: Sử dụng thiết kế Data Report, sử dụng Microsoft Access để làm báo cáo, sử dụng Crystal report để lập báo cáo v.v.... Ở đây ta sử dụng thiết kế Data Report. Thiết kế Data Report là cách trực quan để tạo ra những báo cáo thích hợp trong
môi trƣờng phát triển Visual Basic. Để tạo một báo cáo sử dụng Data Report, ta theo 188 các bƣớc sau:
Bƣớc 1. Trong đề án, từ menu Project, chọn Add Data Report. Thiết kế DataReport
đƣợc thêm vào đề án. Data Report chứa một số phân đoạn: Report Header hiển thị một lần ở đầu báo cáo. Report Foodter hiển thị một lần ở cuối báo cáo Page Header hiển thị tại đầu mỗi trang Page Footer hiển thị tại cuối mỗi trang Detail section hiển thị các dòng dữ liệu Một hay nhiều group header hay footer hiển thị tại đầu hoặc cuối của một phân đoạn nhóm. Dễ nhất là tạo DataReport dùng trên thiết kế Data Environment. Với Data Environment ta có thể dùng cách kéo thả để thiết kế báo cáo. Mỗi lần tạo ra thiết kế DataReport, ta phải ràng buộc nó với một cơ sở dữ liệu để hiển thị dữ liệu. Ta thực hiện điều này thông qua một bộ gồm các điều khiển ràng buộc chỉ hoạt động trong ngữ cảnh thiết kế DataReport.
Các điều khiển trực quan của thiết kế DataReport bao gồm: Điều khiển nhãn Điều khiển hộp văn bản Điều khiển ảnh Điều khiển đoạn thẳng và điều khiển hình dạng Điều khiển hàm cho phép chèn các tính toán tóm tắt và báo cáo 189 Bƣớc 2. Tạo thiết kế Data Environment Bƣớc 3. Trong trình thiết kế Data Environment ta chọn và kéo rê trƣờng từ thiết
kế Data Environment vào phân đoạn Detail của thiết kế DataReport. Một điều khiển
nhãn và một hộp văn bản ràng buộc với trƣờng dữ liệu xuất hiện trên thiết kế
DataReport. Ví dụ: Bƣớc 4. Xác định nguồn dữ liệu cho báo cáo: Chọn thiết kế DataReport bằng cách chọn vào nó trong danh sách drop-down của cửa sổ Properties, trong cửa sổ Properties, quy định thuộc tính DataSource của DataReport là tên của trình thiết kế Data Environment. Bƣớc 5. Xem trƣớc báo cáo bằng cách sử dụng phƣơng thức Show. Ví dụ nếu
DataReport đƣợc gọi là drCustomer thì ta có thể chạy nó bằng dòng lệnh: drCustomer.Show 190 Báo cáo đƣợc hiển thị nhƣ hình dƣới đây: 5.7.3. Tạo báo cáo dữ liệu sử dụng đối tượng Command a) Tạo kết nối cơ sở dữ liệu Bƣớc 1: Tạo một project (dự án) mới Bƣớc 2: Để tạo một report, ta phải xác định dữ liệu nào sẽ sử dụng trong report. Ta chèn một Data Environment vào dự án nhờ việc chọn Project\Add Data Environment. Cửa sổ Data Environment xuất hiện: Bƣớc 3: Nhấn phải chuột vào Connection1 và chọn Rename rồi đổi tên của nó thành tk_muonsach; nhấp chuột phải vào tk_sach_nhaxb và chọn mục Properties,
hộp thoại Properties hiện ra: Bƣớc 4: Ta sẽ tạo kết nối đến cơ sở dữ liệu Qltv.mdb có trong thƣ mục QLTV. Do đó ta nhấn đúp chuột vào Microsoft Jet 4.0 OLE DB Provider vì ta sử dụng cơ sở dữ liệu Access xuất hiện hộp thoại Data Link Properties, đánh đƣờng dẫn đến cơ sở dữ 191 liệu qltv.mdb trong thƣ mục QLTV. Nhƣ hình sau: Bƣớc 5: Nhấp nút Test Connection để kiểm tra xem nối kết có thành công hay không? Nếu thành công sẽ xuất hiện hộp thông báo: 192 Bƣớc 6: Nhấn nút Ok để đóng hộp thông báo, sau đó nhấn nút OK để đóng hộp
thoại Data Link Properties
b) Tạo đối tƣợng Command
Bƣớc 7: Sau khi đã xác định Data Environment Connection, ta có thể xác định
Command, Command lƣu kết nối tới bảng dữ liệu và những trƣờng sẽ đƣợc dùng
trong report. Nhấp nút phải chuột vào vùng trống trong cửa sổ Data Environment và
chọn mục Add Command, một đối tƣợng Command1 xuất hiện trong kết nối
tk_sach_nhaxb.
Bƣớc 8: Nhấn phải chuột vào Command1, chọn Rename và đổi tên cho nó
comnhaxb, chọn Connection là tk_sach_nhaxb, trong phần DataBase Object chọn
kiểu lấy dữ liệu là Table; sau đó trong phần Object Name chọn bảng sach, nhƣ trong
hình sau: Nhấn nút OK để đóng hộp thoại comnhaxb Properties. c) Tạo một báo cáo đơn giản
Bƣớc 9: Bây giờ ta sẽ tạo một báo cáo để hiển thị dữ liệu đã xác định trong Data Environment. Để làm điều này, nhấp phải chuột vào Project trong cửa sổ Project Explorer; rồi chọn Add\Data Report; sau đó đặt tên của report này lại là drnhaxb và thiết lập giá trị cho một số thuộc tính của nó nhƣ sau: DataSource =
DataEnvironment1, DataMember = comnhaxb (trong cửa sổ Properties). Bƣớc kế tiếp ta đóng tất cả các cửa sổ ngoại trừ 2 cửa sổ DataEnvironment1 và drnhaxb. Bƣớc 10: Bƣớc này chỉ đơn giản là nhấp chọn và kéo các trƣờng từ Data Environment, mục comnhaxb vào Data Report. Đối với report này, nhấp chọn
comnhaxb giữ và kéo nó vào mục Detail của report drnhaxb. Bƣớc 11: Khi ta kéo thả các trƣờng vào trong phần Detail của report, một RptLabel chứa tên trƣờng và một RptTextBox cho phép nhập liệu xuất hiện trong phần Detail. Do đó, ta chỉ để các trƣờng ở mục Detail của report, còn các tiêu đề cột (tƣơng ứng với các trƣờng) ta kéo chúng lên phần Page Header của report, đƣa các RptShape vào để vẽ các hình chữ nhật tạo thành report dạng bảng. Điều chỉnh vị trí, kích thƣớc, font chữ của các đối tƣợng trên report cho phù hợp. Bƣớc 12: Thêm một RptLabel vào phần Header của report; sau đó thay đổi thuộc tính Caption của nó thành DANH MỤC SÁCH; thuộc tính Font là .vntimeH, cỡ 16
Bƣớc 13: Nhấp chuột phải vào mục report Footer và chọn tùy chọn Insert Control | Current Page Number để chèn số trang vào; tiếp đến chọn Insert Control | Total Number of Pages để chèn tổng số trang của report. Bƣớc 14: Đến đây, phần thiết kế report coi nhƣ hoàn tất, repota bây giờ có dạng 193 Bƣớc 15: Lƣu report và tạo giao diện cho chƣơng trình để hiển thi report 5.7.4. Tạo báo cáo phân nhóm Ta có thể nhóm dữ liệu lại theo một nội dung nào đó. Chẳng hạn, đối với DANH
MỤC SÁCH ở trên, ta có thể nhóm thành từng nhóm theo từng nhà xuất, do đó ta làm theo các bƣớc sau: Bƣớc 1. Trong DataEnvironment1, ta nhấn phải chuột vào đối tƣợng Command comnhaxb, chọn properties để làm xuất hiện hộp thoại comnhaxb Properties, sau đó
chọn Tab Group trên hộp thoại. Bƣớc 2. Trên Tab Group, đánh dấu kiểm chọn Group Command Object, trong ô Fields In Command nháy đúp chuột vào trƣờng nhaxb để đƣa nó sang ô Fields Used For Grouping, nhƣ hình sau: Bƣớc 3: Nhấn nút OK để đóng hộp thoại. Cửa sổ DataEnvironment1 bây giờ nhƣ sau: Bƣớc 4: Nhấn chuột phải vào report, chọn Insert Group Header/Footer để bổ sung 194 phần đầu và cuối nhóm vào report. Bƣớc 5: Từ cửa sổ DataEnvironment1, giữ, kéo và thả trƣờng nhaxb từ mục Summary fields in comnhaxb_Grouping vào phần Group Header, gán lại thuộc tính
Caption cho RptLabel tƣơng ứng với trƣờng nhaxb là “Nhà xuất bản”, thuộc tính Font cho nó và RptTextBox là .vntime cỡ 12. Report bây giờ nhƣ sau: Bƣớc 6: Lƣu report với tên là drnhaxb sau đó đƣa vào form1 điều khiển
CommandButton với Name = cmdshow, Caption = Preview, và viết sự kiện Click
của nó nhƣ sau: Private Sub cmdshow_Click()
drnhaxb.Show
End Sub 195 Bƣớc 7: Chạy chƣơng trình (nhấn F5), nhấn chuột vào nút Preview, ta thu đƣợc kết
quả sau: 5.7.5. Tạo báo cáo có hàm tính toán Ta có thể đƣa vào các hàm tính toán trên các bản ghi, hoặc trên các nhóm. Ở ví dụ
trên, giả sử với mỗi nhà xuất bản ta muốn thống kê số lƣợng sách. Để làm điều này
ta thực hiện các bƣớc sau:
Bƣớc 1. Trong DataEnvironment1, ta nhấn phải chuột vào đối tƣợng Command
comnhaxb, chọn properties để làm xuất hiện hộp thoại comnhaxb Properties, sau đó
chọn Tab Aggregates trên hộp thoại.
Bƣớc 2. Trên Tab Aggregates, nhấn chuột vào nút Add để them một hàm. Chọn
Count trong mục Function, chọn ma strong phần field để đếm số lƣợng sách của mỗi
nhà xuất, nhƣ hình sau: Bƣớc 3: Nhấn nút OK để đóng hộp thoại 196 Bƣớc 4: Kéo trƣờng Aggregate1 từ cửa sổ Environment1 vào phần Group Footer,
sửa thuộc tính Caption của RptLabel tƣơng ứng với trƣờng đó thành “Tổng số sách”
Bƣớc 5: Lƣu report lại. Report bây giờ nhƣ sau Bƣớc 6: Nhấn F5 chạy chƣơng trình, sau đó nhấn nút Preview để hiển thị report, ta thu đƣợc kết quả sau: Ví dụ:
Ví dụ tổng hợp: Sử dụng Visual Basic 6.0 xây dựng chƣơng trình quản lý thu nộp học phí theo các yêu cầu sau: a) Tạo cơ sở dữ liệu gồm các bảng sau:
Hocphi(Sophieu, Masv, Sotien, Ngaynop, Noidung) Lop(Tenlop, Namvaohoc, Siso)
Sinhvien(Masv, Hoten, Ngaysinh, Gioitinh, Diachi, Lop)
b) Tạo form chính của chƣơng trình có menu theo mẫu 197 c) Lập trình xử lý các yêu cầu Quản lý hồ sơ sinh viên Quản lý danh sách lớp theo form mẫu Quản lý thông tin thu nộp học phí 198 Quản lý thu nộp học phí theo lớp Thống kê thu nộp học phí theo sinh viên Đƣa ra danh sách sinh viên chƣa nộp học phí theo lớp 199 Report danh sách sinh viên chƣa nộp học phí theo lớp In danh sách lớp 200 Report danh sách sinh viên theo lớp Giải: Bƣớc 1. Tạo cơ sở dữ liệu sử dụng một trong hai công cụ sau Sử dụng Visual Data Manager
Microsoft Access Bƣớc 2. Tạo project mới, đặt tên project là quanlythuhocphi.vbp Bƣớc 3. Thiết kế form frmsv.frm, gán thuộc tính Name cho các điều khiển theo chỉ 201 dẫn trên form txtma txtht txtdc txtns dcblop txtgt DataGrid 1 cmdfirst cmdpre cmdnext cmdlast cmdadd cmddel cmdfind cmdupdate cmdend Bƣớc 4. Mở cửa sổ Code của form frmsv.frm và lập trình cho các sự kiện của các điều khiển trên form „Khai báo biến trong phần General của form Dim Cnn As New ADODB.Connection Dim rs As New ADODB.Recordset „---------------------------------------------------------------------------- Public Sub display() txtma.Text = rs!masv txtht.Text = rs!hoten txtns.Text = rs!ngaysinh txtdc.Text = rs!diachi If rs!gioitinh Then txtgt.Text = "nam" Else txtgt.Text = "n÷"
dcblop.Text = rs!tenlop End Sub
Public Sub save()
rs!masv = txtma.Text rs!hoten = txtht.Text
rs!diachi = txtdc.Text rs!ngaysinh = CDate(txtns.Text) If txtgt = "nam" Then rs!gioitinh = True Else rs!gioitinh = False 202 rs!tenlop = dcblop.BoundText Dim x As String x = "select * from hocphi where masv='" & Text1.Text & "'"
Dim rsxem As New ADODB.Recordset rsxem.CursorLocation = adUseClient rsxem.Open x, Cnn, adOpenStatic, adLockReadOnly Set DataGrid1.DataSource = rsxem End Sub „-------------------------------------------------------------------------------------- Private Sub cmdadd_Click() If cmdadd.Caption = "Bæ sung" Then
txtma.Text = "" txtht.Text = "" txtdc.Text = "" txtns.Text = "" txtgt.Text = "" dcblop.Text = "" cmdadd.Caption = "Ghi" txtma.SetFocus Else
If rs.RecordCount > 0 Then rs.MoveFirst rs.Find "masv='" & Trim(txtma.Text) & "'" If rs.EOF Then rs.AddNew Call save Else MsgBox "Trïng m· sinh viªn, b¶n ghi trªn kh«ng ® îc l u l¹i" End If
End If
cmdadd.Caption = "Bæ sung"
End If
End Sub
„---------------------------------------------------------------------------- Private Sub cmddel_Click() rs.Delete If Not rs.EOF Then 203 Call cmdnext_Click Else Call cmdfirst_Click End If End Sub „---------------------------------------------------------------------------- Private Sub cmdend_Click()
Unload Me End Sub „-------------------------------------------------------------------------------------------- Private Sub Cmdfind_Click()
If Cmdfind.Caption = "T×m" Then txtma.Text = "" txtht.Text = "" txtns.Text = "" txtgt.Text = "" dcblop.Text = "" txtdc.Text = "" Cmdfind.Caption = "HiÓn thÞ" txtma.SetFocus
Else rs.MoveFirst rs.Find "masv='" & Trim(txtma.Text) & "'" If rs.EOF Then MsgBox "Kh«ng t×m thÊy " Else Call display End If Cmdfind.Caption = "T×m"
End If
End Sub
„--------------------------------------------------------------------------------------------
Private Sub cmdfirst_Click() If rs.RecordCount > 0 Then rs.MoveFirst
Call display End If 204 End Sub „-------------------------------------------------------------------------------------------- Private Sub cmdlast_Click() If rs.RecordCount > 0 Then rs.MoveLast Call display End If
End Sub „-------------------------------------------------------------------------------------------- Private Sub cmdnext_Click() If rs.RecordCount > 0 Then
rs.MoveNext If rs.EOF Then MsgBox "B¹n ®ang ë b¶n ghi cuèi cïng" Else Call display End If End If End Sub „--------------------------------------------------------------------------------------------
Private Sub cmdpre_Click() If rs.RecordCount > 0 Then rs.MovePrevious If rs.BOF Then MsgBox "B¹n ®ang ë b¶n ghi ®Çu tiªn" Else Call display End If End If
End Sub
„--------------------------------------------------------------------------------------------
Private Sub cmdupdate_Click()
If cmdupdate.Caption = "Söa" Then
cmdupdate.Caption = "Ghi" Else
rs.save Call save 205 End If End Sub „--------------------------------------------------------------------------------------------
Private Sub dcblop_Click(Area As Integer) Dim x As String x = "select * from sinhvien where tenlop='" & dcblop.Text & "'" Dim rsxem As New ADODB.Recordset
rsxem.CursorLocation = adUseClient rsxem.Open x, Cnn, adOpenStatic, adLockReadOnly Set DataGrid1.DataSource = rsxem End Sub
„-------------------------------------------------------------------------------------------- Private Sub Form_Load() Cnn.ConnectionString = "provider=microsoft.jet.oledb.4.0; data source= " & App.Path & "\qlhp.mdb" Cnn.Open 'dua danh sach lop vao Datacombo dcblop Dim rs1 As New ADODB.Recordset rs1.CursorLocation = adUseClient rs1.Open "lop", Cnn, adOpenStatic, adLockReadOnly
Set dcblop.RowSource = rs1 dcblop.ListField = "tenlop" 'hien ra de chon dcblop.BoundColumn = "tenlop" 'cai can lay ra 'mo recordset rs de ghi du lieu vao bang sinh vien rs.CursorLocation = adUseClient rs.Open "sinhvien", Cnn, adOpenStatic, adLockOptimistic Call cmdfirst_Click End Sub Bƣớc 5. Tạo form frmdslop.frm và đặt tên các điều khiển trên form theo chỉ dẫn dcblop cmdprint cmdend 206 Bƣớc 6. Mở cửa sổ Code của form frmdslop.frm và nhập các câu lệnh sau
Dim Cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset Private Sub cmdend_Click() Unload Me
End Sub „-------------------------------------------------------------------------------------------- Private Sub dcbhk_Click(Area As Integer) x = "select distinct hocphi.masv, hocphi.ngaynop, hocphi.sotien, hocphi.noidung " _
& " from hocphi,sinhvien where (hocphi.masv=sinhvien.masv) and (" _ & " tenlop='" & dcblop.Text & "') and (noidung= '" & dcbhk.Text & "')" Dim rsxem As New ADODB.Recordset rsxem.CursorLocation = adUseClient
rsxem.Open x, Cnn, adOpenStatic, adLockReadOnly Set DataGrid1.DataSource = rsxem End Sub „-------------------------------------------------------------------------------------------- Private Sub inds_Click() Dim x As String x = "select * from sinhvien where (" _ & " tenlop='" & dcblop.Text & "')" Dim rsxem As New ADODB.Recordset
rsxem.CursorLocation = adUseClient rsxem.Open x, Cnn, adOpenStatic, adLockReadOnly Set DataReport1.DataSource = rsxem DataReport1.Show End Sub „-------------------------------------------------------------------------------------------- Private Sub Form_Load() Cnn.ConnectionString = "provider=microsoft.jet.oledb.4.0; data source= " & App.Path & "\qlhp.mdb"
Cnn.Open
'dua danh sach sinh vien vao Datacombo dcbma
Dim rs1 As New ADODB.Recordset
rs1.CursorLocation = adUseClient
rs1.Open "sinhvien", Cnn, adOpenStatic, adLockReadOnly Set dcblop.RowSource = rs1
dcblop.ListField = "tenlop" 'hien ra de chon dcblop.BoundColumn = "tenlop" 'cai can lay ra 207 End Sub Bƣớc 7. Tạo trình thiết kế dữ liệu, bổ sung vào project một report và thiết kế nhƣ sau: Bƣớc 8. Thiết kế form frmlop.frm và đặt tên cho các điều khiển theo chỉ dẫn txtlop txtnvt txtss cmdfirst cmdpre cmdnext cmdlast cmdadd cmdfind cmdupdate cmdend cmddel Bƣớc 9. Mở cửa sổ Code của form frmlop.frm và gõ vào các dòng lệnh sau
Dim Cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset 208 Public Sub display()
txtlop.Text = rs!tenlop
txtnvt.Text = rs!namvaohoc
txtss.Text = rs!siso End Sub „-------------------------------------------------------------------------------------
Public Sub save() rs!tenlop = txtlop.Text rs!namvaohoc = txtnvt.Text rs!siso = Val(txtss.Text)
rs.Update End Sub „------------------------------------------------------------------------------------- Private Sub cmdadd_Click()
If cmdadd.Caption = "Bæ sung" Then txtlop.Text = "" txtnvt.Text = "" txtss.Text = "" cmdadd.Caption = "Ghi" txtlop.SetFocus Else If rs.RecordCount > 0 Then rs.MoveFirst
rs.Find "tenlop='" & Trim(txtlop.Text) & "'" If rs.EOF Then rs.AddNew Call save Else MsgBox "Trïng tªn líp, b¶n ghi trªn kh«ng ® îc l u l¹i" End If End If cmdadd.Caption = "Bæ sung"
End If
End Sub
„--------------------------------------------------------------------------------------------
Private Sub cmddel_Click()
rs.Delete If Not rs.EOF Then
Call cmdnext_Click Else 209 Call cmdfirst_Click End If End Sub
„-------------------------------------------------------------------------------------------- Private Sub cmdend_Click() Unload Me End Sub
„-------------------------------------------------------------------------------------------- Private Sub Cmdfind_Click() If Cmdfind.Caption = "T×m" Then txtlop.Text = ""
txtnvt.Text = "" txtss.Text = "" Cmdfind.Caption = "HiÓn thÞ" txtlop.SetFocus Else rs.MoveFirst rs.Find "tenlop='" & Trim(txtlop.Text) & "'" If rs.EOF Then MsgBox "Kh«ng t×m thÊy "
Else Call display End If Cmdfind.Caption = "T×m" End If End Sub „-------------------------------------------------------------------------------------------- Private Sub cmdfirst_Click() If rs.RecordCount > 0 Then
rs.MoveFirst
Call display
End If
End Sub
„-------------------------------------------------------------------------------------------- Private Sub cmdlast_Click()
If rs.RecordCount > 0 Then rs.MoveLast 210 Call display End If End Sub
„-------------------------------------------------------------------------------------------- Private Sub cmdnext_Click() If rs.RecordCount > 0 Then rs.MoveNext
If rs.EOF Then MsgBox "B¹n ®ang ë b¶n ghi cuèi cïng" Else Call display
End If End If End Sub „-------------------------------------------------------------------------------------------- Private Sub cmdpre_Click() If rs.RecordCount > 0 Then rs.MovePrevious If rs.BOF Then MsgBox "B¹n ®ang ë b¶n ghi ®Çu tiªn"
Else Call display End If End If End Sub „-------------------------------------------------------------------------------------------- Private Sub cmdupdate_Click() If cmdupdate.Caption = "Söa" Then 211 cmdupdate.Caption = "Ghi"
Else
rs.save
Call save
End If
End Sub Bƣớc 10. Thiết kế form frmhpsv.frm và đặt tên cho các điều khiển theo chỉ dẫn dcbma txtnnop txttien txtnd DataGrid cmdfirst cmdpre cmdnext cmdlast 1 cmdadd cmddel cmdfind cmdupdate cmdend Bƣớc 11. Mở cửa sổ Code của form frmhpsv.frm và nhập vào các dòng lệnh sau: Dim Cnn As New ADODB.Connection Dim rs As New ADODB.Recordset Public Sub display() dcbma.Text = rs!masv txtnnop.Text = rs!ngaynop txtnd.Text = rs!noidung txttien = rs!sotien End Sub „------------------------------------------------------------------------------------
Public Sub save()
rs!noidung = txtnd.Text
rs!ngaynop = CDate(txtnnop.Text)
rs!masv = dcbma.BoundText 212 rs!sotien = Val(txttien.Text)
rs.Update
End Sub
„------------------------------------------------------------------------------------ Public Sub luoi()
'hien thi cac lan nop hjoc phi Dim x As String x = "select * from hocphi where masv='" & Text1.Text & "'" Dim rsxem As New ADODB.Recordset
rsxem.CursorLocation = adUseClient rsxem.Open x, Cnn, adOpenStatic, adLockReadOnly Set DataGrid1.DataSource = rsxem End Sub
„---------------------------------------------------------------------------------------------- Private Sub cmdadd_Click() If cmdadd.Caption = "Bæ sung" Then txtnd.Text = "" txttien.Text = "" txtnnop.Text = "" dcbma.Text = "" cmdadd.Caption = "Ghi" dcbma.SetFocus
Else rs.AddNew Call save cmdadd.Caption = "Bæ sung" End If End Sub „---------------------------------------------------------------------------------------------- Private Sub cmddel_Click() rs.Delete
If Not rs.EOF Then
Call cmdnext_Click
Else
Call cmdfirst_Click
End If End Sub
„------------------------------------------------------------------------------------ Private Sub cmdend_Click() 213 Unload Me End Sub „----------------------------------------------------------------------------------------------
Private Sub Cmdfind_Click() If Cmdfind.Caption = "T×m" Then txtnd.Text = "" txttien.Text = ""
txtnnop.Text = "" dcbma.Text = "" Cmdfind.Caption = "HiÓn thÞ" dcbma.SetFocus
Else Dim x As String x = "select * from hocphi where masv='" & dcbma.Text & "'" Dim rsxem As New ADODB.Recordset rsxem.CursorLocation = adUseClient rsxem.Open x, Cnn, adOpenStatic, adLockReadOnly Set DataGrid1.DataSource = rsxem Cmdfind.Caption = "T×m" End If
End Sub „---------------------------------------------------------------------------------------------- Private Sub cmdfirst_Click() If rs.RecordCount > 0 Then rs.MoveFirst Call display End If End Sub „----------------------------------------------------------------------------------------------
Private Sub cmdlast_Click()
If rs.RecordCount > 0 Then
rs.MoveLast
Call display
End If End Sub
„---------------------------------------------------------------------------------------------- Private Sub cmdnext_Click() 214 If rs.RecordCount > 0 Then rs.MoveNext If rs.EOF Then
MsgBox "B¹n ®ang ë b¶n ghi cuèi cïng" Else All display End If
End If End Sub „---------------------------------------------------------------------------------------------- Private Sub cmdpre_Click()
If rs.RecordCount > 0 Then rs.MovePrevious If rs.BOF Then MsgBox "B¹n ®ang ë b¶n ghi ®Çu tiªn" Else Call display End If End If End Sub
„---------------------------------------------------------------------------------------------- Private Sub cmdupdate_Click() If cmdupdate.Caption = "Söa" Then cmdupdate.Caption = "Ghi" Else rs.save Call save End If End Sub
„----------------------------------------------------------------------------------------------
Private Sub dcbma_Click(Area As Integer)
Dim x As String
x = "select * from hocphi where masv='" & dcbma.Text & "'"
Dim rsxem As New ADODB.Recordset rsxem.CursorLocation = adUseClient
rsxem.Open x, Cnn, adOpenStatic, adLockReadOnly Set DataGrid1.DataSource = rsxem 215 End Sub „---------------------------------------------------------------------------------------------- Private Sub Form_Load()
Cnn.ConnectionString = "provider=microsoft.jet.oledb.4.0; data source= " & App.Path & "\qlhp.mdb" Cnn.Open 'dua danh sach sinh vien vao Datacombo dcbma
Dim rs1 As New ADODB.Recordset rs1.CursorLocation = adUseClient rs1.Open "sinhvien", Cnn, adOpenStatic, adLockReadOnly Set dcbma.RowSource = rs1
dcbma.ListField = "masv" 'hien ra de chon dcbma.BoundColumn = "masv" 'cai can lay ra 'mo recordset rs de ghi du lieu vao bang sinh vien rs.CursorLocation = adUseClient rs.Open "hocphi", Cnn, adOpenStatic, adLockOptimistic Call cmdfirst_Click End Sub Bƣớc 12. Thiết kế form frmhp.frm và đặt tên cho các điều khiển theo chỉ dẫn dcbma dcbhk cmdend cmdprint DataGrid1 Bƣớc 13. Mở cửa sổ Code của form và nhập vào các dòng lệnh
Dim Cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset Private Sub cmdend_Click() Unload Me End Sub 216 „----------------------------------------------------------------------------------------------- Private Sub cmdprint_Click() x = "select distinct hoten, sophieu,hocphi.masv, ngaynop, sotien, noidung " _
& " from hocphi,sinhvien where (hocphi.masv=sinhvien.masv) and (" _ & " hocphi.masv ='" & dcbma.Text & "') and (noidung= '" & dcbhk.Text & "')" Dim rshk As New ADODB.Recordset rshk.CursorLocation = adUseClient
rshk.Open x, Cnn, adOpenStatic, adLockReadOnly Set bienlai.DataSource = rshk bienlai.Show End Sub
„----------------------------------------------------------------------------------------------- Private Sub dcbhk_Click(Area As Integer) x = "select distinct hocphi.masv, hocphi.ngaynop, hocphi.sotien, hocphi.noidun " _ & " from hocphi,sinhvien where (hocphi.masv=sinhvien.masv) and (" _ & " hocphi.masv ='" & dcbma.Text & "') and (noidung= '" & dcbhk.Text & "')" Dim rshk As New ADODB.Recordset rshk.CursorLocation = adUseClient rshk.Open x, Cnn, adOpenStatic, adLockReadOnly
Set DataGrid1.DataSource = rsh End Sub „----------------------------------------------------------------------------------------------- Private Sub dcbma_Click(Area As Integer) Dim x As String x = "select * from hocphi where masv='" & dcbma.Text & "'" Dim rsma As New ADODB.Recordset rsma.CursorLocation = adUseClient rsma.Open x, Cnn, adOpenStatic, adLockReadOnly
Set DataGrid1.DataSource = rsma
dcbhk.Text = ""
End Sub
„-----------------------------------------------------------------------------------------------
Private Sub Form_Load() Cnn.ConnectionString = "provider=microsoft.jet.oledb.4.0; data source= " &
App.Path & "\qlhp.mdb" Cnn.Open 217 'dua danh sach sinh vien vao Datacombo dcbma Dim rs1 As New ADODB.Recordset rs1.CursorLocation = adUseClient
rs1.Open "sinhvien", Cnn, adOpenStatic, adLockReadOnly Set dcbma.RowSource = rs1 dcbma.ListField = "masv" 'hien ra de chon dcbma.BoundColumn = "masv" 'cai can lay ra
'mo recordset rs de ghi du lieu vao bang sinh vien rs.CursorLocation = adUseClient rs.Open "hocphi", Cnn, adOpenStatic, adLockOptimistic Dim rs2 As New ADODB.Recordset
rs2.CursorLocation = adUseClient rs2.Open "hocphi", Cnn, adOpenStatic, adLockReadOnly Set dcbhk.RowSource = rs2 dcbhk.ListField = "noidung" 'hien ra de chon dcbhk.BoundColumn = "noidung" End Sub Bƣớc 14.Thiết kế form frmhplop.frm, đặt tên các điều khiển theo hƣớng dẫn dcbma dcbhk cmdend DataGrid1 Bƣớc 15. Mở cửa sổ Code của form frmhplop.frm và gõ vào các dòng lệnh:
Dim Cnn As New ADODB.Connection
Dim rs As New ADODB.Recordset
Private Sub cmdend_Click()
Unload Me End Sub „----------------------------------------------------------------------------------------------- Private Sub dcbhk_Click(Area As Integer) 218 x = "select distinct hocphi.masv, hocphi.ngaynop, hocphi.sotien, hocphi.noidung " _ & " from hocphi,sinhvien where (hocphi.masv=sinhvien.masv) and (" _ & " tenlop='" & dcblop.Text & "') and (noidung= '" & dcbhk.Text & "')"
Dim rsxem As New ADODB.Recordset rsxem.CursorLocation = adUseClient rsxem.Open x, Cnn, adOpenStatic, adLockReadOnly Set DataGrid1.DataSource = rsxem
End Sub „----------------------------------------------------------------------------------------------- Private Sub dcblop_Click(Area As Integer) Dim x As String
x = "select distinct hocphi.masv, hocphi.ngaynop, hocphi.sotien, hocphi.noidung " _ & " from hocphi,sinhvien where (hocphi.masv=sinhvien.masv) and (" _ & " tenlop='" & dcblop.Text & "')" Dim rsxem As New ADODB.Recordset rsxem.CursorLocation = adUseClient rsxem.Open x, Cnn, adOpenStatic, adLockReadOnly Set DataGrid1.DataSource = rsxem End Sub
„----------------------------------------------------------------------------------------------- Private Sub Form_Load() Cnn.ConnectionString = "provider=microsoft.jet.oledb.4.0; data source= " & App.Path & "\qlhp.mdb" Cnn.Open 'dua danh sach sinh vien vao Datacombo dcbma Dim rs1 As New ADODB.Recordset rs1.CursorLocation = adUseClient rs1.Open "sinhvien", Cnn, adOpenStatic, adLockReadOnly
Set dcblop.RowSource = rs1
dcblop.ListField = "tenlop" 'hien ra de chon
dcblop.BoundColumn = "tenlop" 'cai can lay ra
Dim rs2 As New ADODB.Recordset
rs2.CursorLocation = adUseClient rs2.Open "hocphi", Cnn, adOpenStatic, adLockReadOnly
Set dcbhk.RowSource = rs2 dcbhk.ListField = "noidung" 'hien ra de chon 219 dcbhk.BoundColumn = "noidung" End Sub Bƣớc 16. Thiết kế form frmcnhp.frm, đặt tên các điều khiển theo hƣớng dẫn dcblop cmdprint cmdend DataGrid1 Bƣớc 17. Mở cửa sổ lệnh của form frmcnhp.frm và gõ vào các dòng lệnh sau: Dim Cnn As New ADODB.Connection Dim rs As New ADODB.Recordset Private Sub cmdend_Click() Unload Me End Sub „----------------------------------------------------------------------------------------------- Private Sub dcblop_Click(Area As Integer) Dim x As String x = "select * from sinhvien where (masv not in (select distinct masv from hocphi)) and (" & " tenlop='" & dcblop.Text & "')" Dim rsxem As New ADODB.Recordset rsxem.CursorLocation = adUseClient rsxem.Open x, Cnn, adOpenStatic, adLockReadOnly Set DataGrid1.DataSource = rsxem
End Sub „-----------------------------------------------------------------------------------------------
Private Sub Form_Load() Cnn.ConnectionString = "provider=microsoft.jet.oledb.4.0; data source= " & App.Path & "\qlhp.mdb" Cnn.Open 'dua danh sach sinh vien vao Datacombo dcbma 220 Dim rs1 As New ADODB.Recordset
rs1.CursorLocation = adUseClient rs1.Open "sinhvien", Cnn, adOpenStatic, adLockReadOnly Set dcblop.RowSource = rs1
dcblop.ListField = "tenlop" 'hien ra de chon dcblop.BoundColumn = "tenlop" 'cai can lay ra End Sub „-----------------------------------------------------------------------------------------------
Private Sub cmdprint_Click() Dim x As String x = "select * from sinhvien where (masv not in (select distinct masv from hocphi)) and (" & " tenlop='" & dcblop.Text & "')" Dim rsxem As New ADODB.Recordset rsxem.CursorLocation = adUseClient rsxem.Open x, Cnn, adOpenStatic, adLockReadOnly Set DataReport1.DataSource = rsxem DataReport1.Show End Sub Bƣớc 18. Tạo form chính frmmain.frm, sử dụng Menu Editor soạn thảo menu hệ thống nhƣ sau: 221 Bƣớc 19. Viết sự kiện Click cho các mục chọn trên menu
Private Sub m1_Click()
Frmlop.Show
End Sub Private Sub m14_Click() frmhp.Show
End Sub Private Sub m21_Click() Frmsv.Show
End Sub Private Sub m22_Click() frmdslop.Show
End Sub Private Sub m31_Click() frmhpsv.Show End Sub Private Sub m32_Click() frmhplop.Show End Sub Private Sub m33_Click() frmcnhp.Show End Sub 5.8.1. Phát hành ứng dụng Sau khi viết xong một chƣơng trình Visual Basic ta cần phát hành nó. Ta có thể phát hành qua đĩa, CD, qua mạng Internet hay Intranet.
Có 2 bƣớc để thực hiện việc phát hành :
Đóng gói : Đóng gói các tập tin của chƣơng trình thành những tập tin.CAB để có thể
triển khai chúng ở những nơi đƣợc chọn, và ta phải tạo chƣơng trình cài đặt tƣơng
ứng với kiểu đóng gói. 222 Triển khai: Chuyển ứng dụng đã đƣợc đóng gói đến nơi mà ngƣời sử dụng có thể
cài đặt từ đó. Điều này có nghĩa là sao chép phần đóng gói xuống đĩa mềm, ổ mạng
hay triển khai trên Web site nào đó. Trình đóng gói và triển khai ứng dụng ( Package and deployment Wizard ) có sẵn trên ấn bản Visual Basic 6.0 5.8.2. Mở trình đóng gói và triển khai ứng dụng Bƣớc 1. Mở đề án ta muốn phát hành. Lƣu ý rằng nếu bạn đang làm việc với một nhóm các đề án hoặc có nhiều đề án đang đƣợc nạp, bạn phải bảo đảm rằng đề án đem đóng gói là đề án hiện hành trƣớc khi mở Wizard.
Bƣớc 2. Dùng Add-in Manager để nạp trình đóng gói và triển khai ứng dụng: Từ menu Add-ins, chọn Add-in Manager, nhấn đúp chuột chọn Package and Deployment Wizard từ danh sách, nhấn OK. Hình 5.18. Hộp thoại Add-In Manager
Bƣớc 3. Chọn Package and Deployment Wizard từ menu Add-ins để phóng Wizard. Trên màn hình chính chọn một trong các tuỳ chọn sau: Nếu ta muốn tạo một đóng gói chuẩn, đóng gói kiểu Internet hay các tập tin liên quan cho ứng dụng, chọn Package. Nếu muốn triển khai ứng dụng, chọn Deploy. 223 Nếu muốn xem, soạn thảo, hay xoá kịch bản, chọn Manager Scripts. Hình 5.19. Hộp thoại Package and Deployment Wizard Bƣớc 4. Chọn Package để đóng gói ứng dụng. Trình Wizard sẽ yêu cầu tìm file *.EXE bằng cách nhấn nút Browse, nếu ứng dụng chƣa đƣợc tạo file *.EXE, chƣơng trình sẽ yêu cầu tạo file *.EXE bằng cách nhấn nút Compile để tạo file *.EXE cho ứng dụng. Bƣớc 5. Chọn kiểu đóng gói chuẩn hoặc file độc lập trong hộp thoại Package Type 224 Hình 5.20. Hộp thoại Package and Deployment Wizard- Package Type Bƣớc 6. Nhấn nút Next sau khi đã chọn kiểu đóng gói chuẩn (Standard Setup Package) hoặc file độc lập (Dependency file) để sang bƣớc tiếp theo. Hình 5.21. Hộp thoại Package and Deployment Wizard- Package Folder Bƣớc 7. Trong hộp thoại Package Folder, chọn thƣ mục chứa các file CAB của ứng dụng, sau đó nhấn nút Next sang bƣớc tiếp theo 225 Hình 5.22. Hộp thoại Package and Deployment Wizard- Included Files
Bƣớc 8. Lựa chọn các file sẽ đƣợc đóng gói (thƣờng chọn chế độ mặc định), sau đó
nhấn nút Next để chuyển sang bƣớc tiếp theo Hình 5.23. Hộp thoại Package and Deployment Wizard- Cab Options Bƣớc 9. Trong hộp thoại Cab Options chọn Single cab để tạo file CAB kích thƣớc lớn hoặc chọn Multiple cabs để tạo nhiều file CAB kích thƣớc nhỏ, nhấn nút Next để chuyển sang bƣớc tiếp theo Bƣớc 10. Nhập tiêu đề của ứng dụng trong hộp thoại Installation Title, tiêu đề này sẽ đƣợc xuất hiện khi ứng dụng đƣợc cài đặt 226 Hình 5.24. Hộp thoại Package and Deployment Wizard- Installation Title Bƣớc 11. Nhấn nút Next trong 3 hộp thoại liên tiếp cho tới khi gặp hộp thoại Finished, nhấn nút Finish để kết thúc tiến trình. Hình 5.25. Hộp thoại Package and Deployment Wizard- Finished 5.8.3. Mở trình đóng gói và triển khai như một ứng dụng độc lập. Nếu đề án ta muốn đóng gói đang mở, lƣu nó lại và thoát khỏi Visual Basic. Nhấn nút Start, chọn vào Package and Deployment Wizard từ nemu con của Visual Studio 6.0. Trong danh sách Project của màn hình khởi tạo, chọn đề án ta muốn đóng gói. (có thể nhấn nút Browse nếu đề án chƣa có trong danh sách). Trên màn hình chính, chọn một trong những tuỳ chọn sau : Nếu muốn tạo một đóng gói chuẩn, đóng gói kiểu Internet, hay các tập tin kiên quan, chọn Package. Nếu muốn triển khai ứng dụng, chọn Deploy. Nếu muốn xem, soạn thao, hay xoá kịch bản, chọn Manage Scripts. Thực hiện lần lƣợt qua các màn hình của Wizard. 5.8.4. Setup toolkit Setup toolkit là một đề án cài đặt với Visual Basic và đƣợc sử dụng bởi Trình đóng gói và triển khai khi nó tạo chƣơng trình setup. Đề án Setup toolkit chứa các
biểu mẫu và chƣơng trình mà chƣơng trình setup dùng cài đặt tập tin cho ngƣời sử
dụng. Khi ta dùng Trìch đóng gói và triển khai. Wizard bao gồm setup1. exe mà đề 227 án setup toolkit tạo ra. Tập tin này đƣợc dùng làm một tập tin cài đặt chính. Setup toolkit còn dùng để điều chỉnh các màn hình hiển thị trong quá trình cài đặt nếu ta cần thêm những tính năng không cấp sẵn bởi Wizard.
Setup Toolkit chứa trong thƣ mục con \Wizards\PDWizard\Setup1 của thƣ mục cài đặt Visual Basic Khi muốn sửa đổi Setup Toolkit nhằm thay đổi kết quả tạo ra bởi Trình đóng gói và triển khai, ta làm nhƣ sau : Sửa đề án Setup Toolkit để chứa các lời nhắc, màn hình, chức năng chƣơng
trình hay những thông tin khác. Khi hoàn tất, biên dịch đề án để tạo setup1. exe. Thi hành trình đóng gói, là theo các lời nhắc trên màn hình để tạo ra môi trƣờng phát hành. Xác định thƣ mục cài đặt trên máy ngƣời dùng Xác định cách thức cài đặt tập tin. Tạo tệp tin.CAB cho đề án, dùng tiện ích Makecab. Sao chép tập tin vào môi trƣờng phân phát, hoặc đƣa lên Web side dùng trình phát hành Web (Web publishing Wizard ) Bài tập 1: Thiết kế form duyệt tập tin Employee chứa trong cơ sở dữ liệu Access
NWIND.mdb 228 Bài tập 2: Sử dụng DBCombo tạo form duyệt bảng Title với Publishers‟ ID và
Name đƣợc lấy từ bảng Publisher Bài tập 3: Sử dụng Visual Basic 6.0 thực hiện các công việc sau: a) Tạo cơ sở dữ liệu qltv.mdb gồm 3 bảng: Sach(Mas, Tens, Tacgia, Nhaxb, Namxb) Docgia(Madg, Hoten, Diachi, Dienthoai) Muontra(Mas, Madg, Ngaymuon, Ngayhentra, Ngaytra) 229 b) Tạo và lập trình cho các form sau: c) Tạo các report theo mẫu Bộ Lao động- Thƣơng binh và Xã hội
Trƣờng ĐH SPKT Hƣng Yên
PHÍCH TRA SÁCH
Số: ..... Mã sách:......................................................
Tên sách:......................................................
Tác giả:........................................................
Nhà xuất bản:...............................................
Năm xuất bản:.............................................. Bộ Lao động- Thƣơng binh và Xã hội
Trƣờng ĐH SPKT Hƣng Yên PHIẾU MƢỢN-TRẢ SÁCH
Số: .....
Mã độc giả:..................................................
Mã sách:.......................................................
Ngày mƣợn:..................................................
Ngày hẹn trả:................................................
Ngày trả:....................................................... Ký tên d) Tạo form chính cho chƣơng trình trên đó có menu để gọi các form và hiển thị các
report trên. Bài tập 4: Sử dụng Visual Basic 6.0 thực hiện các công việc sau:
a) Tạo cơ sở dữ liệu qlbh.mdb gồm 3 bảng: Mathang(Mamh, Tenmh, Donvitinh, Mausac, Trongluong)
Daily(Madl, Tendl, Diachi, Dienthoai) Banhang(Mamh, Madl, Soluong, Gia, Ngayban) 230 b) Tạo và lập trình cho các form sau: c) Tạo form chính cho chƣơng trình trên đó có menu để gọi các form và hiển thị các report trên. Bài tập 5: Sử dụng Visual Basic 6.0 thực hiện các công việc sau:
a) Tạo cơ sở dữ liệu qlbh.mdb gồm 3 bảng: Mathang(Mamh, Tenmh, Donvitinh, Mausac, Trongluong)
Daily(Madl, Tendl, Diachi, Dienthoai)
Banhang(Mamh, Madl, Soluong, Gia, Ngayban) 231 b) Tạo và lập trình cho các form sau: c) Tạo các report theo mẫu Công ty dƣợc phẩm Nam Hà Catalog giới thiệu thuốc
Số: ..... Mã thuốc:......................................................
Tên thuốc:.....................................................
Công dụng:....................................................
Ngày sản xuất:...............................................
Hạn sử dụng:................................................. d) Tạo form chính cho chƣơng trình trên đó có menu để gọi các form và hiển thị các
report trên.
Bài tập 6: Sử dụng Visual Basic 6.0 thực hiện các công việc sau:
a) Tạo cơ sở dữ liệu qlmoto.mdb gồm 3 bảng: Dangky(Chuxe, SoCMND, Bienso, Nhanhieu, Sokhung, Somay)
Giayphep(So, Hoten, Namsinh, Quoctich, Hokhau, Hang) 232 b) Tạo và lập trình cho các form sau: c) Tạo các report theo mẫu Cộng hoà xã hội chủ nghĩa Việt Nam
Độc lập- Tự do- Hạnh phúc 233 ĐĂNG KÝ XE
Số: .....
Biển kiểm soát:..............................................
Họ và tên chủ xe:...........................................
Số CMND:.....................................................
Nhãn hiệu xe:................................................
Số khung:.......................................................
Số máy:.......................................................... d) Tạo form chính cho chƣơng trình trên đó có menu để gọi các form và hiển thị các report trên. Bài tập 7: Sử dụng Visual Basic 6.0 thực hiện các công việc sau: a) Tạo cơ sở dữ liệu qlhang.mdb trong đó có bảng chứa các thông tin nhƣ form sau: 234 b) Tạo và lập trình cho form trên. [2]. Nguyễn Đình Tê. Tự học Lập trình cơ sở dữ liệu với Visual Basic 6.0 trong 21 ngày. Nhà xuất bản Giáo dục. 2001. Tập 1, 2. [3]. Lê Minh Trí. Tự học kỹ năng lập trình Visual Basic 6. Nhà xuất bản thống kê.
1999.
[4]. Đậu Quang Tuấn. Lập trình cơ sở dữ liệu Visual Basic 6.0. Nhà xuất bản trẻ. 2001.
[5]. Dan Mezick & Scot Hillier. Visual Basic 6 Certification Exam Guide. Mc Graw Hill Company. 1998. [6]. Dan Mezick & Scot Hillier. MST Programming with Visual Basic. SAMS. 1999. 235 [7]. Francesco Balena. Programming MS-Visual Basic 6.0. MicroSoft Press. 1999.
2.10. Quy ƣớc viết lệnh
2.11. Lệnh If…Then
2.12. Lệnh Select Case
2.13. Lệnh For…Next
2.14. Lệnh Do While...Loop
2.15. Lệnh Do…Loop While
2.16. Lệnh Do Until…Loop
2.17. Lệnh Do…Loop Until
2.18. Lệnh While..Wend
2.19. Lệnh Goto
2.20. Hàm và thủ tục
2.21 Module
2.22. Xâu ký tự
2.23. Mảng
2.24. Kiểu Collection
2.25. Bản ghi
As As As
2.26. Tệp tin
2.27. Câu hỏi trắc nghiệm
2.28. Bài tập
CHƢƠNG 3
LẬP TRÌNH VỚI CÁC ĐIỀU KHIỂN THÔNG DỤNG
Các điều khiển thông dụng là những điều khiển xuất hiện trong hầu hết các ứng
3.1. Điều khiển Frame
3.2. Điều khiển Shape
3.3. Điều khiển Line
3.4. Điều khiển CheckBox
3.5. Điều khiển OptionButton
3.6. Điều khiển ListBox
3.7. Điều khiển ScrollBar
3.8. Điều khiển Image và điều khiển Picture
3.9. Các điều khiển DriveListBox, DirListBox và FileListBox
3.10. Điều khiển Timer
3.11. Xử lý chuột
3.12. Xử lý bàn phím
3.13. Câu hỏi trắc nghiệm
3.14. Bài tập
CHƢƠNG 4
LẬP TRÌNH VỚI CÁC ĐIỀU KHIỂN MỞ RỘNG
4.1. Điều khiển Common Dialog
4.2. Điều khiển Image List
4.3. Điều khiển MicroSoft Masked Edit
4.4. Điều khiển ToolBar
4.5. Điều khiển TreeView
4.6. Điều khiển MultiMedia
4.7. Menu
4.8. Điều khiển RichTextBox
4.9. Câu hỏi trắc nghiệm
4.9. Bài tập
CHƢƠNG 5. LẬP TRÌNH CƠ SỞ DỮ LIỆU
5.1. Nhắc lại một số khái niệm về cơ sở dữ liệu
5.2. Visual Data Manager
5.3. Các đối tƣợng truy cập dữ liệu
5.4. Truy xuất dữ liệu thông qua Data Control
5.5. Truy xuất dữ liệu thông qua DAO
5.6. Truy xuất dữ liệu thông qua ADO
5.7. Tạo báo cáo
5.8. Trình đóng gói và triển khai ứng dụng
5.9. Bài tập
CỘNG HOÀ XÃ HỘI CHỦ NGHĨA VIỆT NAM
Độc lập - Tự do - Hạnh phúc
GIẤY PHÉP LÁI XE
Số: .....
Họ tên:...........................................................
Năm sinh:................Quốc tịch:......................
Nơi đăng ký hộ khẩu thƣờng trú:...................
........................................................................
Hạng:..............................................................
Ngày cấp:.......................................................
TÀI LIỆU THAM KHẢO
[1]. Nguyễn Thị Ngọc Mai. Visual Basic 6.0 và lập trình cơ sở dữ liệu. Nhà xuất bản
Giáo dục. 2000.
Có thể bạn quan tâm
Tài liêu mới