Tập bài giảng Lập trình windows (Phần 1)

pdf 110 trang Gia Huy 17/05/2022 1760
Bạn đang xem 20 trang mẫu của tài liệu "Tập bài giảng Lập trình windows (Phần 1)", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • pdftap_bai_giang_lap_trinh_windows_phan_1.pdf

Nội dung text: Tập bài giảng Lập trình windows (Phần 1)

  1. 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 1.8. Câu hỏi trắc nghiệm 19 CHƢƠNG 2 21 i
  2. 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 2.9.3. Hộp nhập dữ liệu 43 ii
  3. 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 2.24.4. Thay đổi giá trị một phần tử trong Collection 67 iii
  4. 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 4.2.1. Thêm phần tử ảnh cho ImageList lúc thiết kế 107 iv
  5. 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 5.4.1. Các thuộc tính 138 v
  6. 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 TÀI LIỆU THAM KHẢO 235 vi
  7. DANH MỤC HÌNH VẼ 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 vii
  8. 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 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 1
  9. thông qua cấu trúc: Do While 0 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) Chƣơng trình khác đặt vào 2
  10. 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ó 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. 3
  11. 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. 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ủ 4
  12. 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: Hình 1.2. Cửa sổ API Viewer 5
  13. Để 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: 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. 6
  14. 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 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: 7
  15. . . 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 Hình 1.6. Biểu tƣợng của Visual Basic 6.0 trên màn hình nền 8
  16. 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 ngƣời sử dụng có thể thi hành một lệnh nhanh hơn. 9
  17. 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 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. 10
  18. (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 vào thẻ (tab) có tên View Object ( ). 11
  19. Để 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: . 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 Có hai cách đƣa đƣa các đối tƣợng vào Form nhƣ sau: 12
  20. 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. Cách 3. Gán giá trị cho thuộc tính Height và Width của đối tƣợng. 13
  21. 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 TabIndex phù hợp giúp cho ngƣời sử dụng chƣơng trình đƣợc thuận tiện hơn. 14
  22. 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 sách, kích nút Open. 15
  23. 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: Hình 1.13. Hộp thoại tạo một Project mới (New Project) 16
  24. 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ổ xuống có nhãn là Startup Object. - Nhấn nút OK để kết thúc công việc. 17
  25. 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. Hình 1.16. Hộp thoại Make Project 18
  26. 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. d. Cả 3 cách trên. 19
  27. 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. d. Cả 3 cách trên. 20
  28. 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 Width Chiều rộng của điều khiển 21
  29. 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: Phƣơng thức Giải thích Move Thay đổi vị trí một đối tƣợng theo yêu cầu của chƣơng trình Drag Thi hành hoạt động kéo và thả của ngƣời sử dụng 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 tƣợng đang trong tầm ngắm 22
  30. 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 có biểu tƣợng trong hộp công cụ là . Điều khiển TextBox đƣợ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 Name Dùng để đặt tên cho điều khiển TextBox 23
  31. 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. Private Sub Text1_KeyPress (KeyAscii As Integer) If 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 24
  32. 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ừ phía ngƣời dùng. 25
  33. 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 Tƣơng tự Fixed Dialog nhƣng thanh tiêu đề ngắn hơn. Font trên Window 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 Tƣơng tự nhƣ Fixed Tool Window nhƣng có thể co giãn đƣợc. Window Giá trị này dùng cho những cửa sổ Properties của Visual Basic 26
  34. 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. 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. 27
  35. 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 = "" End Sub „ Private Sub cmdPaste_Click() txtVanBan.SelText = Clipboard.GetText 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 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: 28
  36. 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) 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. 29
  37. 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ố Kiểu dữ Kích Phạm vi liệu thƣớc Byte 1 byte 0 đến 255 Integer 2 byte -32768 đến 32767 Long 4 byte -2147483648 đến 2147483647 Single 4 byte -3.402823 E38 đến -1.401298 E-45 1.401298 E-45 đến 3.402823 E38 30
  38. 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 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. 31
  39. 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 này đƣợc gọi là biến cấp độ thủ tục. 32
  40. 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ủmô -tụcđ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. Cú pháp: 33
  41. 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: Static Function LuuTong (n) Dim S S = S + n T = Abs(S) LuuTong = S End Function 34
  42. 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 Phép chia lấy phần nguyên 35
  43. 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 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ị. Ví dụ: Int(-1.2) sẽ cho kết quả là -2 (7) Hàm Fix(x): Hàm trả về phần nguyên của x. 36
  44. 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 ): 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 Ví dụ: Minute(#10:20:15#) sẽ cho kết quả là 20. 37
  45. (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. Ví dụ: 38
  46. 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: # : Đại diện cho các chữ sô từ 0 9 (không xuất hiện nếu không có giá trị) 39
  47. 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 & & & & &") "A B C D E" MyStr = Format(5, "0.00%") "500.00%". MyStr = Format("HELLO", " ") "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 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( ): 40
  48. MsgBox(prompt[, buttons] [, title] [, helpfile, context]) Tiªu ®Ò BiÓu t•îng C¸c nót lÖnh Th«ng ®iÖp 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á Hằng Mô tả trị vbOKOnly 0 Hiển thị nút OK vbOKCancel 1 Hiển thị nút OK và Cancel vbAbortRetryIgnore 2 Hiển thị nút Abort, Retry và Ignore vbYesNoCancel 3 Hiển thị nút Yes, No và Cancel vbYesNo 4 Hiển thị nút Yes và No vbRetryCancel 5 Hiển thị nút Retry và Cancel Hiển thị biểu tƣợng để thông báo một lỗi vbCritical 16 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. 41
  49. Hiển thị biểu tƣợng biểu thị rằng chƣơng vbQuestion 32 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 vbExclamation 48 đã xảy ra một vấn đề nào đó, yêu cầu ngƣời sử dụng hiệu chỉnh hoặc có thể dẫn đến một kết quả không mong muốn. vbInformation 64 Hiển thị biểu tƣợng dùng cho các thông 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" End Select End Sub 42
  50. 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 đó: Các tham số prompt, title, helpfile và context giống nhƣ ở MsgBox. 43
  51. 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 “:”. Ví dụ: StartTime = Now: EndTime = StartTime + 10 44
  52. 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 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: 45
  53. 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 TextBox txt HScrollBar hsb Label lbl VScrollBar vsb PictureBox pic DriveListBox drv OptionButton opt DirListBox dir CheckBox chk FileListBox fil ComboBox cbo Line lin ListBox lst Shape shp Timer tmr OLE ole Frame fra Form frm Ví dụ: txtHoten, cboGioitinh, frmQuanLy v.v 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). Cú pháp 1: If Then Ví dụ : If x>10 Then Print “x lớn hơn 10” Cú pháp 2: If Then End If Ví dụ: If x Then 46
  54. Else Ví dụ: If x Then Else If 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 [Case [Khối lệnh 1] [Case [Khối lệnh 2] . . . 47
  55. . . . . . . [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 7 ComboBox Name cbopt 48
  56. List + - Mỗi giá trị trên * một dòng, nhấn / Ctrl+Enter để Mod xuống dong ^ 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 Bƣớc 4. Chạy chƣơng trình (F5). 49
  57. 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 Loop Hoạt động: Đầu tiên chƣơng trình sẽ kiểm tra , 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 (lúc này giá trị của điều kiện có thể đã thay đổi), nếu vẫn đúng thì 50
  58. lại đƣợc thực hiện. Quá trình này cứ tiếp diễn cho đến khi nhận giá trị sai (False). Ví dụ: Đoạn lệnh sau: i = 1 Do While i Loop While 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 . 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 . Ví dụ: Đoạn lệnh sau: i = 1 Do Print i i = i + 1 Loop While i Loop Hoạt động: Trong trƣờng hợp này, sẽ đƣợc thực hiện cho đến khi nhận giá trị đúng (TRUE) và đƣợc kiểm tra trƣớc khi thực hiện lệnh. Ví dụ: i = 1 51
  59. Do Until i > 10 Print i i = i + 1 Loop 2.17. Lệnh Do Loop Until Cú pháp: Do Loop Until 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 . 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 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 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 cấp cho ta một số cấu trúc để bẫy các lỗi đang thực thi. 52
  60. 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 Cú pháp : 53
  61. [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 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 54
  62. 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 End Sub 55
  63. 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ú ý về biến địa phƣơng/toàn cục trong Visual Basic: 56
  64. 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 để đá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 57
  65. (đƣợ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ố 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. 58
  66. 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 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. 59
  67. 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: 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 60
  68. Hoặc Option Base 1 ‟Thiết lập chỉ số mảng bắt đầu từ 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 ReDim A (5) „Cấp phát 5 phần tử For i = 1 to 5 A(i) = i Next i 61
  69. 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 Name txtmtb 6 TextBox Multiline True 62
  70. 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) ReDim b(n, n) 63
  71. 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ế 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ó. 64
  72. 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 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ữ ở 65
  73. đâ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ụ: ' In ra phần tử cuối cùng của Retrieve EmployeeNames collection. 66