Xem mẫu

  1. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 Ch−¬ng iV Sö dông c¸c ®iÒu khiÓn n©ng cao MỤC TIÊU: SAU KHI HOÀN THÀNH CÁC BÀI TẬP, NGƯỜI HỌC CÓ THỂ Sử dụng được hầu hết các điều khiển nâng cao đi kèm với Visual Basic và một số điều khiển nâng cao thông dụng từ các hãng thứ 3 –Third party. Lựa chọn được các điều khiển phù hợp khi viết chương trình. Xây dựng được một số ứng dụng với các điều khiển nâng cao. A - ĐỀ BÀI TẬP Bài 1: Minh hoạ sử dụng điều khiển Carlendar (Lịch) Giới thiệu: Điều khiển Carlendar nằm trong thư viện , có chức năng hiển thị như một cuốn lịch điện tử. Đồng thời cũng được dùng để cho phép người dùng chọn trực quan ngày, tháng, năm trong một số ứng dụng. Hình 4.1 – Giao diện chương trình Yêu cầu: • Khi người dùng click nút thì hiển thị lịch của tháng trước. • Khi người dùng click nút thì hiển thị lịch của tháng tiếp theo • Khi người dùng click nút thì hiển thị lịch của năm trước • Khi người dùng click nút thì hiển thị lịch của năm tiếp theo • Khi người dùng click nút thì trở về ngày hiện tại • Khi người dùng click nút thì thay ngày tháng năm trong máy tính bằng ngày tháng năm đang được chọn trong Calendar. Trang 94
  2. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 Bài 2: Minh hoạ sử dụng điều khiển truyền thông nối tiếp Comm Control Giới thiệu: Điều khiển MSComm nằm trong thư viện , cung cấp cho ứng dụng khả năng truyền thông nối tiếp bằng cách truyền và nhận dữ liệu thông qua cổng nối tiếp (Serial Port). Hình 4.2 – Giao diện chương trình và đặt tên cho các điều khiển Yêu cầu: • Xây dựng ứng dụng như hình 2. • Khi người dùng click thì mở cổng có số hiệu trong điều khiển . • Khi click thì đóng cổng hiện hành. • Khi click thì gửi lệnh và dữ liệu chứa trong cboCommand Bài 3 : Minh hoạ điều khiển FlexGrid Giới thiệu: Điều khiển MSFlexGrid nằm trong thư viện rol có chức năng hiển thị và thao tác dữ liệu ở dạng bảng (Tabular). Nó hoàn toàn cho phép sắp xếp, trộn và định dạng bảng có chứa xâu ký tự và hình ảnh. Khi gắn kết với các điều khiển Data, MSFlexGrid chỉ hiển thị dữ liệu ở chế độ Read-Only. Hình 4.3 – Giao diện và đặt tên cho các điều khiển (tên được in đậm) Yêu cầu: • Khi click nút "Thêm" thì thêm một bản ghi trong các Textbox vào FlexGrid • Khi click nút "Xoá" thì xoá dòng đang được chọn trong FlexGrid Trang 95
  3. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 • Khi click nút "Cập nhật" thì đặt nội dung của dòng hiện hành bằng nội dung trong các hộp Text tương ứng. • Khi click nút "Lưu ra File" thì lưu nội dung FlexGrid ra file Text, mỗi bản ghi trong FlexGrid được ghi trên một dòng của file. Bài 4 : Minh hoạ sử dụng điều khiển Web brower và HTML Object Library. Giới thiệu : Điều khiển Web Browser đóng vai trò như một trình duyệt IE, do vậy cho ta phép nhúng vào trong ứng dụng để mở và thao tác với trang web bằng các lệnh của VB. Để truy cập (đọc / ghi) nội dung chứa trong các đối tượng của trang web (nút nhấn, textbox...) thì cần phải có thư viện HTML Object Library. Trong trường hợp ứng dụng chỉ mở các trang web thì không cần đến thư viện này. Hai thành phần này nằm trong và Hình 4.4 – Giao diện chương trình Yêu cầu: • Khi chương trình bắt đầu, một trang web trắng (Blank) sẽ được mở. • Khi click nút "Mở" thì mở trang có địa chỉ nằm trong txtURL • Khi click nút "Tạo nút nhấn và Textbox" thì tạo ra một hộp text và một nút nhấn trong trang Web. • Khi click nút "Ghi giá trị vào Text" thì cho người dùng nhập một xâu ký tự và chèn xâu này vào hộp Text vừa tạo ra trong trang web • Khi click nút "Đọc giá trị trong Textbox" thì đọc nội dung trong hộp Text vừa tạo ra và hiển thị ra màn hình bằng hàm Msgbox. • Khi click nút "Thêm "Hello"" thì thêm một dòng "Hello" có màu xanh vào trong trang web. Bài 5: Minh hoạ sử dụng Internet Control Giới thiệu: Điều khiển Internet cài đặt 2 giao thức được sử dụng rộng rãi nhất đó là giao thức HyperText Transfer Protocol (HTTP) và File Transfer Protocol (FTP). Sử dụng giao thức HTTP, chúng ta có thể lấy về các trang Web từ Internet, còn giao thức FTP cho phép đăng nhập vào máy chủ FTP để Download (lấy về) và Upload Trang 96
  4. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 (Gửi lên) các file. Ngoài ra, các lệnh trong giao thức FTP như SEND, PUT, PWD…. cũng được điều khiển này hỗ trợ. Yêu cầu: Xây dựng một chương trình cho phép người dùng Download các file từ Internet về máy tính cục bộ. Các file này sau đó có thể mở theo yêu cầu. Hình 4.5 – Giao diện và đặt tên cho các điều khiển Bài 6. Sử dụng điều khiển Multimedia MCI để chơi các file nhạc và hình Giới thiệu: điều khiển Multimedia MCI ( ) được dùng để ghi và chơi các file nhạc và hình. Các dạng file mà điều khiển này hỗ trợ là các file Wav (WaveAudio), các file trên đĩa CD (CDAudio), các file hình (DAT), file hình AVI.. Hình 4.6 – Giao diện chương trình và tên cho các điều khiển Yêu cầu: • Xây dựng chương trình với giao diện như hình 6 • Khi người dùng click nút thì mở hộp thoại chọn file và chơi file này. Bài 7: Sử dụng Script Control để tính toán biểu thức bất kỳ được nhập từ bàn phím trong khi chương trình chạy. Giới thiệu: Điều khiển Script ( ) cho phép định giá (Eval) một biểu thức bất kỳ khi chương trình đang chạy. Nó khắc phục được hạn chế trong các chương trình trước đây là biểu thức cần tính toán phải được nhập trước và khi đã dịch ra file exe rồi thì không thể thay đổi được. Muốn thay đổi biểu thức tính toán thì phải sửa đổi chương trình nguồn sau đó dịch lại ra file EXE. Ngoài khả năng định giá (tính) một biểu thức, Script control còn có khả năng rất mạnh khác là có thể thêm các lệnh (như khai báo biến, khai báo thủ tục, các lệnh rẽ nhánh v.v… của VB) trong khi chương trình chạy. Ở đây chỉ xin giới thiệu khả năng thứ nhất. Yêu cầu: • Xây dựng giao diện như hình 7 • Khi người dùng nhập một biểu thức trong textbox và click nút "Hiển thị…" thì hiển thị kết quả tính toán được bằng hàm MsgBox. Trang 97
  5. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 Hình 4.7 – Giao diện chương trình và kết quả chạy chương trình Bài 8: Sử dụng điều khiển SSTab và viết chương trình cờ CARO đơn giản Giới thiệu: SSTab nằm trong thư viện là một điều khiển hoạt động giống như một đối tượng chứa (tức cho các các điều khiển khác đặt lên). Các điều khiển có thể đặt trong nhiều trang (còn gọi là Page hay TAB) khác nhau của SSTab, do vậy giúp chúng ta không phải tạo ra nhiều Form. Trong bài tập này, chúng ta sẽ sử dụng SSTab kết hợp với điều khiển FlexGrid để viết một chương trình chơi cờ Caro đơn giản. (Có thể kết hợp với bài tập 37 - Chương 1 sẽ được chương trình hoàn chỉnh hơn) Hình 4.8 – Giao diện và tên của các điều khiển Yêu cầu: • Chương trình cho phép 2 người dùng sử dụng chuột để chơi • Khi người dùng click vào một ô trong Flexgrid thì đặt vào các ký hiệu là "X" hoặc "O". • Thứ tự người đi trước có thể thay đổi. • Số ô cũng có thể thay đổi. • Khi người dùng click vào "Ván mới" thì xoá bàn cờ và bắt đầu chơi ván mới. Bài 9: Sử dụng thanh tiến trình (Progressbar) Giới thiệu: Thanh tiến trình nằm trong thư viện thường được sử dụng để hiển thị một cách trực quan tiến trình một công việc, giúp cho người dùng thấy được trực quan công việc đã thực hiện được bao nhiêu %. Trang 98
  6. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 Hình 4.9 – Giao diện chương trình khi chạy Yêu cầu: Copy nội dung từ file nguồn và lưu sang file đích. Trong quá trình copy có hiển thị tiến trình copy và % dung lượng đã copy được bằng Pgrogressbar. Bài 10: Sử dụng điều khiển ImageCombo box Giới thiệu: Điều khiển ImageCombo nằm trong là một phiên bản của điều khiển ComboBox chuẩn nhưng có thêm khả năng hiển thị ảnh (biểu tượng) với từng mục trong danh sách. Ngoài ra, ImageCombo ưu việt hơn ComboBox ở chỗ, ComboBox thì chỉ có thuộc tính List để lưu trữ các mục dữ liệu trong khi đó Hình 4.10 – Giao diện khi chạy chương trình. Yêu cầu: • Nạp một số mục vào ImageCombo có kèm thêm biểu tượng. • Khi người dùng click nút "Gửi thông báo" thì gửi thông báo trong hộp Text đến máy tính đã được chọn trong ImageCombo sử dụng dịch vụ Net Send của hệ điều hành Windows 2K, XP. Bài 11 : Sử dụng điều khiển Listview Giới thiệu: Điều khiển ListView nằm trong được sử dụng để hiển thị một danh sách các mục dữ liệu, trong đó mỗi mục lại có nhiều thuộc tính đi cùng (ví dụ mỗi mục thông tin về sinh viên có thể gồm họ tên, ngày sinh, quê quán...). Điều khiển ListView hỗ trợ 4 cách hiển thị khác nhau là Icon, SmallIcon, List và Report. Bài tập sau đây sẽ hướng dẫn bạn cách sử dụng điều khiển này với các thao tác "Chèn thêm" và "đọc" giá trị của các mục. Ngoài ra, còn giới thiệu một số thuộc tính hay dùng của điều khiển ListView này. Trang 99
  7. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 Hình 4.11 – Giao diện và kết quả chạy chương trình mẫu Yêu cầu: • Thiết kế giao diện như hình 11 (Tên các điều khiển được đặt ở bên cạnh) • Cho phép thêm một hàng (mục) mới vào Listview khi click nút "Thêm bản ghi" • Hiển thị ra màn hình giá trị của nhiều mục được chọn khi click nút "Đọc các hàng đang chọn" (Khi chế độ Chọn nhiều hàng được ) bằng hàm Debug.Print. Mỗi hàng trên một dòng, mỗi trường cách nhau 1 dấu TAB. • Đọc và hiển thị giá trị của hàng đang được chọn bằng hàm MsgBox khi click nút "Đọc hàng hiện tại". • Cho người dùng chọn 1 trong 4 chế độ hiển thị. Bài 12: Sử dụng điều khiển TreeView Giới thiệu: Điều khiển TreeView nằm trong được sử dụng để trình bày dữ liệu dưới dạng phân cấp (Hình cây). Bài tập sau đây minh hoạ các thao tác chèn (Add), Xoá (Remove), Duyệt (đọc giá trị) các nút trong cây và xử lý sự kiện click chuột khi click lên 1 nút của cây. Yêu cầu: • Xây dựng giao diện như hình 12 (có thể có biểu tượng hoặc không) • Thực hiện các chức năng khi người dùng click vào các nút tương ứng. Việc đọc giá trị của mỗi nút bao gồm giá trị của trường "Key" và trường "Text". • Khi người dùng click vào một nút trên cây thì hiển thị giá trị của trường "Key" và trường "Text" của nút đó trong một thanh trạng thái (staThongTinThem). Trang 100
  8. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 Hình 4.12 – Giao diện khi chạy chương trình mẫu & đặt tên các điều khiển Bài 13: Sử dụng DateTimePicker để nhập trực quan ngày/tháng/năm. Giới thiệu Hình 4.13 – Giao diện chương trình khi chạy và tên của các điều khiển Bài 14: Sử dụng điều khiển Window Media Player, viết chương trình chơi nhạc Giới thiệu: WMP là một điều khiển cho phép lập trình để xây dựng các ứng dụng đa phương tiện (Chơi các file nhạc hình, nhạc tiếng) Hình 4.14 – Giai diện của form : frm4_14 Trang 101
  9. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 Hình 4.15 – Giao diện chương trình của form: frm4_14_Setting B- HƯỚNG DẪN - GIẢI MẪU Bài 1 a. Hướng dẫn: Tên các thuộc tính và phương thức của điều khiển này bản thân nó đã nói lên chức năng của chúng. Do vậy chúng ta có thể tra cứu về điều khiển Calendar trong bộ MSDN. (Cách tra cứu nhạn: Trong khi lập trình, click vào điều khiển Calendar và nhấn phím F1). b. Chương trình mẫu: Form1.frm Option Explicit '/// Chuyển sang tháng tiếp theo Private Sub cmdNextMonth_Click() Calendar1.NextMonth End Sub '----------------------------------------------------------------------------------------------------------------------------- /// Chuyển sang năm tiếp theo Private Sub cmdNextYear_Click() Calendar1.NextYear End Sub '----------------------------------------------------------------------------------------------------------------------------- '//// Chuyển sang tháng trước tháng hiện tại Private Sub cmdPrevMonth_Click() Calendar1.PreviousMonth End Sub '----------------------------------------------------------------------------------------------------------------------------- //// Chuyển sang năm trước năm hiện tại Private Sub cmdPrevYear_Click() Calendar1.PreviousYear End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Đặt lại ngày tháng năm bằng với ngày tháng năm vừa chọn (ví dụ 15/1/2006) Private Sub cmdSetdate_Click() Date = Calendar1.Value End Sub '----------------------------------------------------------------------------------------------------------------------------- Trang 102
  10. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 '/// Hiển thị ngày tháng hiện hành trong máy tính Private Sub cmdToday_Click() Calendar1.Today End Sub c. Chú ý: • Điều khiển Calendar thường được sử dụng trong các chương trình để người dùng nhập vào ngày, tháng và năm. • Khi muốn nhận về cả ngày/tháng/năm thì lấy thuộc tính Value, còn nếu muốn nhận từng thành phần riêng lẻ thì lấy thuộc tính Day, month, year… Bài 2 a. Hướng dẫn: Điều khiển COM có thể được sử dụng để truyền thông (Giao tiếp) với bất kỳ thiết bị nào được nối và tương thích với cổng này. Việt thiết lập các thông số kết nối tương đối đơn giản, chỉ cần đặt số hiệu cổng (Com 1, 2, 3…) sau đó mở kết nối bằng cách đặt thuộc tính PortOpen = True. Riêng đối với một số trường hợp đặc biệt thì cần đặt lại một số thông số khác. Khi làm việc, điều khiển Com này có 2 cách để lấy dữ liệu do các thiết bị khác gửi đến Cổng Com, cách thứ nhất là luôn luôn thăm dò (Polling) cổng và nhận dữ liệu về; cách thứ 2 là khi dữ liệu được gửi đến thì sự kiện OnComm xuất hiện và ta lấy dữ liệu về thông qua thuộc tính Input. Chương trình mẫu dưới đây sử dụng cách nhận dữ liệu thứ 2 và thực hiện giao tiếp với Modem. Có thể tham khảo thêm trong MSDN. b. Chương trình mẫu (Giao tiếp với Modem): Form1.frm Option Explicit Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) '///--------------------------------------------------------------------------------------------------------------------------------- '/// Thực hiện mở cổng COM khi người dùng click nút Open Private Sub cmdOpen_Click() On Error GoTo err '/// Sử dụng cơ chế bắt lỗi comModem.CommPort = Val(cboPort.Text) '/// đặt cổng để giao tiếp comModem.PortOpen = True '/// mở cổng cmdClose.Enabled = True '/// đặt trạng thái cho các nút cmdOutput.Enabled = True '/// … (Có thể bỏ qua) cmdOpen.Enabled = False Exit Sub err: If cboPort.Text = "" Then MsgBox "Hãy chọn cổng COM cần mở!", vbInformation, "Chọn COM Port" Else MsgBox "Không thể mở cổng COM " & cboPort.Text, vbCritical, "Failed" End If End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Đóng cổng COM đang mở Private Sub cmdClose_Click() On Error GoTo err comModem.PortOpen = False cmdOutput.Enabled = False cmdClose.Enabled = False Trang 103
  11. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 cmdOpen.Enabled = True Exit Sub err: End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Gửi lệnh ra cổng COM khi click nút OutPut Private Sub cmdOutput_Click() On Error GoTo err Dim Buffer As String comModem.Output = cboCommand.Text & Chr$(13) Exit Sub err: lstReceived.AddItem err.Description, 0 End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Sự kiện này được kích hoạt mỗi khi có dữ liệu gửi đến cổng COM Private Sub comModem_OnComm() Sleep 200 '///chờ 200 ms. (Cần phải có vì Modem thường bị trễ) Dim Buffer As String Buffer = comModem.Input Buffer = "onCom : " & Buffer lstReceived.AddItem Buffer, 0 End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() '/// Bạn cần xem thiết bị nối với cổng Com có số hiệu là Com mấy và đặt cho phù hợp cboPort.Text = "1" '/// Giả sử là cổng Com1 '/// Thêm một số lệnh cơ bản về Modem (Có thể tham khảo tập lệnh của Modem) cboCommand.Text = "AT" '/// Lệnh kiểm tra modem cboCommand.AddItem "AT" cboCommand.AddItem "AT VCID = 1" cboCommand.AddItem "AT# CID" cboCommand.AddItem "ATDT 0912068582" cboCommand.AddItem "ATDT 713319" '/// Quay (gọi) điện đến số 713319 cboCommand.AddItem "ATDT 713153" End Sub Bài 3 a. Hướng dẫn: Sử dụng thuộc tính Row, Col để chuyển đến ô cần tham chiếu, ví dụ cần chuyển đến ô có chỉ số hàng là 10, cột là 20 thì chỉ cần đặt Row = 10, Col = 20. Muốn lấy hoặc thay đổi giá trị của một ô ở hàng i, cột j thì viết theo cú pháp: TextMaTrix(i,j). b. Chương trình mẫu. Form1.frm Option Explicit Dim SL_BanGhi As Integer '/// Biến lưu số lượng bản ghi đã thêm vào '/// Khi người dùng click vào ô nào thì biến Row và Col sẽ lưu chỉ số hàng và cột của ô đó '/// Hàm Round(X,N) trả về giá trị làm tròn số X đến n chữ số sau dấu chấm. Private Sub cmdCapnhat_Click() Dim DongHienTai As Integer DongHienTai = flxDanhSach.Row '/// Lấy dòng hiện tại đang được chọn Trang 104
  12. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 With flxDanhSach '/// sử dụng từ khoá with để tránh viết lại tên .TextMatrix(DongHienTai, 1) = txtHoVaTen.Text .TextMatrix(DongHienTai, 2) = txtPascal.Text .TextMatrix(DongHienTai, 3) = txtC.Text .TextMatrix(DongHienTai, 4) = txtVB.Text .TextMatrix(DongHienTai,5)=(Val(txtPascal.Text)+Val(txtC.Text)+Val(txtVB.Text)) / 3 .TextMatrix(DongHienTai, 5) = Round(.TextMatrix(DongHienTai, 5), 1) End With End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Ghi danh sách nhập vào FlexGrid ra một file văn bản. Mỗi bản ghi trên một dòng Private Sub cmdLuu_Click() Dim F As Long, i As Integer, S As String F = FreeFile '/// xin một thẻ file còn trống Open "c:\FlexGrid.txt" For Output As #F '/// mở để ghi (output = ghi) For i = 1 To SL_BanGhi With flxDanhSach S= .TextMatrix(i, 0) & vbTab & .TextMatrix(i, 1) & vbTab & .TextMatrix(i, 2) S= S & .TextMatrix(i, 3) & vbTab & .TextMatrix(i, 4) & .TextMatrix(i, 5) Print #F, S '/// hàm Print để ghi giá trị S vào file F End With Next Close #F '/// Đóng file với thẻ file F MsgBox "Đã lưu dữ liệu ra tệp C:\FlexGrid.txt !", vbInformation End Sub '----------------------------------------------------------------------------------------------------------------------------- '/// Thêm một bản ghi mới vào FlexGrid Private Sub cmdThem_Click() SL_BanGhi = SL_BanGhi + 1 '/// tăng số lượng bản ghi mỗi khi thêm '//// Xin thêm dòng mới nếu FlexGrid bị đầy If flxDanhSach.Rows = SL_BanGhi Then flxDanhSach.Rows = SL_BanGhi + 1 With flxDanhSach .TextMatrix(SL_BanGhi, 0) = SL_BanGhi .TextMatrix(SL_BanGhi, 1) = txtHoVaTen.Text .TextMatrix(SL_BanGhi, 2) = txtPascal.Text .TextMatrix(SL_BanGhi, 3) = txtC.Text .TextMatrix(SL_BanGhi, 4) = txtVB.Text .TextMatrix(SL_BanGhi,5)=(Val(txtPascal.Text)+Val(txtC.Text)+Val(txtVB.Text)) / 3 .TextMatrix(SL_BanGhi, 5) = Round(.TextMatrix(SL_BanGhi, 5), 1) End With txtHoVaTen.Text = "" txtPascal.Text = "" txtC.Text = "" txtVB.Text = "" End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Xoá bản ghi (dòng) hiện hành bằng phương thức RemoveItem. Cần bắt lỗi ở đây. Private Sub cmdXoa_Click() On Error Resume Next flxDanhSach.RemoveItem flxDanhSach.Row '/// Xoá dòng hiện tại (Row) SL_BanGhi = SL_BanGhi - 1 Trang 105
  13. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 If err Then MsgBox err.Description '/// Hiển thị thông báo khi có lỗi xảy ra End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Hiển thị giá trị của dòng hiện tại trong FlexGrid mỗi khi người dùng Click lên dòng đó Private Sub flxDanhSach_Click() Dim DongHienTai As Integer DongHienTai = flxDanhSach.Row txtHoVaTen.Text = flxDanhSach.TextMatrix(DongHienTai, 1) txtPascal.Text = flxDanhSach.TextMatrix(DongHienTai, 2) txtC.Text = flxDanhSach.TextMatrix(DongHienTai, 3) txtVB.Text = flxDanhSach.TextMatrix(DongHienTai, 4) End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Đặt một số thuộc tính khởi đầu cho FlexGrid. (Bạn cũng có thể đặt nó trong lúc thiết kế) Private Sub Form_Load() With flxDanhSach .Font.Name = ".vnArial" .Font.Size = 12 .Rows = 2 '/// Số lượng hàng .Cols = 6 '/// Số lượng cột .FixedCols = 0 '/// Số cột cố định (có Màu xám) .AllowUserResizing = flexResizeBoth '/// Cho phép kéo giãn hàng / cột .TextMatrix(0, 0) = "Số TT" '/// Đặt tiêu đề cho các cột .TextMatrix(0, 1) = "Họ và tên" .TextMatrix(0, 2) = "Pascal" .TextMatrix(0, 3) = "C++" .TextMatrix(0, 4) = "VB" .TextMatrix(0, 5) = "Trung bình chung" End With SL_BanGhi = 0 End Sub c. Ghi chú: • FlextGrid cũng quan niệm ma trận hàng và cột cũng có thể coi như một mảng, khi đó có thể truy cập từng phần tử của mảng thông qua chỉ số, Ví dụ : .Array(i) sẽ trả về phần tử thứ i. • Cũng có thể chèn một ảnh vào các ô của Flex. Ví dụ để đặt ảnh trong điều khiển Picture1 vào ô hiện hành thì viết: flxDanhSach.PictureType = flexPictureColor Set flxDanhSach.CellPicture = Picture1.Picture Bài 4 a. Hướng dẫn: • Muốn mở một trang Web thì sử dụng phương thức Navigate hoặc Navigate2 của điều khiển Web Browser. • Ngoài ra, nếu có nhu cầu truy cập trực tiếp tới từng phần tử trong trang web đang được mở thì cần phải khai báo một đối tượng HTMLDocument (đối tượng này nằm trong thư viện HTML Object Library). Trong đó dùng phương thức getElementById để tham chiếu đến đối tượng trên trang web thông qua tên của đối tượng ấy. và dùng phương thức getAttribute để lấy giá trị một thuộc tính nào đó của đối tượng tham chiếu bởi getAttribute. Trang 106
  14. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 • Để biết rõ hơn về các đối tượng trên trang Web, cần nắm rõ mô hình DOM. b. Chương trình mẫu Form1.frm Option Explicit Dim Doc As HTMLDocument '/// Biến trỏ đến đối tượng tài liệu (Document) đang mở '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() webMain.Navigate "about:blank" '/// Mở một trang web trắng - Blank cmdGhiGiaTri.Enabled = False '/// tạm thời cấm nút này cmdDocGiaTri.Enabled = False End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '///Phương thức getElementById ("HopBox") sẽ tham chiếu đến đối tượng có tên là "HopBox" '/// Phương thức getAttribute("value") sẽ đọc giá trị của thuộc tính "value" của đối tượng đó Private Sub cmdDocGiaTri_Click() MsgBox Doc.getElementById("HopBox").getAttribute("value") End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Phương thức setAttribute("value", S) sẽ gán giá trị S vào thuộc tính có tên là "value" Private Sub cmdGhiGiatri_Click() Dim S As String S = InputBox("Nhập một xâu chữ để lưu textbox") Call Doc.getElementById("HopBox").setAttribute("value", S) End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Phương thức Navigate của điều khiển Webbrowser dùng để mở một trang Web Private Sub cmdMo_Click() webMain.Navigate txtURL.Text End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Toàn bộ nội dung của trang Web được lưu trong thuộc tính innerHTML. '/// Do vậy để thêm nội dung vào trang Web thì ta chỉ việc ghép thêm vào thuộc tính này Private Sub cmdTaoNut_Click() Doc.body.innerHTML=Doc.body.innerHTML &"" Doc.body.innerHTML=Doc.body.innerHTML &"" cmdGhiGiaTri.Enabled = True '/// Đã thêm nút rồi nên cho phép đọc và ghi giá trị vào. cmdDocGiaTri.Enabled = True cmdTaoNut.Enabled = False End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Ghép nội dung cần thêm vào thuộc tính innerHTML. Để biết rõ về cách tổ chức nội dung '/// của trang Web, hãy vào Internet để biết rõ về mô hình đối tượng tài liệu – DOM. Private Sub cmdThemHello_Click() Doc.body.innerHTML = Doc.body.innerHTML & "Hello " End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Khi trang web mở xong một trang thì sự kiện này xuất hiện. Khi đó ta mới cho '/// biến đối tượng Doc "trỏ" đến đối tượng Document này (Phải sử dụng câu lệnh Set). Private Sub webMain_DocumentComplete(ByVal pDisp As Object, URL As Variant) Set Doc = webMain.Document End Sub Trang 107
  15. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 c. Ghi chú: • Đây là vấn đề cực kỳ quan trọng khi chúng ta muốn thao tác (đọc/ ghi) đến nội dung của một trang Web thông qua môi trường VB. • Hiểu rõ bản chất của mô hình đối tượng tài liệu (DOM) trong trang web giúp ta có thể xây dựng được rất nhiều ứng dụng, ví dụ : Có thể xây dựng các chương trình hỗ trợ download hàng loạt như TeleportPro, WebZip, Chat…. • Bạn đọc cũng có thể tham khảo sách về HTML, DHTML & JavaScript tại Trung tâm Aptech để biết rõ hơn về mô hình DOM, về innerHTML …. Bài 5 a. Hướng dẫn: Internet control có thể lấy dữ liệu từ máy chủ về thông qua 2 giao thức là HTTP và FTP. Phương thức OpenURL là cách đơn giản để lấy dữ liệu về, đồng thời có thể lưu ngay vào file. Phương thức này cũng được gọi là phương thức hoạt động đồng bộ (synchronous), có nghĩa là việc lấy dữ liệu về phải được hoàn tất thì các lệnh tiếp sau mới được thực hiện. Cũng có thể nhận dữ liệu bằng phương thức khác như Execute, nhưng phương thức Execute lại hoạt động ở chế độ không đồng bộ (Asynchronous), tức là câu lệnh tiếp theo lệnh này sẽ được thực hiện không phụ thuộc vào việc dữ liệu đã lấy về hay chưa (Thường sử dụng trong ứng dụng phức tạp). Trong trường hợp này, xin sử dụng phương thức OpenURL để lấy dữ liệu về. Cú pháp của phương thức này như sau: OpenURL url [, ]. Trong đó, url là địa chỉ của trang Web (ví dụ http:///www.myweb.com/index.htm hay ftp://home.com/default.html), Còn kiểu dữ liệu lấy về cho biết là dữ liệu lấy về xem như một mảng xâu (hằng icString) hay một mảng byte (hằng icByteArray). Mặc định xem như một mảng xâu. b. Chương trình mẫu Form1.frm Option Explicit '/// Các hàm API nên copy từ API Text Viewer Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hWnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long '/// Thực hiện download trang web khi click nút Download Private Sub cmdDownload_Click() Dim bData() As Byte '/// Mảng Byte chứa dữ liệu Download về Dim F As Long F = FreeFile() '///Kết quả của phương thức OpenURL sẽ được lưu vào một mảng Byte và được lưu ra đĩa bData() = Inet1.OpenURL(txtURL.Text, icByteArray) Open "c:\Tam001.htm" For Binary Access Write As #F Put #F, , bData() '/// ghi vào file Close #F '/// Đóng file If MsgBox("Đã· lưu ra đĩa. Bạn có muốn mở không ?", vbYesNo) = vbYes Then ShellExecute Me.hWnd, "open", "c:\Tam001.htm", vbNullString, "c:\", 1 End If End Sub Trang 108
  16. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 c. Ghi chú: • Nhiều ứng dụng có thể lấy về và hiển thị trên một điều khiển nào đó, ví dụ Richtext thì có thể viết như sau: Private Sub Form_Load() Inet1.AccessType = icUseDefault RichTextBox1.Text = Inet1.OpenURL (InputBox("URL", ,"ftp://ftp.microsoft.com")) End Sub • Phương thức Execute cho phép ta thực hiện rất nhiều lệnh FTP chuẩn như LS, DIR, CDUP, CD, PUT, GET, SEND v.v…do vậy có thể dễ dàng viết các ứng dụng FTP Client (như CuteFTP chẳng hạn) • Điểu khiển này cũng có thể sử dụng rất tốt vào việc gửi (Upload) một file lên Server thông qua giao thức FTP. Thực tế có thể được sử dụng để chuyển file lên các máy Server cục bộ. • Các ví dụ về phương thức Execute, OpenURL, GetChunk… của điều khiển này rất nhiều và rất hay, được giới thiệu rất kỹ trong MSDN. Bài 6 a. Hướng dẫn: Chỉ cần sử dụng 2 thuộc tính cơ bản là FileName và Command. Để biết rõ hơn, có thể tham khảo thêm trong MSDN. b. Chương trình mẫu Form1.frm Option Explicit Private Sub cmdOpenFile_Click() '/// Chỉ hiển thị các file có đuôi wav, avi và *.* dlgOpenFile.Filter = "Cac file Wav va AVI (wav,avi)|*.wav;*.avi| Tat ca |*.*|" dlgOpenFile.ShowOpen mmcPlayer.FileName = dlgOpenFile.FileName Select Case LCase(Right(dlgOpenFile.FileName, 3)) '/// Kiểm tra phần đuôi Case "wav" mmcPlayer.DeviceType = "WaveAudio" Case "avi" mmcPlayer.DeviceType = "AVIVideo" Case "cda" mmcPlayer.DeviceType = "CDAudio" '.............................................................................. End Select mmcPlayer.Command = "open" '/// bắt đầu Play End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() '/// Đặt một số thuộc tính cho điều khiển (Xin tham khảo ý nghĩa trong MSDN). mmcPlayer.Notify = False mmcPlayer.Wait = True mmcPlayer.Shareable = False End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Unload(Cancel As Integer) mmcPlayer.Command = "Close" '/// Giải phóng tài nguyên trước khi thoát Trang 109
  17. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 End Sub c. Ghi chú: • Đây là điều khiển rất hay được dùng trước kia, tuy nhiên hiện nay đã có các điều khiển mạnh mẽ hơn rất nhiều, như điều khiển Window Media Player hay Window Active Movie chẳng hạn (sẽ được giới thiệu trong bài 14). Do vậy, bài này chỉ giới thiệu với mục đích tham khảo thêm. • Để một nút (Command button) có thể hiển thị được biểu tượng trên đó thì cần đặt thuộc tính Style = Graphical trong lúc thiết kế. Bài 7 a. Hướng dẫn: Điều khiển này rất hay trong một số bài toán mà giá trị hay thậm chí là câu lệnh được nhập vào khi chương trình đang chạy. Do vậy nó sẽ vô cùng hữu ích cho những bài toán mà giá trị và công thức tính toán đưa vào là không biết trước. Trong bài tập này lấy ví dụ về việc người dùng nhập vào một biểu thức toán học bất kỳ và chương trình sẽ tính và cho ra kết quả sử dụng điều khiển Script. b. Chương trình mẫu Form1.frm Option Explicit '/// Phương thức Eval sẽ trả về giá trị tính toán được (trong trường hợp không có lỗi). Private Sub cmdketqua_Click() MsgBox scrMain.Eval(txtBieuThucToanHoc.Text) End Sub c. Ghi chú: Điều khiển Script còn hỗ trợ khả năng đưa và thực thi các câu lệnh của VB ngay khi chương trình đang chạy. Ví dụ sau đây sẽ gọi một thủ tục từ Script: Private Sub Form_Load() Dim S As String S = "Private Sub Hello()" & vbCrLf S = S & "Msgbox ""Hello World. Tôi đến từ Script Control !""" & vbCrLf S = S & "End Sub" scrMain.AddCode S '/// Thêm mã lệnh vào Script scrMain.ExecuteStatement "Call Hello()" '/// Thực thi mã lệnh End Sub Cũng xin nói thêm rằng : Trong VB, vì dấu nháy kép là một ký hiệu dùng để bao một hằng xâu, do vậy khi muốn thêm chính ký hiệu đó vào trong một xâu thì cần thêm vào trước đó một dấu nháy kép nữa (tức 2 dấu nháy kép thì được một dấu). Bài 8 a. Hướng dẫn: Thực tế thì điều khiển TAB rất hay được dùng, tuy nhiên lại rất đơn giản. Do vậy bài này sẽ sử dụng thêm một điều khiển đã được giới thiệu là FlexGrid để viết một chương trình chơi cờ CARO cho thêm phần thú vị. (Để chương trình có thể kiểm tra được ai thắng ai thua thì bạn đọc có thể tham khảo thêm thuật toán ở phần chương trước để hoàn thiện hơn). Với việc chơi cờ của 2 người, ý tưởng chính của chúng ta là dùng một biến để theo dõi hiện trạng là ai đang đi, người 1 hay Trang 110
  18. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 người 2 để chúng ta có thể điền được các ký hiệu tương ứng là "X" hay "O". Trong quá trình điền cũng cần phải kiểm tra xem ô đã điền rồi thì thôi. b. Chương trình mẫu Form1.frm Option Explicit Dim KichThuoc As Integer '/// Lưu kích thước của bàn cờ Dim NguoiDi As Integer '/// Cho biết là ai đang đi Dim Nguoi1 As String, Nguoi2 As String '/// Lưu ký hiệu "X" và "O" của 2 người chơi '/// Tạo một bàn cờ mới với kích thước bàn cờ là KichThuoc x KichThuoc Sub BanCoMoi() flxBanCo.Rows = KichThuoc flxBanCo.Cols = KichThuoc Dim i As Integer '/// đặt kích thước mỗi ô thành ô vuông, và tự co giãn theo độ rộng của FlexGrid For i = 0 To flxBanCo.Rows - 1 flxBanCo.RowHeight(i) = flxBanCo.Height \ flxBanCo.Rows flxBanCo.ColWidth(i) = flxBanCo.RowHeight(i) Next '/// Xoá trắng các ô trên bàn cờ. (TextArray sẽ xem Grid như một mảng) For i = 0 To flxBanCo.Rows * flxBanCo.Cols - 1 flxBanCo.TextArray(i) = "" Next NguoiDi = 1 '/// Cho người 1 được đi trước End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Mỗi khi click chuột thì tuỳ theo trước đó là ai đi để điền ký hiệu "X" hay "O" cho phù hợp '/// Sau đí điền xong thì lại "để cho người sau đi" bằng cách đảo lại giá trị của NguoiDi 1 2. Private Sub flxBanCo_Click() '/// Nếu ô này đã được điền rồi thì không làm gì (Exit Sub) If flxBanCo.TextMatrix(flxBanCo.Row, flxBanCo.Col) "" Then Exit Sub If NguoiDi = 1 Then flxBanCo.TextMatrix(flxBanCo.Row, flxBanCo.Col) = Nguoi1 If NguoiDi = 2 Then flxBanCo.TextMatrix(flxBanCo.Row, flxBanCo.Col) = Nguoi2 If NguoiDi = 1 Then '/// Nếu Người 1 đi rồi NguoiDi = 2 '/// Để người 2 đi Else NguoiDi = 1 '/// Để người 1 đi End If End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub Form_Load() sstMain.Tabs = 2 '/// Tạo 2 trang (TAB) sstMain.TabCaption(0) = "Bàn cờ Caro" '/// Đặt caption cho tab thứ 1 sstMain.TabCaption(1) = "Cấu hình" '/// Đặt caption cho tab thứ 2 KichThuoc = 8 '/// Mặc định kích thước bàn cờ là 8x8 '/// Các thuộc tính này có thể đặt trong cửa sổ Properties. flxBanCo.BorderStyle = flexBorderNone flxBanCo.BackColorBkg = &HFFFFFF Trang 111
  19. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 flxBanCo.Width = flxBanCo.Height flxBanCo.FixedCols = 0 flxBanCo.FixedRows = 0 NguoiDi = 1 '/// Cho người 1 đi trước Nguoi1 = "X" '/// Ký hiệu nước đi của người 1 là "X" Nguoi2 = "O" '/// Ký hiệu nước đi của người 2 là "O" Call BanCoMoi '/// Vẽ bàn cờ End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Nếu người 1 đi trước thì ta đặt ký hiệu Nguoi1 = "X" trái lại ta đặt Nguoi1 = "O" Private Sub cmdThietLap_Click() If Val(txtKichThuoc.Text) = 0 Then Exit Sub '///Nếu không là số thì thoát KichThuoc = Val(txtKichThuoc.Text) If optNguoi1.Value = True Then Nguoi1 = "X" Nguoi2 = "O" Else Nguoi1 = "O" Nguoi2 = "X" End If BanCoMoi '/// Vẽ lại bàn cờ End Sub '///--------------------------------------------------------------------------------------------------------------------------------- Private Sub cmdVanMoi_Click() Call BanCoMoi End Sub c. Ghi chú: • Có thể chèn hình ảnh vào các ô thay vì ký tự cho chương trình thêm sinh động hơn. Hãy tham khảo bài số 3 về cách chèn ảnh vào trong một ô (Cell). • Kết hợp với bài toán kiểm tra 5 ô cùng số 1 thẳng hàng ở chương trước để kiểm tra xem ai thắng sau mỗi nước đi. • Có thể áp dụng cho trò chơi Line. Bài 9 a. Hướng dẫn: Đối với thanh tiến trình thì ta cần quan tâm đến các thuộc tính sau: • Min : Giá trị nhỏ nhất của thanh tiến trình • Max : Giá trị lớn nhất của thanh tiến trình • Value : Giá trị hiện thời của thanh của thanh Trong quá trình làm việc, ta có thể thay đổi các giá trị này cho phù hợp ! Hình 4.16 - Minh họa 3 thuộc tính quan trọng của thanh tiến trình b. Chương trình mẫu Trang 112
  20. BÀI TẬP LẬP TRÌNH HƯỚNG SỰ KIỆN Biên soạn: Bộ môn CNPM–ĐHSPKT HY 2005 Form1.frm Option Explicit '/// Khi mở file đích, dùng hàm Dir để kiểm tra tệp có tồn tại hay không. Private Sub cmdMoFileDich_Click() dlgMain.Filter = "Tất cả các file (*.*)|*.*|" dlgMain.DialogTitle = "Nhập vào tên file để lưu" dlgMain.ShowOpen txtFileDich.Text = dlgMain.FileName If Dir(txtFileDich.Text) "" Then MsgBox "File đích sẽ bị ghi đè !", vbCritical End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Cho người dùng chọn tên file nguồn cần copy Private Sub cmdMoFileNguon_Click() dlgMain.Filter = "Tất cả các file (*.*)|*.*|" dlgMain.ShowOpen txtFileNguon.Text = dlgMain.FileName End Sub '///--------------------------------------------------------------------------------------------------------------------------------- '/// Ở đây để thấy được thanh tiến trình chạy, ta copy từng byte một. '/// Tuy nhiên, trong thực hành giá trị của Buffer càng lớn thì tốc độ càng nhanh. Private Sub cmdCopy_Click() Dim F1 As Long, F2 As Long Dim Buffer As String * 1 '/// Vùng đệm 1 byte. F1 = FreeFile Open txtFileNguon.Text For Binary As #F1 '/// Đọc/ ghi ở chế độ nhị phân F2 = FreeFile Open txtFileDich.Text For Binary As #F2 pgrCopyFile.Value = 0 pgrCopyFile.Max = FileLen(txtFileNguon.Text) + 1 Do While Not EOF(F1) Get #F1, , Buffer '/// (Get) Đọc một byte từ file nguồn Put #F2, , Buffer '/// (Put) Ghi vào file đích pgrCopyFile.Value = pgrCopyFile.Value + Len(Buffer) lblPhanTram.Caption = Round(pgrCopyFile.Value/pgrCopyFile.Max * 100) & " %" DoEvents '///Để cho CPU xử lý các ứng dụng khác, tránh chiếm dụng tài nguyên Loop Close #F1 Close #F2 MsgBox "Đã copy xong !", vbInformation End Sub c. Chú ý : • Trong khi thao tác phải đảm bảo giá trị Value không được vượt quá Max. • Có thể thay đổi cách hiển thị khác bằng việc đặt lại thuộc tính "Scrolling" • Muốn hiển thị được ảnh trên các nút chuẩn (Command button) thì cần đặt thuộc tính Style = 1 –Graphical. Trang 113
nguon tai.lieu . vn