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>.. Tƣơng tự thuộc tính và phƣơng thức, các đối tƣợng còn có một bộ sự kiện (events) khác nhau. Các sự kiện là những phản ứng của đối tƣợng, nó xảy ra thƣờng là kết quả của một hành động nào đó, nhƣ di chuyển chuột, nhấn nút bàn phím, hoặc gõ vào hộp văn bản, …

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 As

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 [ As ] Một biến Public có thể đƣợc dùng trong mọi thủ tục hoặc hàm của project. Nếu một biến 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 biến

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 [ As ]

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 [ As ]

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 [ As ] =

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 (): Hàm cho biết giờ ứng với .

Ví dụ: Hour(#10:20:15#) sẽ cho kết quả là 10 (7) Hàm Minute(): Hàm cho biết phút ứng với

37

Ví dụ: Minute(#10:20:15#) sẽ cho kết quả là 20.

(8) Hàm Second(): Hàm cho biết giây ứng với

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(): Hàm trả về số tƣơng ứng của .

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

. Print

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. Quy ƣớc viết lệnh

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ụ:

2.11. Lệnh If…Then

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 Cú pháp 1:

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

2.12. Lệnh Select Case

Cú pháp: Select Case

[Khối lệnh 1]

47

[Case [Case [Khối lệnh 2] . . .

. . .

. . . [Case Else

[Khối lệnh n]

End Select

Hoạt động : Chƣơng trình sẽ kiểm tra, nếu bằng một giá trị nào đó trong

thì khối lệnh tƣơng ứng với danh sách biểu thức đó sẽ đƣợc

thực hiện. Ngƣợc lại, sẽ đƣợc thực hiện

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).

2.13. Lệnh For…Next

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 = To [Step ]

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

2.14. Lệnh Do While...Loop

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> Loop

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ì

đƣợc thực hiện và sau đó chƣơng trình lại quay lại kiểm tra <điều

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ì

lại đƣợc thực hiện. Quá trình này cứ tiếp diễn cho đến khi <điều kiện>

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

2.15. Lệnh Do…Loop While

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 đƣợc má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,

đƣợc thực hiện ít nhất một lần mà không phụ thuộc vào <điều kiện>.

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

2.16. Lệnh Do Until…Loop

Cú pháp:

Do Until <điều kiện> Loop

Hoạt động: Trong trƣờng hợp này, sẽ đƣợc thực hiện cho đến khi <điều kiện> nhận giá trị đúng (TRUE) và <điều kiện> đƣợc kiểm tra trƣớc khi thực hiện lệnh.

51

Ví dụ: i = 1

Do Until i > 10

Print i i = i + 1

Loop

2.17. Lệnh Do…Loop Until

Cú pháp: Do

Loop Until <điều kiện>

Hoạt động:

Giống nhƣ lệnh Do Until…Loop, nhƣng ở đây đƣợc thực hiện rồi

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.

2.18. Lệnh While..Wend

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.

2.19. Lệnh Goto

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 thì khi chƣơng trình thực thi đến câu lệnh đó, chƣơng trình sẽ tự động nhảy đến đoạn chƣơng trình

định nghĩa bên dƣới để thực thi.

Dạng 2. Cú pháp: On Error Resume Next

Giải thích: Nếu một lệnh trong thì khi chƣơng

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.

2.20. Hàm và thủ tục

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 (Tham số hình thức)

„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 (Tham số hình thức) As

„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.

= (danh sách tham số thực)

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.

2.21 Module

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. Xâu ký tự

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, ): Hàm trả về một xâu gồm n giống nhau.

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(): Hàm trả về ký tự tƣơng ứng với .

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. Mảng

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 ( [, , … ] ) As Trong đó có thể có một trong hai dạng sau:

60

Dạng 1: là một số nguyên dƣơng N, khi đó mảng sẽ có chỉ số từ 0 đến N. bắt đầu từ 0 hay từ 1 có thể đƣợc chúng ta thiết lập qua lệnh Option Base trong phần General của Form hoặc Module nhƣ sau: Option Base 0 ‟Thiết lập chỉ số mảng bắt đầu từ 0

Hoặc

‟Thiết lập chỉ số mảng bắt đầu từ 1

Option Base 1 Dạng 2: có dạng To .

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 khi khai báo mảng thì một mảng động sẽ đƣợc tạo

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] () Nếu dùng từ khoá Preserve thì mảng cấp phát lại sẽ không xoá dữ liệu đã có trƣớc đó trên mảng. Việc thiết lập lại kích thƣớc(có thể tăng hoặc giảm)của mảng có thể thực hiện bất cứ khi nào ta cần.

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. Kiểu Collection

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. Bản ghi

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

As As

. . .

As

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

2.26. Tệp tin

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).

2.27. Câu hỏi trắc nghiệm

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

2.28. Bài tập

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:

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

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.

3.1. Điều khiển Frame

Đ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ó.

3.2. Điều khiển Shape

Đ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,..

3.3. Điều khiển Line

Đ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

3.4. Điều khiển CheckBox

. 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

3.5. Điều khiển OptionButton

Đ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

3.6. Điều khiển ListBox

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).

3.7. Điều khiển ScrollBar

Đ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. Điều khiển Image và điều khiển Picture

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.

3.9. Các điều khiển DriveListBox, DirListBox và FileListBox

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).

3.10. Điều khiển Timer

Đ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

3.11. Xử lý chuột

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.

3.12. Xử lý bàn phím

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.

3.13. Câu hỏi trắc nghiệm

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

3.14. Bài tập

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 :

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

Đ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.

4.2. Điều khiển Image List

Đ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).

4.3. Điều khiển MicroSoft Masked Edit

Đ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.

4.4. Điều khiển ToolBar

Đ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

4.5. Điều khiển TreeView

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

4.6. Điều khiển MultiMedia

Đ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.

4.7. Menu

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

4.8. Điều khiển RichTextBox

Đ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.

4.9. Câu hỏi trắc nghiệm

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

4.9. Bài tập

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?

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.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. Visual Data Manager

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ý

5.3. Các đối tƣợng truy cập dữ liệu

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.

5.4. Truy xuất dữ liệu thông qua Data Control

Để 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

5.5. Truy xuất dữ liệu thông qua DAO

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).

5.6. Truy xuất dữ liệu thông qua ADO

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. Tạo báo cáo

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. Trình đóng gói và triển khai ứng dụng

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 )

5.9. Bài tập

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:..........................................................

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:.......................................................

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.

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.

[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.