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

pdf 133 trang Gia Huy 17/05/2022 4320
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 2)", để 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_2.pdf

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

  1. CHƢƠNG 4 LẬP TRÌNH VỚI CÁC ĐIỀU KHIỂN MỞ RỘNG 4.1. Điều khiển Common Dialog Điều khiển hộp thoại thông dụng (Common Dialog) cung cấp một tập các hộp thoại chuẩn cho các thao tác nhƣ mở và lƣu trữ tệp tin, thiết lập các tuỳ chọn in, lựa chọn font chữ, màu. Điều khiển hộp thoại thông dụng cho phép ta hiển thị 6 loại hộp thoại thông dụng đó là: Open, Save As, Color, Font, Print, Help. Điều khiển hộp thoại thông dụng không phải điều khiển nội tại trong hộp công cụ. Muốn đƣa điều khiển hộp thoại thông dụng ra hộp công cụ, ta thực hiện các thao tác: Từ thực đơn Project ta chọn Components, xuất hiện hộp thoại Components, trong tab Control của hộp thoại ta tích vào mục Microsoft Common Dialog Control, sau đó kích OK. Muốn hiển thị hộp thoại thông dụng nào, ta đƣa điều khiển hộp thoại thông dụng lên Form, sau đó thiết lập các thuộc tính và gọi phƣơng thức hiển thị hộp thoại phù hợp. Các phƣơng thức tƣơng ứng để hiển thị các hộp thoại thông dụng: Phƣơng thức Hiển thị hộp thoại ShowOpen Open ShowSave Save As ShowColor Color ShowFont Font ShowPrinter Print ShowHelp Help 4.1.1. Open Dialog, Save Dialog Hộp thoại Open Dialog dùng để hiển thị hộp thoại Open (mở file). Hộp thoại Save Dialog dùng để hiển thị hộp thoại Save As (lƣu file). Hai hộp thoại này có một số thuộc tính chung, thông dụng gồm: Thuộc tính Giải thích CancelError Dùng để bắt lỗi khi ngƣời sử dụng nhấn nút Cancel nếu đƣợc gán giá trị True. DefaultExt Xác định phần mở rộng ngầm định của file DialogTitle Xác định tiêu đề của hộp thoại FileName Xác định tên và đƣờng dẫn của tệp tin mà ngƣời sử dụng đã chọn FileTitle Xác định tên tệp tin đƣợc chọn, không chứa đƣờng dẫn Filter Dùng để lọc kiểu tệp tin mà hộp thoại sẽ hiển thị 103
  2. FilterIndex Chỉ ra bộ lọc đƣợc sử dụng đầu tiên. InitDir Xác định thƣ mục sẽ hiển thị khi hộp thoại xuất hiện Ví dụ: Viết chƣơng trình sử dụng điều khiển hộp thoại Open và hộp thoại Save As để thực hiện mở, lƣu tập tin văn bản theo thiết kế sau: Mở tệp văn bản và hiển thị nội dung tệp trên textbox Mở tệp văn bản và lƣu nội dung trong textbox vào tệp Giải: Bƣớc 1. Thiết kế form theo mẫu bằng cách đƣa vào form 4 commandbutton, 1 textbox, sau đó xác định vị trí, kích thƣớc cho các điều khiển cho phù hợp. Bƣớc 2. Thiết lập một số thuộc tính cho các điều khiển nhƣ bảng sau: TT Điều khiển Thuộc tính Giá trị Ghi chú Name Form1 1 Form Caption Commondialog Name cmdopen 2 CommandButton Caption Open Name cmdsave 3 CommandButton Caption Save Name cmdappend 4 CommandButton Caption Append Name cmdexit Kết thúc chƣơng 5 CommandButton Caption Exit trình Bƣớc 3. Mở cửa sổ lệnh của Form1 và gõ vào các dòng lệnh sau: Dim f As Integer 'khai bao bien tep Private Sub cmdappend_Click() 104
  3. cdlhopthoai.ShowSave Open cdlhopthoai.FileName For Append As #f Print #f, Txtnd.Text Close f End Sub „ Private Sub cmdexit_Click() End End Sub Private Sub cmdopen_Click() Dim s As String cdlhopthoai.ShowOpen Open cdlhopthoai.FileName For Input As #f 'Mo tep de doc Do While EOF(f) = False Line Input #f, s Txtnd.Text = Txtnd.Text & s & Chr(13) & Chr(10) Loop Close f 'dong tep End Sub „ Private Sub cmdsave_Click() cdlhopthoai.ShowSave Open cdlhopthoai.FileName For Output As #f Print #f, Txtnd.Text 'Ghi van ban vao tep Close f End Sub Private Sub Form_Load() f = FreeFile End Sub Bƣớc 4. Chạy chƣơng trình (F5). 4.1.2. Color Dialog Hộp thoại Color cho phép ngƣời sử dụng chọn và hiển thị một màu từ bảng màu. Để hiển thị hộp thoại khi thi hành ta thực hiện nhƣ sau: Thiết lập giá trị cdlCCRGBInit cho thuộc tính Flags. Sử dụng phƣơng thức ShowColor để hiển thị hộp thoại. 105
  4. Sử dụng thuộc tính Color để lấy ra giá trị RGB của màu mà ngƣời sử dụng đã chọn. 4.1.3. Font Dialog Hộp thoại Font cho phép ngƣời sử dụng thay đổi font chữ, màu chữ, cỡ chữ, kiểu chữ. Khi ngƣời sử dụng thực hiện lựa chọn trong hộp thoại Font các thuộc tính sau sẽ lƣu trữ các thông tin về sự lựa chọn của ngƣời sử dụng. Thuộc tính Giải thích Color Trả về màu đã đƣợc ngƣời sử dụng chọn. FontBold Cho biết kiểu chữ đậm có đƣợc chọn hay không FontItalic Cho biết kiểu chữ nghiêng có đƣợc chọn hay không FontStrikethru Cho biết kiểu chữ gạch ngang (strikethrough)có đƣợc chọn hay không FontUnderline Cho biết kiểu chữ gạch dƣới (underline)có đƣợc chọn hay không FontName Trả về tên của font đã đƣợc ngƣời sử dụng chọn FontSize Trả về cỡ chữ đã đƣợc ngƣời sử chọn Để hiển thị hộp thoại font ta thực hiện nhƣ sau: Thiết lập một trong các giá trị hằng cho thuộc tính Flags: o cdlCFScreenFonts (fonts màn hình) o cdlCFPrinterFonts (fonts máy in) o cdlCFBoth (fonts màn hình và fonts máy in) Sử dụng phƣơng thức ShowFont để hiển thị hộp thoại. 4.2. Điều khiển Image List Điều khiển này chứa các hình ảnh để dùng với các điều khiển khác nhƣ là ListView, TreeView, TabStrip, ToolBar, PictureBox, Image. ImageList hỗ trợ các loại file ảnh nhƣ : bitmap (*.bmp), biểu tƣợng (*.ico), GIF (*.gif), JPEG (*.jpg) và con trỏ (*.cur). Để có thể dùng các điều khiển ImageList, ToolBar, StatusBar, ListView, TreeView trong đề án Visual Basic ta thực hiện nhƣ sau: Từ menu Project ta chọn Components xuất hiện hộp thoại Components, trong danh sách các thành phần ta tích mục “Microsoft Windows Common Controls 6.0 (SP6) sau đó nhấn OK. Các điều khiển trên đƣợc thêm vào hộp công cụ của Visual Basic. 106
  5. 4.2.1. Thêm phần tử ảnh cho ImageList lúc thiết kế Sau khi đã tạo một thể hiện của điều khiển ImageList lên form ta thực hiện các bƣớc sau: Nhấn nút phải chuột lên điều khiển ImageList và chọn Properties Chọn Tab Images để xem trang thuộc tính của điều khiển Nhấn Insert Picture để hiển thị hộp thoại Select picture Dùng hộp thoại để tìm tệp tin hình ảnh, rồi nhấn Open. Ta có thể chọn nhiều tệp tin cùng lúc. Chỉ ra thuộc tính Key bằng cách chọn hộp Key và nhập một chuỗi. Hình 4.1. Hộp thoại Property Pages 4.2.2. Thêm phần tử ảnh cho ImageList vào lúc thi hành Để thêm hình ảnh lúc thi hành ta sử dụng phƣơng thức Add của thuộc tính ListImage của đối tƣợng ImageList với cú pháp nhƣ sau: ListImage.Add([Index], [Key], [Picture]) Trong đó: Tham số Index xác định vị trí phần tử ảnh đƣợc bổ sung vào danh sách, nếu bỏ qua tham số này, phần tử ảnh đƣợc bổ sung vào cuối danh sách ảnh. Tham số Key dùng để đặt tên cho phần tử ảnh, có thể sử dụng sau này để truy xuất vào phần tử ảnh đƣợc đặt tên đó. Tham số Picure xác định phần tử ảnh nào đƣợc bổ sung vào danh sách. Ví dụ: ImageList1.ListImages.Add ,"Cut", LoadPicture("d:\bitmaps\cut.bmp") 107
  6. 4.2.3. Gỡ bỏ phần tử ảnh khỏi ImageList vào lúc thi hành Để gỡ bở một phần tử ảnh khỏi danh sách, ta sử dụng phƣơng thức Remove của thuộc tính ListImage của đối tƣợng ImageList và truyền cho nó Index hoặc Key của phần tử cần loại bỏ. Ví dụ: ImageList1.ListImages.Remove “Cut” 4.2.4. Truy xuất phần tử ảnh trong ImageList. Để truy xuất hình ảnh từ ImageList và gán cho các đối tƣợng khác ta sử dụng thuộc tính Picture của ListImage. Ví dụ: Lập chƣơng trình sử dụng các điều khiển: ImageList, Image, Commandbutton, Timer, Commondialog tạo album ảnh bằng cách bổ sung ảnh vào ImageList lúc thi hành rồi hiển thị ảnh lần lƣợt 2 giây một ảnh, theo form mẫu: Giải: Bƣớc 1. Thiết kế form bằng cách đƣa các điều khiểnImageList, Image, Commandbutton, Timer, Commondialog lên form sau đó xác định vị trí, kích thƣớc của các điều khiển cho phù hợp. Bƣớc 2. Xác định giá trị cho một số thuộc tính của các điều khiển theo bảng sau: TT Điều khiển Thuộc tính Giá trị Ghi chú Name Form1 1 Form Caption Album 2 Image Name Image1 3 ImageList Name ImageList1 4 Timer Name Timer1 108
  7. Interval 2000 Name cmdadd Bổ sung ảnh vào 5 Commandbutton Caption Add Imagelist Name cmddisplay 6 Commandbutton Hiển thị ảnh Caption Display 7 Commondialog Name Commondialog1 Bƣớc 3. Mở cửa sổ Code của form1 và gõ vào các dòng lệnh sau: Dim i As Byte Private Sub cmdAdd_Click() commondialog1.Filter = "Graphics file|*.jpg" commondialog1.ShowOpen imagelist1.ListImages.Add imagelist1.ListImages.Count + 1, , LoadPicture(commondialog1.FileName) End Sub „ Private Sub cmddisplay_Click() If i <= imagelist1.ListImages.Count Then image1.Picture = imagelist1.ListImages(i).Picture i = i + 1 Else i = 1 End If End Sub „ Private Sub Form_Load() i = 1 End Sub „ Private Sub Timer1_Timer() If i <= imagelist1.ListImages.Count Then image1.Picture = imagelist1.ListImages(i).Picture i = i + 1 Else i = 1 End If End Sub Bƣớc 4. Chạy chƣơng trình (F5). 109
  8. 4.3. Điều khiển MicroSoft Masked Edit Điều khiển MicroSoft Masked Edit cho phép định dạng dữ liệu nhập theo một định dạng đƣợc ấn định. Nó không những cung cấp một gợi ý trực quan để ngƣời sử dụng nhập liệu trong một trƣờng cụ thể mà còn cung cấp kiểm tra ở mức giao diện ngƣời sử dụng, để ngăn cản ngƣời sử dụng nhập các thông tin không hợp lệ vào điều khiển. Điều khiển MaskedEdit không có sẵn trong hộp công cụ. Nếu muốn sử dụng nó, ta thực hiện các thao tác sau để đƣa điều khiển vào hộp công cụ: Trong Visual Basic, chọn menu Project / Components. Hộp thoại Components xuất hiện. Trong danh sách các thành phần, tích vào mục “Microsoft MaskedEdit Control 6.0” rồi nhấn OK. 4.3.1. Dùng thuộc tính Mask để quy định mặt nạ nhập. Khi dùng điều khiển MaskedEdit, ta có khả năng ép ngƣời sử dụng nhập những thông tin theo một điều kiện nào đó. Ví dụ, với trƣờng mã khách hàng, ta có thể ép ngƣời sử dụng nhập tự 6 ký tự. Các quy tắc để quản lý những gì ngƣời sử dụng nhập vào trong một điều khiển Masked Edit đƣợc gọi là “Mặt nạ nhập- Masked”. Ta dùng thuộc tính Mask của điều khiển để gán mặt nạ nhập cho một điều khiển Masked Edit. Thuộc tính Mask đƣợc cấu tạo gồm một chuỗi ký tự thể hiện một mẫu để nhập dữ liệu trong hộp Masked Edit. Sau đây là các ký tự có thể đƣợc dùng trong chuỗi ký tự: Ký tự Mô tả # Chữ số . Số thập phân , Dấu phân cách hàng nghìn : Dấu phân cách giờ và phút / Dấu phân cách ngày tháng \ Mã escape để xử lý ký tự kế tiếp trong chuỗi tƣờng minh theo tứ tự từ trái qua phải & Dành chỗ cho ký tự > Chuyển đổi ký tự thành ký tự in hoa < Chuyển đổi ký tự thành ký tự thƣờng A Yêu cầu ký tự thuộc bảng chữ cái hay chữ số a Tuỳ chọn ký tự thuộc bảng chữ cái hay chữ số 9 Tuỳ chọn chữ số 110
  9. C Tuỳ chọn ký tự hay khoảng trắng ? 1 từ Các ký tự Hiển thị đúng nhƣ gõ vào khác Ví dụ, nếu ta ép ngƣời sử dụng nhập một số điện thoại 7 chữ số, ta quy định thuộc tính Mask nhƣ sau: # # # # # # # Lƣu ý: Nếu quy định thuộc tính Mask là một chuỗi rỗng, điều khiển Mask Edit sẽ hoạt động tƣơng tự điều khiển TextBox thông thƣờng. Nếu ngƣời sử dụng vi phạm điều kiện mặt nạ đã quy định, ứng dụng sẽ phát một tiếng “beep”, và ký tự bất hợp lệ sẽ không đƣợc chấp nhận. 4.3.2. Dùng thuộc tính Format để thay đổi hiển thị thông tin. Ngoài việc sử dụng thuộc tính Mask để yêu cầu ngƣời sử dụng nhập thông tin theo một điều kiện nào đó, ta còn có thể chỉ ra thông tin trong điều khiển sẽ đƣợc định dạng nhƣ thế nào trên màn hình. Ta thực hiện điều này bằng cách sử dụng thuộc tính Format của điều khiển Masked Edit. Ví dụ, nếu một trƣờng chứa 1 số điện thoại ta định hiển thị với dấu ngoặc và dấu gạch nối, ta dùng chuỗi Format nhƣ sau: (# # #) # # # - # # # # Điều này có nghĩa là ngƣời sử dụng chỉ cần nhập số điện thoại 10 chữ số. Các ký tự định dạng mở rộng, nhƣ là dấu ngoặc, đƣợc hiển thị tự động. 4.4. Điều khiển ToolBar Điều khiển ToolBar là một thanh công cụ chứa các nút (botton) mà ta có thể điều khiển đƣợc. Ta có thể chèn hình ảnh lên các nút nhờ đối tƣợng ImageList. Điều khiển ToolBar nằm trong nhóm các điều khiển thông dụng của Windows, nó cùng nhóm với điều khiển ImageList. 4.4.1. Thêm một nút lên thanh ToolBar Kích chuột phải vào điều khiển ToolBar và chọn Properties, hộp thoại Property Pages sẽ xuất hiện với 3 tab: General, Buttons và Picture. Chọn tab Button sau đó kích vào nút Insert Button để thêm một nút trên thanh ToolBar. Ta cần đƣa vào thuộc tính Key để phân biệt giữa các nút. 4.4.2. Chèn hình ảnh từ ImageList lên các nút Trong tab General của hộp thoại Property Pages chọn thuộc tính Imagelist là tên đối tƣợng ImageList mà ta đã đặt lên Form. 111
  10. Trong tab Buttons, thuộc tính Image sẽ lấy chỉ số của hình cần chèn đƣợc đặt trong ImageList, chỉ số này cho biết hình cần chèn là hình nào. 4.2.3. Các thuộc tính chính của Button trên ToolBar Trong tab Buttons thể hiện thuộc tính của các nút, Trong đó: Index: Xác định chỉ số của Button Caption: Xác định xâu ký tự hiển thị trên Button Key: Là xâu ký tự có thể dùng để phân biệt các Button Style: Xác định dạng hiển thị của Button, nó có thể nhận một trong các giá trị 0 – tbrDefault: Dạng mặc định của Button 1 – tbrCheck: Giống nhƣ CheckBox, nó lún xuống khi kích lần thứ nhất và trở về trạng thài ban đầu khi nhấn lần nữa. 2 – tbrButtonGroup: Khi ta lập 2 nút trở lên thành một nhóm thì khi kích nút nào thì nút đó sẽ nhấn xuống, khi kích một nút khác trong nhóm thì nút đƣợc kích sẽ lún xuống và nút đang lún trƣớc đó sẽ nổi lên. 3 - tbrSeparator: Tạo một dấu gạch ngăn cách giữa các nút hay nhóm nút. 4 - tbrPlaceHolder: Cho phép làm vật chứa cho nút điều khiển khác. 5 – tbrDropDown: Nút có thêm một phím mũi tên, cho phép liệt kê một số nút khác khi kích vào mũi tên này. Value: Xác định trạng thái của Button khi chƣơng trình thi hành là nhấn hay chƣa đƣợc nhấn, nó nhận một trong hai giá trị: 0 – tbrUnpressed: Mặc định nút chƣa đƣợc nhấn 1 – tbrPressed: Mặc định nút đƣợc nhấn 4.5. Điều khiển TreeView Là điều khiển dùng để trình bày cấu trúc tổ chức của một đối tƣợng nhƣ cấu trúc cây thƣ mục, tổ chức một cơ quan, một đơn vị. 4.5.1. Các thuộc tính Nodes: Thuộc tính quan trọng nhất của TreeView, là một danh sách các đối tƣợng Node (nút). Mỗi Node đƣợc xem là một cây con, có các nút con, nút cháu ImageList: Tham chiếu đến đối tƣợng ImageList chứa danh sách hình ảnh liên kết với TreeView. Ta có thể gán giá trị cho thuộc tính này trong hộp thoại Property Pages hoặc bằng câu lệnh nhƣ sau: Set TreeView1.ImageList = ImageList1 CheckBoxes (True/False): Làm xuất hiện CheckBox bên trái mỗi nút LabelEdit: Xác định chế độ sửa giá trị nhãn (0-tvwAutomatic, 1-tvwManual) 112
  11. LineStyle: Xác định kiểu đƣờng nối giữa nút cha và các nút con (0-tvwTreeLines, 1-tvwRootLines) SelectedItem: Trả về một Node đƣợc chọn trong TreeView hoặc dùng để chọn một Node trong TreeView Chọn nút gốc trong TreeView: Set TreeView1.SelectedItem = TreeView1.Nodes(“Root”) In giá trị nút đang đƣợc chọn Dim nd As Node Set nd = TreeView1.SelectedItem Debug.Print nd.Text Các thuộc tính của đối tƣợng Node Child: Tham chiếu đến nút con đầu tiên Children: Trả về số con Expanded (True/False): Làm xuất hiện/ẩn các nút con của một nút, tƣơng đƣơng với việc kích chuột vào nút +/- để triển khai/thu gọn một nút. FirstSubling: Tham chiếu đến nút con đầu tiên ở cùng cấp LastSubling: Tham chiếu đến nút con cuối cùng ở cùng cấp Next:Tham chiếu đến nút con tiếp theo ở cùng cấp Previous:Tham chiếu đến nút con liền trƣớc ở cùng cấp Parent: Tham chiếu đến nút cha của một nút Root: Tham chiếu đến nút gốc Sorted: Sắp xếp các nút cùng cấp theo thứ tự Alphabet Text: Chuỗi xuất hiện bên trái của nút Index: Số thứ tự của nút trong mảng chứa các nút cùng cấp Chƣơng trình con sau in ra nhãn (text) của nút con của một nút Private Sub List Children(pnod As Node) Dim pnodeCurrent As Node Set pnodeCurrent = pnod.Child For i = 1 to pnod.Children Debug.Print pnodCurrent.Text Set pnodeCurrent = pnodeCurrent.Next Next End Sub In các nút con của nút gốc Private Sub Command1_Click() Dim nd As Node Set nd = TreeView1.Nodes(“Root”) ListChildren nd End Sub 113
  12. 4.5.2. Phương thức Thêm một nút vào danh sách Add [Relative][,Relationship][,Key][,Text][,Image][,SelImage] Trong đó: Relative: Nhận giá trị là Key hoặc Index của nút mà nút mới đƣợc thêm vào. Quan hệ của nút mới thêm vào và nút đó nhƣ sau: 0-tvwFirst: Nút đƣợc thêm vào là nút đầu tiên so với các nút cùng cấp với nút đƣợc cho trong tham số Relative 1-tvwLast: Nút đƣợc thêm vào là nút cuối cùng so với các nút cùng cấp với nút đƣợc cho trong tham số Relative Relationship 2-tvwNext: Nút đƣợc thêm vào là nút tiếp theo của nút đƣợc cho trong tham số Relative 3-tvwPrevious: Nút đƣợc thêm vào là nút kế trƣớc của nút đƣợc cho trong tham số Relative 4-tvwChild: Nút đƣợc thêm vào là nút con của nút đƣợc cho trong tham số Relative Key: Chuỗi văn bản duy nhất cho mỗi nút Text: Chuỗi văn bản xuất hiện bên trái mỗi nút Image: Hình ảnh của nút ở trạng thái bình thƣờng SelImage: Hình ảnh của nút ở trạng thái đƣợc chọn Remove Index/Key: Xoá nút đƣợc xác định bởi Index/Key Clear: Xoá toàn bộ cây trong TreeView 4.5.3. Sự kiện NodeClick: Là sự kiện xảy ra khi ngƣời sử dụng kích chuột vào một nút 4.6. Điều khiển MultiMedia Điều khiển Multimedia MCI quản lí việc ghi và phát các tệp tin đa phƣơng tiện trên thiết bị giao tiếp điều khiển truyền thông (Media Control Interface - MCI). Điều khiển này chứa một loạt các nút bấm để phát ra các lệnh tới các thiết bị nhƣ CD- ROM, audio, video v.v Điều khiển Multimedia không có sẵn trong hộp công cụ. Để đƣa điều khiển Multimedia vào hộp công cụ, ta làm nhƣ sau: 114
  13. - Trong Visual Basic, chọn menu Project / Components. Hộp thoại Components xuất hiện. - Trong danh sách các thành phần, tích chọn “Microsoft Multimedia Control 6.0”. - Nhấn OK. Điều khiển Multimedia (MMControl) đƣợc thêm vào hộp công cụ của Visual Basic. Nháy đúp chuột vào điều khiển MMControl để đƣa điều khiển lên Form. Khi đó Form có dạng: Với các nút tƣơng ứng là: Prev, Next, Play, Pause, Back, Step, Stop, Record, và Eject. Sau khi nạp điều khiển MCI vào đề án, bạn đặt nó lên biểu mẫu và định cỡ nó theo nhu cầu. Do điều khiển MCI có thể truy xuất nhiều kiểu phƣơng tiện khác nhau, chúng ta phải báo cho điều khiển biết sẽ dùng kiểu nào bằng cách thiết lập giá trị cho thuộc tính DeviceType một trong các giá trị sau: Giá trị Phƣơng tiện CDAudio CD audio DAT Digital Audio Tape DigitalVideo Digital video Other Other Overlay Overlay Scanner Scanner Sequencer Sequencer VCR Vcr AVIVideo AVI Videodisc Videodisc Waveaudio Wave audio Sau khi xác lập DeviceType, ta phải mở thiết bị sử dụng lệnh Open. Lệnh này có cú pháp nhƣ sau: MMControl1.Command = “Open” Trong đó, MMControl1 là tên của điều khiển của MMControl. Thông thƣờng trƣớc khi sử dụng lệnh Open ta thiết lập giá trị cho một số thuộc tính. Ví dụ: 115
  14. MMControl1.Notify = False MMControl1.Wait = True MMControl1.Shareable = False MMControl1.Command = True MMControl1.DeviceType = "CDAudio" MMControl1.FileName = Audio_fname „Chỉ ra tên tập tin âm thanh MMControl1.Command = "Open" Nếu tính chất Notify đƣợc ấn dịnh theo True, điều khiển sẽ phát sinh sự kiện Done sau khi một lệnh đƣợc phát ra. Trong hầu hết các ứng dụng, tính chất Notify thƣờng không đƣợc dùng, do đó ở đây nó đƣợc ấn định theo False. Tính chất Wait đƣợc dùng để xác định cách thức mà chƣơng trình bắt đầu lại điều khiển sau khi truy xuất thiết bị Multimedia. Nếu tính chất Wait đƣợc ấn định theo False, điều khiển MCI sẽ không chờ cho phƣơng tiện đã chỉ định phát xong thì mới trả quyền điều khiển. Nếu tính chất Wait đƣợc ấn định theo True, quyền điều khiển chƣơng trình sẽ không trở về chƣơng trình của bạn cho đến khi phƣơng tiện đã chỉ định phát xong. Tính chất Shareable xác định một chƣơng trình khác sẽ đƣợc phép dùng chung thiết bị MCI. Tính chất này đƣợc ấn định theo True nếu nó đƣợc phép và False nếu nhƣ không. Giá trị của các tính chất này có thể thay đổi trong các chƣơng trình, nhƣng điều quan trọng phải biết đó là nếu dự định xác lập các giá trị này, chúng phải đƣợc ấn định trƣớc khi phát ra lệnh Open. Các lệnh tiếp theo có thể dùng với điều khiển MMControl là: Open, Close, Play, Pause, Stop, Back, Step, Prev, Next, Seek, Record, Eject, Save. Ví dụ: Ta dùng lệnh Play để mở tập tin âm thanh MMControl1.Command = “Play” Ta cũng có thể phát các lệnh khác tuỳ ý, nhƣ Pause và Stop. Để phát các lệnh này, ta dùng cú pháp giống nhƣ với lệnh Play. Khi phát xong kiểu phƣơng tiện mong muốn, ta phải đóng thiết bị, cũng nhƣ phải đóng một tập tin Visual Basic sau khi mở nó để bảo toàn tài nguyên. Để đóng thiết bị, ta phát lệnh Close, giống cú pháp của lệnh Play ở trên. 4.7. Menu Có hai loại menu thƣờng gặp là menu thả xuống (drop-down menu) và menu hiện lên (pop-up menu). Chúng ta thƣờng dùng menu drop-down làm menu chính cho chƣơng trình, nó thƣờng nằm theo chiều ngang, nếu ta nhấp chuột vào một mục chọn (menu command) thì chƣơng trình sẽ thả xuống một menu với những mục chọn con (MenuItems) nằm dọc theo chiều thẳng đứng. Nếu ta nhấp chuột lên mục chọn con nào đó có dấu hình tam giác nhỏ bên phải thì chƣơng trình sẽ hiện lên một 116
  15. menu nhƣ trong ví dụ sau đây: Nhấp chuột vào mục chọn đơn “Mầu sắc” chƣơng trình sẽ thả xuống một menu (drop-down menu); nhấp chuột vào mục chọn con “Chọn mầu”, chƣơng trình sẽ hiện lên một menu (pop-up menu). Ví dụ: Chúng ta quy ƣớc gọi lệnh đơn (mục chọn đơn) là Menu Command, và lệnh con (mục chọn con) là MenuItems. Thiết kế menu gồm 2 công việc: - Thiết kế giao diện. - Viết lệnh cho các thủ tục đáp ứng sự kiện chọn các mục menu. Chúng ta sẽ trình bày phần này bằng chƣơng trình chọn mầu nền cho Form và thay đổi kích thƣớc của Form. Chƣơng trình sẽ cung cấp một menu gồm có 2 trình đơn: “Mầu sắc” và “Kích thƣớc”. Trình đơn “Mầu sắc” cho phép ta thay đổi mầu nền của Form, trình đơn “Kích thƣớc” cho phép ta thay đổi kích thƣớc Form. - Trong trình đơn “Mầu sắc” có 2 mục là “Chọn mầu” và “Thoát”. Khi chọn mục “Chọn mầu” trong trình đơn “Mầu sắc”, một menu xuất hiện với 3 mục là “Xanh”, “Đỏ” và “Trắng”, đay là các mầu ta có thể chọn làm mầu nền Form. Khi ta chọn mục “Thoát” trong trình đơn “Mầu sắc”, chƣơng trình kết thúc. - Trong trình đơn “Kích thƣớc” có 2 mục là “Phóng to” và “Thu nhỏ”. Khi chọn mục “Phóng to”, kích thƣớc của Form sẽ phóng to chiếm toàn bộ màn hình. Khi chọn mục “Thu nhỏ”, kích thƣớc của Form sẽ thu nhỏ nhƣ lúc ban đầu. a) Thiết kế giao diện Bƣớc 1. Chọn một Form để thiết kế menu. Ví dụ Form có tên là frmMenu, có thuộc tính Caption là “Chon mau nen va kich thuoc Form”. Bƣớc 2. Gọi Menu Editor bằng 2 cách: Cách 1: Trên menu của Visual Basic chọn Tools -> chọn mục Menu Editor. 117
  16. Hình 4.2. Lệnh đơn Menu Editor Cách 2: Nhấn nút lệnh Menu Editor ( ) trên thanh công cụ chuẩn. Menu Editor Hình 4.3. Công cụ Menu Editor Bƣớc 3. Tạo các mục chọn trên menu: Sau khi gọi Menu Editor thì cửa sổ “Menu Editor” sẽ xuất hiện: Hình 4.4. Hộp thoại Menu Editor - Gõ tên mục chọn trong hộp gõ văn bản Caption. Ví dụ ta gõ “&Mầu sắc”. Nếu muốn dùng phím thay thế khi sử dụng menu, ta có thể đặt dấu & ở ngay trƣớc ký tự mà ta muốn trong phần Caption này, ví dụ nhấn Alt-M sẽ cho chọn mục “Mầu sắc”. Để tạo gạch ngang phân cách giữa các mục chọn, tại hộp gõ văn bản ta gõ dấu trừ “- “. 118
  17. - Gõ tên mục chọn trong hộp văn bản “Name”, quy ƣớc có “mnu” ở tên để phân biệt với các đối tƣợng khác trong Form. Ví dụ, đặt tên cho mục chọn đơn là “mnuMausac”. Nhấp chuột vào nút “Next” để tạo các mục chọn khác menu. Tƣơng tự nhƣ đã tạo Menu Command “Mầu sắc” ở trên, ta tạo Menu Command “Kích thƣớc”. Trong các Menu Command thƣờng có các MenuItems. Tất cả các MenuItems của Menu Command đều nằm thụt vào bên phải với 4 dấu chấm “ .” ở phía trƣớc. Khi ta nhấp chuột vào dấu mũi tên chỉ sang bên phải trong cửa sổ Menu Editor thì MenuItems ta đang chỉnh sửa sẽ có thêm 4 dấu chấm “ .”, tức là thụt vào một bậc trong Menu. Nếu muốn tạo MenuItems có cấp thấp hơn nữa thì ta lại tiếp tục nhấp mũi tên sang phải , MenuItems lại thụt tiếp một bậc nữa. 119
  18. Tƣơng tự, nếu ta nhấp mũi tên sang trái thì MenuItems đang chỉnh sửa sẽ mất 4 dấu chấm “ .” phía trƣớc, tức là nó đã đƣợc trồi ra một bậc. Ta tạo các MenuItems cho Menu Command “Mầu sắc” gồm: “Chọn mầu”, dấu gạch ngang và “Thoát”. Menu Command “Kích thƣớc” có các MenuItems là “Phóng to” và “Thu nhỏ” bằng cách tạo nhƣ các Menu Command rồi nhấp vào mũi tên sang phải để nó trở thành các MenuItems, ta cũng có thể thay đổi thứ tự các mục chọn trong menu sử dụng các phím mũi tên lê, mũi tên xuống. Để chèn một dòng mới vào menu đã có sẵn, ta đặt thanh sáng ở dòng muốn chèn vào trƣớc nó rồi nhấn vào nút “Insert”. Để xoá một dòng trong menu, ta chọn dòng muốn xoá rồi nhấn nút “Delete”. Mỗi MenuItems có thêm một tính năng nữa, đó là ta có thể tạo phím tắt cho nó trong mục “Shortcut”. Ví dụ, ta có thể dùng phím tắt Ctrl-E để thay cho việc chọn lệnh đơn “Thoát”. Có một số tuỳ chọn trong Menu Editor chúng ta có thể chọn nhƣ Mục “Visible” dùng để hiện/ẩn một mục chọn trong menu. Mục “Enable” dùng để cho phép/vô hiệu hoá một mục chọn trong menu Mục “Check” dùng để thêm/không thêm dấu kiểm bên trái một mục chọn trong menu khi nó đƣợc chọn. Sau đây là bảng danh mục các mục chọn trên menu của Form “frmMenu”: Mục chọn Caption Name Checked Mầu sắc &Mầu sắc mnumausac Chọn mầu .&Chọn mầu mnuchonmau Xanh &Xanh mnuXanh x Đỏ &Đỏ mnuDo x Trắng &Trắng mnuTrang x 120
  19. Dấu gạch ngang .- mnugach Thoát .&Thoát mnuThoat Kích thƣớc &Kích thƣớc mnukichthuoc Phóng to .&Phóng to mnuTo x Thu nhỏ .&Thu nhỏ mnuNho x Ghi chú: Muốn hiển thị đƣợc menu tiếng Việt, ta chọn bộ mã TCVN3 để gõ tên mục chọn trong Menu Editor. Trƣớc khi chạy chƣơng trình ta thiết lập thuộc tính font cho menu của hệ thống nhƣ sau: Kích phải chuột vào màn hình nền, chọn Properties để hiển thị hộp thoại Display Properties, chọn Tab Appearance, rồi nhấn nút Advanced, trong mục Item chọn Menu, sau đó chọn font .vntime, cỡ 12 rồi nhấn nút OK, tiếp đó nhấn nút Apply và cuối cùng là nhấn nút OK. Đừng bận tâm nếu trong hộp thoại Menu Editor không hiển thị đúng tiếng Việt. b) Viết lệnh cho các thủ tục đáp ứng sự kiện chọn (Click) mục chọn Mỗi mục chọn trên menu có một thủ tục đáp ứng sự kiện Click của ngƣời sử dụng chƣơng trình. Ví dụ, khi ngƣời sử dụng chọn mục “Thoát” trong trình đơn “Mầu sắc” thì thủ tục mnuthoat_Click( ) đƣợc thực hiện. Thủ tục Form_Load ( ) Thủ tục này thực hiện ngay khi ta khởi động chƣơng trình. Thủ tục làm nhiệm vụ ẩn đi 2 mục “Trắng” và “Thu nhỏ” bằng cách đặt thuộc tính “Enable” có giá trị là False. Private Sub Form_Load() mnutrang.Enabled = False mnunho.Enabled = False End Sub Thủ tục mnudo_Click ( ) Thủ tục đƣợc thực hiện khi ta chọn mục “Đỏ”. Thủ tục có nhiệm vụ đổi mầu nền của Form thành mầu đỏ và cho ẩn đi mục “Đỏ”, đồng thời bật các mục “Xanh” và “Trắng” lên. Private Sub mnuDo_Click() frmMenu.BackColor = vbRed ' Đặt mầu nền là đỏ mnudo.Enabled = False ' Vô hiệu hoá mục chọn “Đỏ” mnuxanh.Enabled = True ' Cho phép sử dụng mục chọn “Xanh” mnutrang.Enabled = True ' Cho phép sử dụng mục chọn “Trắng” End Sub Thủ tục mnuTrang_Click ( ) 121
  20. Tƣơng tự thủ tục mnuDo_Click(), nhƣng đổi mầu nền của Form thành mầu trắng và cho vô hiệu hoá mục chọn “Trắng”. Thủ tục mnuXanh_Click ( ) Tƣơng tự thủ tục mnuDo_Click(), nhƣng đổi mầu nền của Form thành màu xanh và cho vô hiệu hoá mục chọn “Xanh”. Thủ tục mnuTo_Click ( ) Thủ tục thực hiện khi ta chọn mục “Phóng to”. Thủ tục làm nhiệm vụ đƣa cửa sổ Form về dạng lớn và vô hiệu hoá mục chọn “Phóng to” đi, đồng thời bật mục “Thu nhỏ”. Private Sub mnuTo_Click() frmMenu.WindowState = 2 'Đặt thủ tục Form ở dạng lớn mnuTo.Enabled = False 'Vo hiệu hoá mục chọn “Phóng to” mnunho.Enabled = True 'Cho phép đổi cửa sổ Form sang dạng nhỏ End Sub Thủ tục mnuNho_Click ( ) Thủ tục thực hiện tƣơng tự thủ tục mnuTo_Click() thực hiện thu nhỏ cửa sổ. Thủ tục mnuThoat_Click ( ) Thủ tục thực hiện khi ta chọn mục “Thoát”. Thủ tục làm nhiệm vụ kết thúc chƣơng trình. Private Sub mnuthoat_Click() End End Sub 4.8. Điều khiển RichTextBox Điều khiển RichTextBox cho phép ngƣời sử dụng nhập và sửa văn bản đồng thời cũng tạo ra nhiều đặc tính định dạng hơn điều khiển TextBox thông thƣờng Điều khiển RichTextBox tạo ra một số các thuộc tính mà ta có thể sử dụng để thay đổi định dạng của bất cứ phần nào thuộc văn bản trong điều khiển. Sử dụng các thuộc tính này ta có thể thay đổi màu chữ, chữ đậm hoặc nghiêng, tạo chỉ số trên, chỉ 122
  21. số dƣới. Ta cũng có thể điều chỉnh định dạng đoạn nhƣ canh lề trái, lề phải của đoạn. Muốn sử dụng điều khiển RichTextBox thì trên thanh công cụ phải có biểu tƣợng . Trƣờng hợp nó không xuất hiện ta thực hiện nhƣ sau: Từ thực đơn Project ta chọn Components, xuất hiện hộp thoại Components, trong tab Control của hộp thoại ta tích chọn mục Microsoft Rich TextBox Control 6.0 (SP4) sau đó nhấn nút OK. Có thể sử dụng RichTextBox nhƣ một hộp văn bản (TextBox) có khả năng lƣu trữ cao cho phép một ứng dụng có thể đọc các tệp tin văn bản có kích thƣớc lớn, cũng có thể dùng RichTextBox để tạo một bộ soạn thảo văn bản với đầy đủ các đặc tính vào một ứng dụng bất kì. 4.8.1. Các thuộc tính Thuộc tính Giải thích SelFontName Xác định tên Font chữ cho phần văn bản đƣợc chọn trong RichTextBox SelFontSize Xác định cỡ chữ (Font Size) cho phần văn bản đƣợc chọn trong RichTextBox SelFontColor Xác định màu chữ (Font Color) cho phần văn bản đƣợc chọn trong RichTextBox SelColor Xác định màu chữ (Font Color) cho phần văn bản đƣợc chọn trong RichTextBox SelBold Xác định chữ đậm (Bold) cho phần văn bản đƣợc chọn trong RichTextBox SelItalic Xác định chữ nghiêng (Italic) cho phần văn bản đƣợc chọn trong RichTextBox 4.8.2. Các phương thức LoadFile Filename: Mở và đọc file có định dạng RTF và ASCII . SaveFile Filename: Mở và ghi file có định dạng RTF và ASCII . SelPrint- In tất cả hoặc một phần của văn bản trong điều khiển. Add- Nhúng các đối tƣợng nhƣ: ảnh bitmap, các biểu tƣợng (Icons) vào trong điều khiển khi thi hành. Đây là phƣơng thức của đối tƣợng OLEObject của RichTextBox. 4.9. Câu hỏi trắc nghiệm 1) Chọn loại hộp thoại mà điều khiển CommonDialog có thể hiển thị đƣợc a. Open 123
  22. b. Font c. Color d. Cả 3 loại hộp thoại trên 2) Chọn loại định dạng file ảnh mà điều khiển ImageList có thể chứa: a. *.jpg b. *. bmp c. *.cur d. Cả 3 loại trên 3) Chọn phƣơng thức để hiển thị hộp thoại Printer a. ShowOpen b. ShowPrinter c. ShowColor d. ShowFont 4) Chọn phƣơng thức để bổ sung một phần tử (ảnh) vào ImageList lúc thi hành chƣơng trình. a. LoadPicture b. Add c. AddItem d. Remove 5) Chọn phƣơng thức để loại một phần tử (ảnh) ra khỏi ImageList lúc thi hành chƣơng trình. a. LoadPicture b.RemoveItem c. AddItem d. Remove 6) Chọn thuộc tính dùng để kiểm tra một Button trên Toolbar có đƣợc nhấn khi thi hành không a. Index b. Key c. Caption d. Value 7) Chọn thuộc tính để xác định chỉ số của các Button trên Toolbar a. Index b. Key c. Caption d. Value 124
  23. 4.9. Bài tập Bài tập 1: Tạo một chƣơng trình hiển thị một danh sách chọn lựa cho ngƣời dùng trong một ListBox, sau đó xử lý với cấu trúc quyết định Select Case. Mục đích của điều khiển sự kiện này là hiển thi một danh sách các quốc gia, sau đó hiển thị một thông điệp chào mừng bằng ngôn ngữ bản xứ khi ngƣời dùng chọn quốc gia của họ. Chẳng hạn: Tiếng Anh: Hello, programmer Tiếng Đức: Hallo, programmierer Tiếng Tây Ban Nha: Hola, programador Tiếng Ý: Ciao, programmatori Bài tập 2: Lập trình sử dụng các hộp thoại thông dụng : Open, Save, Font, Color để mở, lƣu tập tin văn bản, thay đổi font, màu của chữ trong hộp văn bản (RichTextbox) theo mẫu: Bài tập 3: Lập chƣơng trình sử dụng điều khiển Toolbar tạo một thanh công cụ trên đó có 3 nút thực hiện các chức năng sao chép, cắt, dán đoạn văn bản trong Richtextbox sử dụng Clipboard theo mẫu sau: 125
  24. Chú ý: Hình ảnh của mỗi nút trên Toolbar do sinh viên tự lựa chọn cho phù hợp. Bài tập 4: Viết chƣơng trình trình chiếu ảnh tự động cứ 2 giây một ảnh sử dụng điều khiển Timer, ImageList và điều khiển Image nhƣ hình sau: Bài tập 5: Viết chƣơng trình trò chơi Puzzle. Trò chơi đƣợc mô tả nhƣ sau: Không gian chơi gồm 16 ô số, đƣợc xếp trên 4 hàng, mỗi hàng gồm 4 cột. Trong đó có 15 ô có giá trị từ 1 đến 15 đƣợc phân bổ theo thứ tự ngẫu nhiên và 1 ô trống, nhƣ hình sau 126
  25. Ngƣời chơi phải tiến hành sắp lại các ô số này theo thứ tự để đƣợc kết quả nhƣ hình thì trò chơi kết thúc. Chƣơng trình hiển thị câu chúc mừng: “Chuc mung! Ban da thanh cong!!!” & tổng thời gian chơi. Ngƣời chơi có thể thực hiện chơi lại bằng cách chọn File\New. Chƣơng trình sẽ tự động xáo lại các ô chứa số & ô trống theo thứ tự ngẫu nhiên. Việc sắp xếp lại các ô số đƣợc thực hiện bằng cách sử dụng ô trống. Ngƣời dùng có thể chuyển một số từ các ô lân cận đến ô trống bằng cách nhấp chuột lên ô số đó. Chú ý rằng ngƣời dùng chỉ có thể di chuyển các số thuộc những ô lân cận trống. Bài tập 6: Lập chƣơng trình quản lý cây gia phả của một dòng họ sử dụng điều khiển TreeView, cây gia phả đƣợc hiển thị dƣới dạng cây thƣ mục. Bài tập 7: Thiết kế chƣơng trình nhƣ ứng dụng Notepad của Windows. Yêu cầu Thiết kế giao diện nhƣ sau: Xử lý các sự kiện 127
  26.  Mỗi khi Form thay đổi kích thƣớc, TextBox cũng thay đổi theo cho phù hợp với Form  New  Open, Save, Save As: mở hộp thoại Common Dialog cho phép chọn tập tin để mở hay lƣu. Sử dụng đối tƣợng FileSystemObject để thao tác với tập tin văn bản.  Exit  Font: Mở ra hộp thoại chọn Font, thiết lập Font của TextBox chính là Font đƣợc chọn trong hộp thoại. Xử lý mở rộng:  Khi ngƣời dùng đã lƣu tập tin rồi, lần thứ hai bấm vào Save thì không mở hộp thoại Common Dialog nữa mà sẽ lƣu với tên tập tin đã chọn trong lần Save đầu tiên.  Mỗi khi ngƣời dùng thay đổi nội dung của một tập tin, sau đó họ chọn Exit để đóng ứng dụng lại; một hộp thông điệp (Message Box) sẽ mở ra hỏi có lƣu tập tin hay không? 128
  27. CHƢƠNG 5. LẬP TRÌNH CƠ SỞ DỮ LIỆU 5.1. Nhắc lại một số khái niệm về cơ sở dữ liệu 5.1.1. Khái niệm cơ sở dữ liệu Cơ sở dữ liệu là một kho chứa thông tin. Có nhiều loại cơ sở dữ liệu, nhƣng ở đây chúng ta chỉ đề cập đến cơ sở dữ liệu quan hệ (relational database) là loại cơ sở dữ liệu phổ biến nhất hiện nay. Cơ sở dữ liệu quan hệ (CSDLQH) là kho thông tin có các đặc tính sau: - CSDLQH chứa dữ liệu trong các bảng (table) đƣợc cấu tạo bởi các bản ghi (record) và các trƣờng (field). - CSDLQH cho phép lấy về (hay truy vấn) các tập hợp dữ liệu con từ các bảng. - CSDLQH cho phép kết nối các bảng dữ liệu với nhau để truy cập các bản ghi liên quan với nhau chứa trong các bảng khác nhau. 5.1.2. Engine (bộ máy) CSDL Chức năng cơ bản của một CSDL đƣợc cung cấp bởi một bộ máy (Engine) cơ sở dữ liệu, đó là một hệ thống chƣơng trình quản lý cách thức chứa và trả về dữ liệu. 5.1.3. Bảng (Table), Trường (Field), Bản ghi (Record) CSDL đƣợc cấu tạo từ các bảng (table). Có thể hình dung bảng nhƣ là một lƣới hình chữ nhật ở đó trƣờng (field) là tên của các cột của lƣới chữ nhật, còn bản ghi (record) là một dòng của lƣới chữ nhật, mỗi dòng là một bộ giá trị của các trƣờng. Ví dụ: Bảng (table) danh sách học sinh gồm 4 cột hay là trƣờng (field) là MaHS (mã học sinh), HoTen (họ tên), NamSinh (năm sinh), (điểm thi): MaHS HoTen NamSinh Diem A100 Nguyễn Đình Thắng 1990 8.5 A121 Trần Văn Minh 1991 7.0 A155 Lê Bình 1990 6.5 A110 Vũ Thuý Hằng 1989 7.5 Mỗi dòng của bảng là một bản ghi (record), chẳng hạn dòng thứ nhất (bản ghi thứ nhất) có mã học sinh (MaHS) là “A100”, họ và tên (HoTen) là “Nguyễn Đình Thắng”, năm sinh (NamSinh) là 1990, điểm thi (Diem) là 8,5. Bảng có cấu trúc đƣợc định nghĩa sẵn và chứa dữ liệu phù hợp với cấu trúc này. Để tạo một cơ sở dữ liệu, trƣớc hết ta phải xác định thông tin gì cần theo dõi. Sau đó, ta thiết kế cơ sở dữ liệu, tạo bảng chứa các trƣờng định nghĩa kiểu dữ liệu sẽ có. 129
  28. Sau khi tạo ra cấu trúc cơ sở dữ liệu, tạo bảng chứa các trƣờng định nghĩa kiểu dữ liệu sẽ có. Ví dụ: ta tạo các bảng Danh sách khách hàng (tblDS_KH) và bảng Đơn đặt hàng (tblD_DH) nhƣ sau: Bảng tblDS_KH Field Mô tả Type Size Makh Mã khách hàng Text 6 Tenkh Tên khách hàng Text 50 Diachi Địa chỉ Text 200 Dienthoai Điện thoại Text 10 Fax Số Fax Text 10 Company Tên công ty Text 200 Utien Ƣu tiên Binary Email Thƣ điện tử Text 50 Bảng tblD_DH Field Mô tả Type Size Maddh Mã đơn đặt hàng Text 30 Makh Mã khách hàng Text 6 Ngaydh Ngày đặt hàng Date/Time Ngayhg Ngày hẹn giao hàng Date/Time Ddgiao Địa điểm giao hàng Text 200 Ta có thể kết nối hai bảng thông qua trƣờng Makh. Đây là mối quan hệ một - nhiều, đối với một bản ghi trong tblDS_KH, có thể không có, hoặc có nhiều bản ghi tƣơng ứng trong bảng tblD_DH. 5.1.4. Recordset Thao tác trên các bảng liên quan đến việc nhập và lấy về dữ liệu từ các bảng cũng nhƣ việc kiểm tra và sửa đổi cấu trúc các bảng. Để thao tác với cấu trúc bảng chúng ta dùng các câu lệnh định nghĩa dữ liệu. Để thao tác dữ liệu trong một bảng chúng ta dùng Recordset. Một Recordset là một tập hợp con các bản ghi đƣợc lấy từ cơ sở dữ liệu. Về khái niệm Recordset tƣơng tự nhƣ một bảng nhƣng có các thuộc tính và phƣơng thức riêng. Chúng ta có thể lập trình để tạo và sử dụng các recordset theo một trong ba kỹ thuật kết nối cơ sở dữ liệu: Các đối tƣợng truy cập dữ liệu (DAO), các đối tƣợng truy cập từ xa (RDO) và các đối tƣợng dữ liệu ActiveX (ADO). 130
  29. 5.2. Visual Data Manager 5.2.1. Tạo cơ sở dữ liệu Để tạo cơ sở dữ liệu dùng Visual Basic, ta có thể dùng tiện ích gọi là Visual Data Manager (VisData). Để chạy VisData, ta thực hiện các bƣớc sau : Bƣớc 1. Từ menu của Visual Basic chọn mục Add-ins, VisData, cửa sổ VisData sẽ xuất hiện. Hình 5.1. Cửa sổ Visual Data Manager (VisData) Bƣớc 2. Từ menu của VisData, chọn File, New. Từ menu con, chọn Microsoft Access, Version 7.0 MDB. Một hộp thoại tập tin xuất hiện. Chọn thƣ mục ta muốn lƣu cơ sở dữ liệu mới rồi gõ tên cơ sở dữ liệu chẳng hạn Education. Nhấn chuột vào nút Save. Cơ sở dữ liệu mới đƣợc tạo và VisData sẽ hiển thị một vài cửa sổ cho phép ta làm việc với cơ sở dữ liệu đƣợc hiển thị nhƣ hình dƣới đây. Hình 5.2. Các thành phần trong cửa sổ VisData Cửa sổ DataBase của VisData chứa tất cả các thành phần của cơ sở dữ liệu. Trong cửa sổ này ta có thể xem các thuộc tính, kiểm tra các bảng và các phần tử khác và 131
  30. thêm các thành phần mới vào cơ sở dữ liệu. Để xem các thuộc tính, ta nhấn chuột vào dấu cộng ở bên trái của mục Properties. Mục này sẽ mở ra nhƣ hình dƣới đây. Hình 5.3. Cửa sổ Data Window 5.2.2. Tạo bảng Để tạo một bảng cơ sở dữ liệu ta thực hiện các bƣớc sau: Bƣớc 1. Trong cửa sổ Database của VisData, nhấn chuột phải vào Properties. Một menu ngữ cảnh của cửa sổ sẽ xuất hiện, chọn New Table. Hộp thoại Table Structure sẽ xuất hiện nhƣ hình dƣới đây. Hình 5.4. Hộp thoại Table Structure Bƣớc 2. Khai báo tên bảng (Table name); Bƣớc 3. Khai báo danh sách trƣờng (Field): Tên trƣờng, kiểu dữ liệu, độ rộng. 132
  31. Ví dụ, ta sẽ tạo cấu trúc bảng để chứa danh sách khách hàng bằng cách thực hiện các thao tác: - Gõ Student trong ô Table Name. - Nhấn chuột vào nút Add Field. Hộp thoại Add Field sẽ xuất hiện cho phép ta khai báo tên trƣờng, kiểu dữ liệu và độ rộng của trƣờng. Hộp thoại Add Field đƣợc hiển thị nhƣ hình dƣới đây: Hình 5.5. Hộp thoại Add Field Trong ô Name gõ ID. Đây sẽ là tên của trƣờng mà ta tạo trong bảng Student. Trong ô size gõ 5. Điều này chỉ ra rằng mã sinh viên có thể lên đến 5 ký tự, nhƣng không thể dài hơn. Chọn Fixed Field để chỉ ra rằng đây không phải là trƣờng có chiều dài biến đổi, rổi nhấn nút OK. Trƣờng đƣợc thêm vào cấu trúc cơ sở dữ liệu. Bằng các thao tác tƣơng tự sử dụng Add Field, ta thêm các trƣờng: Name, Age, Sex, Add vào bảng Student. Khi ta hoàn tất việc nhập trƣờng, nhấn nút bấm Close. Bƣớc 4. Chỉ định chỉ mục và khoá chính Một chỉ mục là một thuộc tính ta có thể gán cho một trƣờng để tạo sự dễ dàng cho bộ máy cơ sở dữ liệu khi lấy về thông tin chứa trong trƣờng đó. Ví dụ, trong cơ sở dữ liệu theo dõi sinh viên, ứng dụng có thể tìm kiếm các sinh viên theo họ tên sinh viên hoặc mã sinh viên. Do đó, cần thiết phải tạo các chỉ mục trên những trƣờng này để giúp cho quy trình tìm bản ghi dựa trên các trƣờng này nhanh hơn. Khoá chính là kiểu chỉ mục đặc biệt. Một trƣờng đƣợc coi là một khoá chính của bảng phục vụ cho việc xác định duy nhất bản ghi. Vì vậy, không nhƣ các kiểu chỉ mục khác, sẽ không có hai bản ghi trên cùng một bảng mà có cùng giá trị cho trƣờng khoá chính. Tƣơng tự, khi thiết kế một trƣờng làm khoá chính, không có bản ghi nào chứa giá trị rỗng, giá trị NULL ở trƣờng này. Khi chỉ ra một trƣờng làm khoá chính của bảng, ta có thể tạo mối quan hệ giữa bảng này với các bảng khác trong cơ sở dữ liệu. 133
  32. Mỗi bảng mà ta thiết kế phải có ít nhất một khoá chính, và nó phải đƣợc đánh số chỉ mục trên những trƣờng mà ta mong đợi sẽ đƣợc truy vấn nhiều nhất. Trong trƣờng hợp của bảng Student khoá chính sẽ là trƣờng ID. Các chỉ mục phụ là trƣờng Name. Để tạo các chỉ mục và các khoá chính, ta thực hiện các thao tác sau : - Trong hộp thoại Table Structure, nhấn chuột vào nút Add Index. Hộp thoại Add Index xuất hiện. Hình 5.6. Hộp thoại Add Index to - Gõ IDindex trong hộp văn bản Name - Nhấn đúp chuột vào trƣờng ID trong danh sách các trƣờng có sẵn. ID đƣợc thêm vào danh sách các trƣờng có chỉ mục. Hộp đánh dấu Primary và Unique phải đƣợc chọn theo mặc định. - Nhấn OK, giờ đây ta có thể tạo thêm chỉ mục cho trƣờng Name. - Gõ tên chỉ mục Nameindex trong hộp văn bản Name - Nhấn đúp chuột trên trƣờng Name trong danh sách các trƣờng hiện có, Name đƣợc thêm vào trong danh sách các trƣờng có chỉ mục. - Bỏ chọn các hộp đánh dấu Primary và Unique, sau đó nhấn nút OK. - Nhấn nút chuột Close. Ta sẽ gặp lại hộp hội thoại Table Structure. Bƣớc 5. Tạo bảng, nhấn nút Build the Table. Bảng sẽ đƣợc tạo và thêm vào cửa sổ Database của VisData. 5.2.3. Tạo form dữ liệu tự động Để tạo form dữ liệu (frmStudent) tự động, ta sử dụng công cụ Data Form Designer của VisData. Ta thực hiện các bƣớc sau: Bƣớc 1. Từ cửa sổ VisData, chọn lệnh đơn Utility/Data Form Designer 134
  33. Hình 5.7. Mục chọn Data Form Designer tạo Form tự động xuất hiện cửa sổ Data Form Designer. Bƣớc 2. Từ cửa sổ Data Form Designer, nhập tên Student trong mục Form Name, chọn bảng Student trong mục RecordSource. Danh sách trƣờng trong bảng Student xuất hiện trong mục Available Fields. Hình 5.8. Hộp thoại Data Form Designer Bƣớc 3. Chọn các trƣờng sẽ thể hiện trên form 135
  34. Bƣớc 4. Nhấn nút Build Form, ta thu form frmStudent nhƣ sau: Bƣớc 5. Chỉnh sửa form cho hợp lý 5.3. Các đối tƣợng truy cập dữ liệu Ta có thể sử dụng một điều khiển để truy cập dữ liệu trong cơ sở dữ liệu. Có một số điều khiển thƣờng đƣợc sử dụng nhƣ: TextBox, DBGrid, CheckBox, ComboBox, 5.3.1. Sử dụngTextBox Tại thuộc tính DataSource của TextBox ta chọn một điều khiển dữ liệu đã đặt lên Form ví dụ Data1. Tại thuộc tính DataField ta chọn tên trƣờng hiện có trong danh sách. Khi đó dữ liệu của trƣờng đƣợc chọn sẽ hiện ra trong hộp TextBox và nếu ta thay đổi nội dung của hộp TextBox thì nội dung của trƣờng cũng thay đổi theo. 136
  35. 5.3.2. Sử dụng DBGrid So với TextBox thì DBGrid thuận tiện hơn nhiều vì nó cho hiển thị nhiều trƣờng và nhiều bản ghi phụ thuộc vào số cột có thể chọn và số bản ghi của tệp dữ liệu. Điều khiển này cho phép ta hiển thị dữ liệu dƣới dạng bảng. Để hiển thị dữ liệu bằng một DBGrid ta thực hiện nhƣ sau: Chọn điều kiển DBGrid trong hộp công cụ và vẽ điều khiển này lên Form. Nếu điều khiển này chƣa có trong hộp công cụ thì ta bổ sung vào hộp công cụ bằng các cách sau: Vào thực đơn Project chọn Components. Sẽ xuất hiện hộp thoại cho phép ta bổ sung các điều khiển vào ToolBox. Trong hộp thoại Components ta chọn tab Control sau đó chọn “Microsoft Data Bound Grid Control 5.0 (SP3)”. Điều khiển này có mặt ngay trong hộp TextBox. Tại thuộc tính DataSource ta chọn tên một điều khiển dữ liệu đã có. Tại thuộc tính DataMode chọn Bound. Khi đó nếu nguồn dữ liệu của điều khiển dữ liệu mà thay đổi thì dữ liệu trong bảng cũng thay đổi theo. 5.3.3. Sử dụng các điều khiển khác CheckBox : Điều khiển cung cấp một điều kiện đúng / sai. Nó chủ yếu rằng buộc với trƣờng Boolean, hay Yes/ No trong một cơ sở dữ liệu. DBCombo: Điều khiển cần dùng dữ liệu này hỗ trợ một danh sách xổ xuống tƣơng tự điều khiển hộp kết hợp chuẩn của Visual Basic, nhƣng nó có thể điền vào danh sách các dữ liệu lấy từ một bảng của cơ sở dữ liệu. DataGrid : Lƣới hiển thị dữ liệu của cơ sở dữ liệu theo dòng và cột. Phiên bản thƣơng phẩm của điều khiển này là điều khiển Apex True DB Grid. DateTimePicker : Điều khiển này có thể rằng buộc ngày hoặc giờ trong một cơ sở dữ liệu. Nó giúp ngƣời sử dụng chọn ngày, giờ một cách dễ dàng dƣới dạng đồ hoạ. DBList : Điều khiển hộp danh sách này tƣơng tự điều khiển hộp danh sách chuẩn (ListBox) của Visual Basic, nhƣng nó có thể điền dữ liệu vào danh sách từ một bảng cơ sở dữ liệu. Hierarchical FlexGrid : Điều khiển cho phép thao tác với nhiều bản ghi quan hệ trong một điều khiển lƣới. PictureBox : Điều khiển hiển thị hình ảnh lấy từ cơ sở dữ liệu. Label : Điều khiển này cho phép trình bày văn bản từ một trƣờng cơ sở dữ liệu, nhƣng không cho phép ngƣời sử dụng sửa đổi nó. MaskedEdit : Điều khiển này tƣơng tự một hộp văn bản, nhƣng cung cấp một chức năng kiểm tra nội tại cũng nhƣ một hiển thị mặc định gợi ý cho ngƣời sử dụng điều kiện nhập vào hộp văn bản. MSChart : Điều khiển ràng buộc biểu đồ trực tiếp với một điều khiển dữ liệu. 137
  36. MSFlexGrid : Điều khiển này cho ta trình bày dữ liệu dƣới dạng lƣới. Ta còn có thể sử dụng điều khiển để xử lý dữ liệu, gộp nhóm và sắp xếp. Phiên bản thƣơng phẩm của điều khiển này là VideoSoft VSLEX. 5.4. Truy xuất dữ liệu thông qua Data Control Để làm việc với CSDL ta có thể dùng điều khiển Data. Điều khiển này cho phép ta truy cập đến một CSDL bất kì trong Windows. Để có thể truy cập đến CSDL ta thực hiện nhƣ sau: Trong hộp công cụ ToolBox, ta chọn điều khiển Data và đặt nó lên Form. Xác định các thuộc tính cho điều khiển. Viết các lệnh để truy xuất dữ liệu. 5.4.1. Các thuộc tính Điều khiển Data có các thuộc tính sau: Name: Tên của điều khiển, nếu ta không đặt lại tên thì tên của nó là Data1, Data2 Connect: Thuộc tính này qui định môi trƣờng CSDL mà ta muốn truy cập, môi trƣờng ngầm định là Access. Ta có thê thay đổi thuộc tính này để kết nối đến các CSDL khác nhƣ Foxpro, Excel, Dbase v.v DataBase: Tên CSDL mà ta muốn truy cập. Muốn làm việc với CSDL nào đó ta phải gán tên cùng đƣờng dẫn của nó cho thuộc tính này. Các CSDL ngầm định là đƣợc tạo bởi Access. Các CSDL trong Access có đuôi là *.mdb. Ví dụ ta chọn QTKD.mdb. Để gán cho điều khiển một CSDL nào đó khi thiết kế thì tại thuộc tính này ta kích nút Build và chọn CSDL trong một thƣ mục nào đó. Nếu khi thi hành đề án mà ta muốn thay đổi CSDL thì ta có thể dùng lệnh sau: Data1.DataBase = TenCSDL Trong đó TenCSDL là một chuỗi kí tự chứa đƣờng dẫn và tên của CSDL cần mở. Ví dụ: Data1.DataBase = “D:\DH SPKT ND\QTKD.mdb” RecordSource: Sau khi chọn CSDL ta phải chọn một bảng cụ thể trong CSDL. Mỗi CSDL có tập hợp các bảng khác nhau. Ta chỉ việc mở thuộc tính này và chọn một bảng nào đó. Nếu không muốn chọn ta có thể bỏ trống thuộc tính này và viết câu lệnh sau: Data1.RecordSource = TableName Trong đó Data1 là tên của điều khiển, còn TableName là tên của một bảng nào đó trong CSDL. Ngoài ra ta có thể gán cho thuộc tính này một biểu thức là một câu lệnh SQL. 138
  37. RecordSetType: Xác định kiểu tệp dữ liệu của điều khiển dữ liệu. Thuộc tính này có thể nhận một trong 3 giá trị sau: Table, Dynaset, SnapShot. Nếu ta chọn thuộc tính này là Table thì ta có thể thao tác với một bảng của CSDL. Nếu ta chọn Dynaset thì ta có thể thao tác với một Query thành lập từ nhiều bảng của CSDL và có thể thay đổi tập dữ liệu (RecordSet). Còn nếu ta chọn SnapShot thì ta có thể làm việc với tệp các bảng dữ liệu tĩnh mà không thay đổi đƣợc chúng. Giá trị ngầm định của thuộc tính này là Dynaset. ReadOnly: Thuộc tính này có 2 giá trị là True và False (ngầm định). Nếu chọn True thì ta không thể cập nhật đƣợc dữ liệu của RecordSet. Visible: Thuộc tính này cho phép (True) hay không cho phép (False) hiện ra điều khiển dữ liệu. Nếu ta không muốn điều khiển dữ liệu hiện ra khi thi hành thì ta gán thuộc tính này là False. Exclusive: Thuộc tính này dùng để cho phép (False) hay không cho phép (True) nhiều ngƣời dùng CSDL hiện tại. 5.4.2. Cách sử dụng điều khiển Data a) Thao tác với CSDL Khi thay đổi một CSDL (thay DataBaseName, thay Connect) hoặc thay một bảng mới (thay đổi tính chất của RecordSource) hoặc thay đổi tính chất của ReadOnly, Exclusive thì ta phải kích hoạt phƣơng pháp Refresh của điều khiển dữ liệu nhƣ sau: Data1.Refresh Sự thay đổi trong CSDL của điều khiển dữ liệu đƣợc thực hiện bằng lệnh trong thời gian thực hiện project. Sự thay đổi đƣợc thực hiện bằng cách gán các thuộc tính DataBaseName, Connect, RecordSetType, RecordSource của Data Control bằng một giá trị mới. Mỗi khi có sự thay đổi nhƣ thế thì phải Refresh( ) lại điều khiển dữ liệu. b) Đối tƣợng RecordSet Tập hợp các dữ liệu đƣợc chọn thông qua thuộc tính RecordSource đƣợc gọi là RercodSet của điều khiển dữ liệu. Hay nói cách khác RecordSet là tập dữ liệu đã chọn của điều khiển dữ liệu. Dù thuộc tính RecordSource có thay đổi nhƣ thế nào thì tập dữ liệu của điều khiển dữ liệu vẫn là RecordSet. Đây là một đối tƣợng quan trọng nhất của điều khiển dữ liệu. Điều khiển CSDL chính là thực hiện thao tác trên RecordSet. Để điều khiển RecordSet ta sử dụng các phƣơng pháp và thuộc tính của nó. Sau đây ta xét một số phƣơng thức và thuộc tính của nó: Thuộc tính BOF và EOF 139
  38. Các thuộc tính EOF và BOF của RecordSet cho ta biết trạng thái cuối hay đầu của RecordSet. Nếu con trỏ đang ở cuối File thì giá trị RecordSet.EOF = True. Còn nếu con trỏ đang ở đầu RecordSet thì giá trị RecordSet.BOF = True. Ví dụ: If not Data1.RecordSet.BOF Then Data1.RecordSet.MovePrevious hoặc If not Data1.RecordSet.EOF Then Data1.RecordSet.MoveNext Các phƣơng thức di chuyển trong CSDL Muốn di chuyển trong CSDL ta sử dụng các phƣơng pháp sau: MoveFirst: Chuyển đến đầu RecordSet MoveLast: Chuyển đến cuối RecordSet MovePrevious: chuyển đến bản ghi trƣớc RecordSet MoveNext: Chuyển đến bản ghi sau RecordSet Đối tƣợng Fields RecordSet có các đối tƣợng con khác nhau trong đó có một đối tƣợng quan trọng và hay đƣợc dùng đó là đối tƣợng Fields. Đối tƣợng này của RecordSet cho phép ta truy cập đến từng trƣờng của bảng dữ liệu. Để trỏ tới trƣờng thứ i nào đó ta viết Fields(i). Số hiệu của các trƣờng bắt đầu từ 0 đến n-1, trong đó n là số lƣợng các trƣờng. Ngoài ra ta có thể thay đổi số hiệu trƣờng bằng tên trƣờng. Ví dụ trƣờng số 1 có tên là Makh thì 2 lệnh sau là tƣơng đƣơng. Print Data1.RecordSet.Fields(1) Print Data1.RecordSet.Fields(“Makh”) Cả 2 lệnh này đều cho ta nội dung trƣờng “Makh” của bản ghi hiện thời Thuộc tính RecordCount Số lƣợng các bản ghi trong một bảng đƣợc lƣu trữ trong thuộc tính RecordCount. Số hiệu các bản ghi đƣợc bắt đầu từ 0 đến RecordCount – 1 Sửa và bổ sung dữ liệu Để thêm mới, bổ sung, sửa chữa các bản ghi của CSDL ta dùng các phƣơng thức sau: AddNew: Thêm bản ghi mới vào cuối bảng. Khi thực hiện phƣơng pháp này thì ta sẽ có một bản ghi trống và ta có thể bổ sung dữ liệu cho bản ghi này. Edit: Cho phép sửa bản ghi hiện hành. Sau phƣơng pháp này ta có thể thay đổi nội dung của bản ghi hiện tại. Update: Cập nhật bản ghi vừa đƣợc tạo hoặc sửa chữa. Delete: Xoá bản ghi hiện hành. Sau khi xoá bản ghi ta phải di chuyển đến bản ghi khác bằng các phƣơng pháp di chuyển đã nêu ở trên. Close: Dùng để đóng một bảng. 140
  39. 5.4.3. Ví dụ minh hoạ Tạo cơ sở dữ liệu qltv.mdb gồm 3 bảng: Sach(Mas, Tens, Tacgia, Nhaxb, Namxb) Docgia(Madg, Tendg, Diachi, Dienthoai) Muontra(Madg, Mas, Ngaym, Ngayht, Ngayt) sử dụng Visual Data Manager. Sau đó, lập một chƣơng trình gồm 3 form: Sách- thao tác trên bảng Sach, Độc giả- thao tác trên bảng Docgia, Mƣợn trả- thao tác trên bảng Muontra theo mẫu: Yêu cầu: Form Sách tạo bằng công cụ tạo form tự động 141
  40. Form Độc giả sử dụng công cụ Data ở mức độ đơn giản Form Mƣợn trả lập trình sử dụng các thuộc tính, phƣơng thức của điều khiển Data, đối tƣợng Recordset, đối tƣợng Fields Giải: Bƣớc 1.Tạo cơ sở dữ liệu qltv.mdb sử dụng Visual Data Manager (VisData) Bƣớc 2. Tạo các bảng: Sach, Docgia, Muontra, trong đó: Mas là khoá chính của bảng Sach, Madg là khoá chính của bảng Docgia, Mas và Madg là khoá ngoại của bảng Muontra. Khi tạo xong cơ sở dữ liệu qltv.mdb, ta thu đƣợc kết quả sau trong cửa sổ VisData. Bƣớc 3. Tạo form Sach sử dụng công cụ Data Form Designer - Từ cửa sổ VisData chọn Utility/Data Form Designer - Trên cửa sổ Data Form Designer, nhập tên form trong mục Form name, chọn bảng sach trong mục RecordSource, đƣa tất cả các trƣờng trong bảng Sach trong mục Available Fields sang mục Included Fields, nhƣ hình sau: - Nhấn nút Build Form, sau đó nhấn Close ta thu đƣợc form sau 142
  41. - Gán lại giá trị thuộc tính Caption của form frmSach và các label, ta thu đƣợc form sau: Bƣớc 4. Tạo form Độc giả và lập trình sự kiện cho các nút lệnh Từ menu hệ thống chọn Project/Add Form/Open để bổ sung một form mới vào project hiện hành, sau đó bổ sung vào form các điều khiển và gán cho một số điều khiển các giá trị theo bảng sau: Ghi TT Điều khiển Thuộc tính Giá trị chú Name frmDocgia 1 Form Caption Độc giả Name cmdfirst 2 CommandButton Caption Về đầu Name cmdpre 3 CommandButton Caption Về trƣớc Name cmdadd 4 CommandButton Caption Thêm Name cmdedit 5 CommandButton Caption Sửa Name cmddel 6 CommandButton Caption Xóa Name cmdnext 7 CommandButton Caption Về sau 143
  42. Name cmdlast 8 CommandButton Caption Về cuối 9 Label Caption Mã độc giả 10 Label Caption Họ và tên 11 Label Caption Địa chỉ 12 Label Caption Điện thoại Databasename D:\Bai tap VB\ QLTV\qltv.mdb 13 Data Name DataDocgia RecordSource Docgia Visible False Name txtmadg 14 TextBox DataSource DataDocgia DataField Madg Name Txttendg 15 TextBox DataSource DataDocgia DataField Tendg Name txtDiachi 16 TextBox DataSource DataDocgia DataField Diachi Name txtDienthoai 17 TextBox DataSource DataDocgia DataField Dienthoai Sau khi thiết lập giá trị cho các thuộc tính ta thu đƣợc form kết quả nhƣ sau: Lập trình sự kiện cho các nút lệnh: Mở cửa sổ Code của form frmDocgia và gõ vào các dòng lệnh sau: 144
  43. Private Sub cmdAdd_Click() If cmdadd.Caption = "Thêm" Then datadocgia.Recordset.AddNew cmdadd.Caption = "Lưu" txtmadg.SetFocus Else datadocgia.UpdateRecord datadocgia.Recordset.Bookmark = datadocgia.Recordset.LastModified cmdadd.Caption = "Thêm" End If End Sub „ Private Sub cmddel_Click() Dim traloi As Byte traloi = MsgBox("Bạn muốn xoá bản ghi này", vbYesNo + vbQuestion, "Xoá dữ liệu") If traloi = 6 Then If cmddel.Caption = "Xoá" Then datadocgia.Recordset.Delete cmddel.Caption = "Lưu" Else datadocgia.UpdateRecord cmddel.Caption = "Xoá" cmdnext_Click End If End If End Sub „ Private Sub cmdedit_Click() If cmdedit.Caption = "Sửa" Then datadocgia.Recordset.Edit cmdedit.Caption = "Lưu" txtmadg.SetFocus Else datadocgia.UpdateRecord datadocgia.Recordset.Bookmark = datadocgia.Recordset.LastModified cmdedit.Caption = "Sửa" 145
  44. End If End Sub „ Private Sub cmdfirst_Click() If datadocgia.Recordset.RecordCount > 0 Then datadocgia.Recordset.MoveFirst End If End Sub „ Private Sub cmdlast_Click() If datadocgia.Recordset.RecordCount > 0 Then datadocgia.Recordset.MoveLast End If End Sub „ Private Sub cmdnext_Click() If datadocgia.Recordset.RecordCount > 0 Then If datadocgia.Recordset.EOF = False Then datadocgia.Recordset.MoveNext End If End If End Sub „ Private Sub cmdpre_Click() If datadocgia.Recordset.RecordCount > 0 Then If datadocgia.Recordset.BOF = False Then datadocgia.Recordset.MovePrevious End If End If End Sub Bƣớc 5. Tạo form Mƣợn trả và lập trình sự kiện cho các nút lệnh Từ menu hệ thống chọn Project/Add Form/Open để bổ sung một form mới vào project hiện hành, sau đó bổ sung vào form các điều khiển và gán cho một số điều khiển các giá trị theo bảng sau: TT Điều khiển Thuộc tính Giá trị Ghi chú Name frmMuontra 1 Form Caption Mƣợn trả 146
  45. Name cmdfirst 2 CommandButton Caption Về đầu Name cmdpre 3 CommandButton Caption Về trƣớc Name cmdadd 4 CommandButton Caption Thêm Name cmdedit 5 CommandButton Caption Sửa Name cmddel 6 CommandButton Caption Xóa Name cmdnext 7 CommandButton Caption Về sau Name cmdlast 8 CommandButton Caption Về cuối Name cmdfind 9 CommandButton Caption Tìm Name optMadg 10 OptionButton Caption Mã độc giả Name optMas 11 OptionButton Caption Mã sách 12 Label Caption Mã độc giả 13 Label Caption Mã sách 14 Label Caption Ngày mƣợn 15 Label Caption Ngày hẹn trả 16 Label Caption Ngày trả 17 Frame Caption Tìm kiếm theo Databasename D:\Bai tap VB\ QLTV\qltv.mdb 18 Data Name DataMuontra RecordSource Muontra Visible False Name txtmadg 19 TextBox DataSource DataMuontra DataField Madg 20 TextBox Name txtmas 147
  46. DataSource DataMuontra DataField Mas Name TxtNgaym 21 TextBox DataSource DataMuontra DataField Ngaym Name txtNgayht 22 TextBox DataSource DataMuontra DataField Ngayht Name txtNgayt 23 TextBox DataSource DataMuontra DataField Ngayt Sau khi thiết lập giá trị cho các thuộc tính ta thu đƣợc form kết quả nhƣ sau: Private Sub cmdAdd_Click() If cmdadd.Caption = "Thêm" Then datamuontra.Recordset.AddNew cmdadd.Caption = "Lưu" txtmadg.SetFocus Else datamuontra.UpdateRecord datamuontra.Recordset.Bookmark = datamuontra.Recordset.LastModified cmdadd.Caption = "Thêm" End If End Sub „ Private Sub cmddel_Click() Dim traloi As Byte 148
  47. traloi = MsgBox("Ban muon xoa ban ghi nay khong", vbYesNo + vbQuestion, "Xoá dữ liệu") If traloi = 6 Then If cmddel.Caption = "Xoá" Then datamuontra.Recordset.Delete cmddel.Caption = "Lưu" Else datamuontra.UpdateRecord cmddel.Caption = "Xoá" cmdnext_Click End If End If End Sub „ Private Sub cmdedit_Click() If cmdedit.Caption = "Sửa" Then datamuontra.Recordset.Edit cmdedit.Caption = "Lưu" txtmadg.SetFocus Else datamuontra.UpdateRecord datamuontra.Recordset.Bookmark = datamuontra.Recordset.LastModified cmdedit.Caption = "Sửa" End If End Sub „ Private Sub cmdfind_Click() If optmas.Value = True Then Dim masach As String * 3 masach = InputBox("Nhập mã sách cần tìm") datamuontra.Recordset.FindFirst "mas = '" & masach & "'" If datamuontra.Recordset.NoMatch = True Then MsgBox "Không tìm thấy", , "Kết quả tìm kiếm" End If Else Dim madocgia As String * 3 madocgia = InputBox("Nhập mã độc giả cần tìm") 149
  48. datamuontra.Recordset.FindFirst "madg = '" & madocgia & "'" If datamuontra.Recordset.NoMatch = True Then MsgBox "Không tìm thấy", , "Kết quả tìm kiếm" End If End If End Sub „ Private Sub cmdfirst_Click() If datamuontra.Recordset.RecordCount > 0 Then datamuontra.Recordset.MoveFirst End If End Sub „ Private Sub cmdlast_Click() If datamuontra.Recordset.RecordCount > 0 Then datamuontra.Recordset.MoveLast End If End Sub „ Private Sub cmdnext_Click() If datamuontra.Recordset.RecordCount > 0 Then If datamuontra.Recordset.EOF = False Then datamuontra.Recordset.MoveNext End If End If End Sub „ Private Sub cmdpre_Click() If datamuontra.Recordset.RecordCount > 0 Then If datamuontra.Recordset.BOF = False Then datamuontra.Recordset.MovePrevious End If End If End Sub 5.5. Truy xuất dữ liệu thông qua DAO Ta có thể dùng DAO ( đối tượng truy vấn cơ sở dữ liệu –Data Access Object) để thao tác với cơ sở dữ liệu thông qua lập trình với Visual Basic. Với DAO, ta có 150
  49. thể thi hành các câu truy vấn, cập nhật giá trị trong các bảng cơ sở dữ liệu và tạo cấu trúc cơ sở dữ liệu bao gồm các bảng , các câu truy vấn chứa sẵn và mối quan hệ giữa các bảng. DAO đƣợc các nhà lập trình Visual Basic sử dụng để truy cập các cơ sở dữ liệu trên máy tính cá nhân hay Client / Server. Nhƣng với sự ra đời của ADO, giờ đây nó chỉ thích hợp để dùng cơ sở dữ liệu Jet mà thôi. Còn đối với việc phát triển các hệ Client / Server mới, chủ yếu ta tận dụng thế mạnh của ADO. 5.5.1. Tham chiếu đến thư viện đối tượng của DAO DAO cung cấp nhiều đối tƣợng cho phép ứng dụng truy cập dữ liệu trên cơ sở dữ liệu. Để dùng các đối tƣợng đƣợc cung cấp bởi DAO, ta thực hiện các thao tác sau: Từ menu Project, chọn References. Hộp thoại References xuất hiện. Từ danh sách các thƣ viện, chọn và tích vào “Microsoft DAO 3.5.1 Object Library”. Nhấn OK. Giờ đây, ta có thể dùng đối tƣợng đƣợc cung cấp bởi thƣ viện đối tƣợng DAO. Mô hình cây phân cấp của đối tƣợng DAO: DBEngine DBEngine Workspace Database TableDef QueryDef Recordset Container Relation Field Field Field Field Index Parameter Document Field object only object only User Object and Collection Group Group User Error Hình 5.9. Mô hình cây phân cấp của đối tƣợng DAO 151
  50. Giả sử cho cơ sở dữ liệu Education.mdb trong đó có bảng Student có cấu trúc nhƣ sau: TT Tên trƣờng Kiểu dữ liệu Độ rộng Ghi chú 1 ID Text 5 Mã sinh viên (khoá chính-IDindex) 2 Name Text 30 Họ tên (Nameindex) 3 Age Byte 1 Tuổi 4 Sex Boolean 1 Giới tính 5 Add Text 30 Địa chỉ Yêu cầu: Lập một chƣơng trình, trong đó có form Student cho phép ngƣời sử dụng thực hiện các thao tác: duyệt danh sách sinh viên, bổ sung, sửa, xoá, tìm kiểm thông tin về sinh viên đƣợc lƣu trữ trong bảng Student. Form Student có dạng: TT Điều khiển Thuộc tính Giá trị Ghi chú Name frmStudent 1 Form Caption Student Name lblID 2 Label Caption ID 3 Label Name lblName Caption Name Name lblAge 4 Label Caption Age Name lblSex 5 Label Caption Sex Name lblAdd 6 Label Caption Add 7 Textbox Name txtID 152
  51. 8 Textbox Name txtName 9 Textbox Name txtAge 10 Textbox Name txtAdd Name cmdFirst Chuyển về bản ghi đầu 11 CommandButton Caption &First tiên Name cmdPrevious Chuyển về bản ghi tiếp 12 CommandButton Caption &Previous theo Name cmdAdd 13 CommandButton Bổ sung một bản ghi Caption &Add Name cmdEdit Sửa nội dung bản ghi 14 CommandButton Caption &Edit hiện hành Name cmdDelete 15 CommandButton Xoá bản ghi hiện hành Caption &Delete Name cmdSearch 16 CommandButton Tìm kiếm bản ghi Caption &Search Name cmdNext Chuyển về bản ghi tiếp 17 CommandButton Caption &Next theo Name cmdLast Chuyển về bản ghi cuối 18 CommandButton Caption &Last cùng Name optMale 19 OptionButton Caption Male Name optFemale 20 OptionButton Caption Female Name optID 21 OptionButton Caption ID Name optName 22 OptionButton Caption Name Name fraSearchfor 23 Frame Caption Search for 5.5.2. Đối tượng Workspace Đối tƣợng Workspace cung cấp phƣơng thức OpenDatabase dùng để mở cơ sở dữ liệu. Phƣơng thức này trả về một đối tƣợng Database. Cú pháp: OpenDatabase(dbName, [options], [readonly],[connect]) Tham số Mô tả dbName Tên cơ sở dữ liệu cần mở (đây là tham số bắt buộc) 153
  52. Options Nếu tham số này là True, cơ sở dữ liệu mở trong chế độ loại trừ; không ai có thể mở cơ sở dữ liệu trong chế độ loại trừ. Nếu giá trị này là False, những ngƣời khác có thể mở cơ sở dữ liệu. Readonly Nếu tham số này là True, ta không thể sửa đổi cơ sở dữ liệu. Connect Là một xâu ký tự chỉ ra cách thức kết nối với cơ sở dữ liệu; chuỗi thƣờng chỉ đƣợc dùng cho những nguồn dữ liệu Client / Server và ODBC. Ví dụ: Để mở cơ sở dữ liệu Education.mdb ta viết nhƣ sau: Dim db As Database Set db = OpenDatabase(" \ \Education.mdb") 5.5.3. Đối tượng Database Đối tƣợng Database là nơi để ứng dụng bắt đầu phần lớn các truy cập cơ sở dữ liệu của nó. Sử dụng phƣơng thức Execute của đối tƣợng Database để thi hành một câu lệnh SQL trên SQL cho phép: cập nhật, xoá hay sao chép bản ghi, sửa cấu trúc dữ liệu. 5.5.4 Đối tượng Recordset Đối tƣợng Recordset dùng để thao tác với các bản ghi trong DAO. a) Các thuộc tính EOF(end of file): nhận giá trị True khi ta di chuyển quá bản ghi cuối cùng của Recordset. BOF(begin of file): nhận giá trị True khi ta di chuyển đến một vị trí trƣớc bản ghi thứ nhất trong Recordset. Nếu cả EOF và BOF đều nhận giá trị True có nghĩa là Recordset không chứa bản ghi nào. BOF MÈu tin 1 MÈu tin 2 EOF RecordCount: Dùng để xác định số bản ghi trong một Recordset. Giá trị của RecordCount sẽ không hợp lệ nếu ta chƣa chuyển đến bản ghi cuối cùng trong Recordset. 154
  53. Fields: Là một thuộc tính kiểu Collection, dùng để truy cập vào các trƣờng trong một bản ghi b) Các phƣơng thức Tạo đối tƣợng Recordset Để tạo một đối tƣợng Recordset ta sử dụng phƣơng thức OpenRecordset của đối tƣợng Database. OpenRecordset là một hàm trả về một đối tƣợng Recordset. Cú pháp: OpenRecordset(Recordsource,Options) Tham số Options của phƣơng thức OpenRecordset xác định một số cách thức thao tác với bản ghi. Hằng Ý nghĩa dbOpentable Trong một workspace của Microsoft Jet, tạo một đối tƣợng Recordset kiểu bảng (bảng đƣợc đánh chỉ mục chỉ sử dụng một bảng) dbOpenDynamic Trong một workspace kiểu ODBCDirect, mở một đối tƣợng Recordset kiểu dynamic (cập nhật đƣợc dữ liệu khi ngƣời khác sửa đổi và truy vấn dữ liệu qua nhiều bảng) dbOpenDynaset Mở một đối tƣợng kiểu Dynaset (tham chiếu đến recordset của nhiều bảng hoăc từ nhiều cơ sở dữ liệu khác) dbOpenForwardonly Mở một đối tƣợng Recordset mà con trỏ của nó chỉ có thể di chuyển tới Ví dụ: Dim db As Database Dim rs As Recordset Set db = OpenDatabase(" \ \Education.mdb") Set rs = db.OpenRecordset("Student") Tham số bắt buộc duy nhất của phƣơng thức OpenRecordset là nguồn dữ liệu. Đây là chuỗi ký tự, theo nguyên tắc là tên của một bảng hoặc một định nghĩa truy vấn chứa sẵn. Nhƣng nó cũng có thể là một câu lệnh SELECT SQL. Ví dụ: Set rs = db.OpenRecordset("SELECT * FROM Student") Nếu trong một câu lệnh SQL có chứa thành phần dạng xâu ký tự, ta dùng cặp „ „ để biểu diễn xâu ký tự đó tránh bị nhầm sang cặp dấu “ “. Ví dụ: Ta có câu lệnh SQL: SELECT * FROM Student WHERE [ID]="IT003" 155
  54. Khi đƣa vào phƣơng thức OpenRecordset ta viết: Set rs = db.OpenRecordset("SELECT * FROM Student" & _ " WHERE [ID]='IT003'") Nếu thành phần của câu lệnh SQL đƣợc truyền vào từ biến, ví dụ từ một biến có tên SID thì ta viết: '" & SID &"'. Ví dụ: Set rs = db.OpenRecordset("SELECT * FROM Student" & _ " WHERE [SID]='" & SID &"'") Thêm một bản ghi mới AddNew: là phƣơng thức dùng để thêm một bản ghi mới, trắng vào cuối của recordset. Để bổ sung bản ghi mới vào trong đối tƣợng Recordset ta thực hiện 3 bƣớc sau: Bƣớc 1. Gọi phƣơng thức AddNew của RecordSet để thêm một bản ghi mới, trắng vào cuối của recordset. Bƣớc 2. Gán giá trị cho các trƣờng trong bản ghi mới bằng cách sử dụng câu lệnh gán mà ta thƣờng dùng với các trƣờng cơ sở dữ liệu. Bƣớc 3. Dùng phƣơng thức Update để ghi bản ghi mới vào cơ sở dữ liệu. Ví dụ: Thủ tục Input_Data và sự kiện Click của nút Add sau đây cho phép thêm một bản ghi mới vào bảng Student. Private Sub Input_Data()‟Thủ tục Input_Data để gán giá trị cho các trường rs.Fields("ID") = txtID.Text rs.Fields("Name") = txtName.Text rs.Fields("Age") = Val(txtAge.Text) If optMale.Value = True Then rs.Fields("Sex") = True Else rs.Fields("Sex") = False End If rs.Fields("Add") = txtAdd.Text End Sub „ Private Sub cmdAdd_Click() If cmdAdd.Caption = "&Add" Then txtID.Text = "" txtName.Text = "" txtAge.Text = "" txtAdd.Text = "" 156
  55. txtID.SetFocus rs.AddNew cmdAdd.Caption = "&Save" Else Call Input_Data rs.Update cmdAdd.Caption = "&Add" End If End Sub Duyệt qua các bản ghi MoveFirst : là phƣơng thức cho phép di chuyển đến bản ghi đầu tiên trong recordset. MoveNext : là phƣơng thức cho phép di chuyển đến bản ghikế tiếp trong recordset. MovePrevious : là phƣơng thức cho phép di chuyển về bản ghi trƣớc đó trong recordset. MoveLast: là phƣơng thức cho phép di chuyển đến bản ghi cuối cùng trong recordset. Move : là phƣơng thức cho phép di chuyển đến bản ghi đã đƣợc chỉ định trƣớc. Ví dụ: Sự kiện Click của các nút lệnh: First, Previous, Next, Last cho phép duyệt các bản ghi trong bảng Student. Private Sub cmdFirst_Click() If rs.RecordCount > 0 Then rs.MoveFirst Call Output_Data End If End Sub „ Private Sub cmdLast_Click() If rs.RecordCount > 0 Then rs.MoveLast Call Output_Data End If End Sub „ Private Sub cmdNext_Click() 157
  56. If rs.RecordCount > 0 And rs.EOF = False Then rs.MoveNext If rs.EOF = False Then Call Output_Data End If End Sub „ Private Sub cmdPrevious_Click() If rs.RecordCount > 0 And rs.BOF = False Then rs.MovePrevious If rs.BOF = False Then Call Output_Data End If End Sub Sửa nội dung bản ghi Ta có thể sửa nội dung bản ghi hiện hành trong một đối tƣợng Recordset bằng cách dùng phƣơng thức Edit và Update của Recordset. Muốn sửa đổi giá trị của một trƣờng trong một Recordset, theo các bƣớc sau : Bƣớc 1. Dùng các phƣơng thức duyệt của đối tƣợng Recordset để di chuyển đến bản ghi cần sửa đổi. Bƣớc 2. Thi hành phƣơng thức Edit của Recordset. Bƣớc 3. Dùng thuộc tính Fields của đối tƣợng Recordset để gán giá trị cho trƣờng trong bản ghi. Bƣớc 4. Lƣu bản ghi vào cơ sở dữ liệu bằng cách dùng phƣơng thức Update của Recordset. Ví dụ: Sự kiện Click của nút Edit sau cho phép sửa đổi nội dung bản ghi hiện hành trong bảng Student. Private Sub cmdEdit_Click() If cmdEdit.Caption = "&Edit" Then txtID.SetFocus rs.Edit cmdEdit.Caption = "&Save" Else Call Input_Data rs.Update cmdEdit.Caption = "&Edit" End If End Sub Tìm kiếm bản ghi 158
  57. Để tìm một bản ghi trong một Recordset, ta dùng một trong bốn phƣơng thức tìm kiếm của đối tƣợng Recordset: FindFirst FindLast FindNext FindPrevious Cú pháp của bốn phƣơng thức nhƣ nhau - để sử dụng một trong bốn phƣơng thức tìm kiếm này, ta truyền một mệnh đề WHERE của SQL vào phƣơng thức chỉ ra thông tin ta cần tìm kiếm. Sau khi thi hành phƣơng thức, bản ghi hiện hành trong đối tƣợng Recordset trở thành bản ghi thoả mãn tiêu chí WHERE. Nếu tìm kiếm không định vị đƣợc bản ghi yêu cầu, thuộc tính NoMatch của đối tƣợng Recordset có giá trị là True. Loại phƣơng thức ta dùng cũng xác định cách thức tìm thấy bản ghi. Ví dụ, nếu dùng FindFirst , bộ máy cơ sở dữ liệu sẽ di chuyển đến bản ghi thứ nhất trong recordset thoả tiêu chí. FindNext và FindPrevious, ngƣợc lại, tìm các bản ghi hiện hành. Điểm quan trọng cần lƣu ý là, khác với một câu truy vấn SELECT của SQL, tìm kiếm không sinh ra một recordset. Khi bộ máy cơ sở dữ liệu tìm ra bản ghi thoả tiêu chí tìm kiếm, nó di chuyển đến bản ghi đó; bản ghi trở thành bản ghi hiện hành. Nếu không có bản ghi tìm thấy, bản ghi hiện hành sẽ đƣợc giữ nguyên và thuộc tính NoMatch của đối tƣợng Recordset có giá trị là True. Ví dụ: Để tìm kiếm thông tin về sinh viên có mã sinh viên (SID) hoặc họ tên sinh viên (SName) đƣợc nhập từ bàn phím, ta có thể tìm kiếm tuần tự sử dụng phƣơng thức FindFirst nhƣ trong sự kiện Click của nút Search sau: Private Sub cmdSearch_Click() n = rs.Bookmark If optID.Value = True Then Dim SID As String * 5 SID = InputBox("Enter the Student ID") rs.FindFirst "ID = '" & SID & "'" If rs.NoMatch = True Then MsgBox "Not found", vbOKOnly + vbExclamation, "Search result" rs.Bookmark = n Else Call Output_Data End If Else Dim SName As String * 30 159
  58. SName = InputBox("Enter the Student Name") rs.FindFirst "Name = '" & SName & "'" If rs.NoMatch = True Then MsgBox "Not found", vbOKOnly + vbExclamation, "Search result" rs.Bookmark = n Else Call Output_Data End If End If End Sub Chú ý: Chỉ có thể sử dụng phƣơng thức tìm kiếm tuần tự khi đối tƣợng Recordset đƣợc tạo bởi câu lệnh SQL. Nếu đối tƣợng Recordset đƣợc tạo dạng bảng thì chỉ có thể tìm kiếm theo chỉ mục bằng phƣơng thức Seek. Tìm kiếm bản ghi theo chỉ mục Để tiến hành một tìm kiếm trên một chỉ mục, trƣớc hết bảng phải có một chỉ mục. Sau đó ta dùng phƣơng thức Seek của đối tƣợng Recordset. Cú pháp: Seek Toán_tử, Biểu_thức Ví dụ: Để tìm kiếm thông tin về sinh viên có mã sinh viên (SID) hoặc họ tên sinh viên (SName) đƣợc nhập từ bàn phím, ta có thể tìm kiếm theo chỉ mục sử dụng phƣơng thức Seek nhƣ trong sự kiện Click của nút Search nhƣ sau: Private Sub cmdSearch_Click() n = rs.Bookmark If optID.Value = True Then Dim SID As String * 5 SID = InputBox("Enter the Student ID") rs.Index = "IDindex" rs.Seek "=", SID If rs.NoMatch = True Then MsgBox "Not found", vbOKOnly + vbExclamation, "Search result" rs.Bookmark = n Else Call Output_Data End If Else Dim SName As String * 30 SName = InputBox("Enter the Student Name") rs.Index = "Nameindex" 160
  59. rs.Seek "=", SName If rs.NoMatch = True Then MsgBox "Not found", vbOKOnly + vbExclamation, "Search result" rs.Bookmark = n Else Call Output_Data End If End If End Sub Điểm hạn chế của phƣơng thức Seek là khả năng tìm kiếm trên một trƣờng duy nhất và nó phải đƣợc đánh chỉ mục. Ngoài ra nó chỉ sử dụng các toán tử sau : >; =; 0 Then If rs.EOF = False Then rs.MoveNext Else rs.MoveFirst End If Call Output_Data End If End Sub 161
  60. Đóng Recordset Ta thực hiện điều này khi chƣơng trình hoàn tất sử dụng đối tƣợng Recordset, sử dụng phƣơng thức Close. Ví dụ: rs.Close „rs là một Recordset Điểm đặc biệt quan trọng khi đóng một đối tƣợng Recordset là nếu đối tƣợng đặt một khoá (lock) trên bảng. Đóng một Recordset sẽ nhả khoá ứng dụng thiết lập trên đối tƣợng cơ sở dữ liệu, cho phép ngƣời sử dụng khác truy cập đến nó. Trong đối tƣợng khác trong DAO nhƣ: Workspace, Connection, Database và QueryDef cũng có phƣơng thức Close. 5.5.4. Đối tượng Field Đối tƣợng Field thể hiện một trƣờng trong một cấu trúc dữ liệu. Các đối tƣợng TableDef, Recordset, Relation và Index đều chứa các tập hợp trƣờng. Ta có thể lấy giá trị của một trƣờng bằng cách kiểm tra giá trị của thuộc tính Value của một đối tƣợng Field. (Bởi vì thuộc tính Value là thuộc tính mặc định của đối tƣợng Field, ta chỉ cần tham chiếu đến đối tƣợng Field; ta không nhất thiết phải tham chiếu tƣờng minh đến thuộc tính Value). 5.6. Truy xuất dữ liệu thông qua ADO ADO (ActiveX Data Objects) là công nghệ truy cập cơ sở dữ liệu hƣớng đối tƣợng tƣơng tự nhƣ DAO. Hiện nay, ADO đƣợc Microsoft xem kỹ thuật chính để truy cập dữ liệu từ Web Server. ADO sử dụng OLEDB nhƣ là trình cung cấp dữ liệu cơ sở. Trình cung cấp OLE DB cho phép ngƣời lập trình có thể truy xuất dữ liệu từ cả hai nguồn: quan hệ và phi quan hệ. VB6.0 đã hỗ trợ các trình cung cấp cục bộ cho SQL Server, Oracle và Microsoft Jet/Access. 5.6.1. Tham chiếu đến ADO Để có thể sử dụng kỹ thuật ADO kết nối đến CSDL chúng ta phải tham chiếu đến đối tƣợng này vì ADO không phải là điều khiển có sẵn trong hộp công cụ. Chúng ta thực hiện đƣa ADO vào hộp công cụ nhƣ sau: Bƣớc 1. Từ menu Project, chọn mục Components, hoặc chúng ta có thể chọn bằng cách kích chuột phải vào hộp công cụ, sau đó chọn mục Components: 162
  61. Hình 5.10. Đƣa them điều khiển vào hộp công cụ Bƣớc 2. Tích chọn “Microsoft ADO Data Control 6.0 (OLEDB)” trong một danh sách điều khiển. Bƣớc 3. Nhấn nút Apply, và đóng cửa sổ lại. Lúc này trên hộp công cụ xuất hiện biểu tƣợng . Điều khiển ADO đã đƣợc đƣa vào hộp công cụ. 5.6.2. Mô hình đối tượng của ADO Connection Command Errors Properties Parameters Properties Recordset Fields Properties Properties Hình 5.11. Mô hình đối tƣợng của ADO Mô hình ADO có 3 đối tƣợng cốt lõi: Connection: kết nối CSDL thật sự. Command: thực thi các câu truy vấn dựa vào kết nối dữ liệu. RecordSet: là tập các bản ghi đƣợc chọn từ câu truy vấn thông qua đối tƣợng Command. 5.6.3. Các đối tượng trong mô hình ADO a) Đối tƣợng Connection 163
  62. Đối tƣợng Connection cung cấp phƣơng thức Open dùng để thiết lập kết nối với nguồn dữ liệu. Để thực hiện điều này ta cần phải thông báo với ADO thông tin kết nối với dạng chuỗi theo kiểu chuỗi kết nối của ODBC. Thuộc tính ConnectionString thực hiện điều này. Ngoài ra ta còn có thể chọn trình cung cấp bằng cách quy định giá trị của thuộc tính Provider của đối tƣợng. Để nối kết với dữ liệu, ta cần xác định trình cung cấp OLE DB và chuỗi kết nối. Nếu không xác định đƣợc hai yếu tố này, ta sẽ sử dụng trình cung cấp mặc định là ODBC: MSDASQL. Một số trình cung cấp có sẵn: Microsoft OLEDB cho các trình điều khiển ODBC. Microsoft OLEDB cho Oracle. Microsoft Jet 3.51 OLEDB (Access). Microsoft Jet 4.0 OLEDB (Access) Microsoft OLEDB cho SQL Server. Microsoft OLEDB cho các dịch vụ thƣ mục. Ví dụ: Đối với trình cung cấp ODBC, thuộc tính ConnectionString có thể là một DSN. Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Provider = "MSDASQL" cn.ConnectionString = "DSN=Education" cn.Open hay là kết nối DSN cấp thấp: Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Provider = "MSDASQL" cn.ConnectionString = "DRIVER={SQL Server};” & _ “DATABASE=Baigiang;UID=myuser;PWD=mypassword;" cn.Open Trong trƣờng hợp này việc kết nối với cơ sở dữ liệu Server đƣợc thực hiện nhanh hơn vì chƣơng trình không cần đọc thông tin về các DSN trên máy Client, tuy nhiên thông tin về nguồn cơ sở dữ liệu lại kết chặt với chƣơng trình đã biên dịch. Để kết nối với cơ sở dữ liệu Access, ta dùng trình cung cấp Jet với chuỗi kết nối là đƣờng dẫn đến tập tin .mdb Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Provider = "MicroSoft.Jet.OLEDB.4.0" 164
  63. cn.ConnectionString = "D:\data\Education.mdb" cn.Open Đối với cơ sở dữ liệu SQL Server, ta có thể dùng trình cung cấp SQLOLEDB.1, trong trƣờng hợp này, chuỗi kết nối tƣơng tự nhƣ trƣờng hợp kết nối dùng trình cung cấp ODBC không có DSN, tuy nhiên ta không cần xác định giá trị của DRIVER: Dim cn as ADODB.Connection Set cn = New ADODB.Connection cn.Provider = “SQLOLEDB.1” cn.ConnectionString = “DATABASE=DBHH;” & _ “SERVER=www;UID=user;PWD=user” cn.Open Mở nối kết nguồn dữ liệu Để phát các yêu cầu đến nguồn dữ liệu sử dụng ADO, ta cần mở kết nối đến nguồn dữ liệu đó bằng phƣơng thức Open của đối tƣợng Connection. Cú pháp đầy đủ nhƣ sau: connection.Open [connect], [userid], [password] Tất cả các tham số của phƣơng thức Open đều là tùy chọn, nếu nhƣ các thông số này đã đƣợc xác định thông qua các thuộc tính khác của đối tƣợng Connection thì ta không cần mô tả chúng ở đây. Đóng nối kết nguồn dữ liệu Khi đã hoàn thành tất cả các thao tác liên quan đến nối kết này, ta cần phải đóng nối kết một cách tƣờng minh thông qua phƣơng thức Close của đối tƣợng Connection. connection.Close Đóng nối kết một cách tƣờng minh sẽ đảm bảo rằng tất cả các tài nguyên liên quan đến nối kết này trên Server cũng nhƣ Client đều đƣợc giải phóng một cách hợp lý. Xác định vị trí con trỏ Con trỏ (Cursor): một tập các bản ghi đƣợc trả về cho chƣơng trình. Vị trí con trỏ đƣợc xác định nhờ thuộc tính CursorLocation (có ở cả đối tƣợng Recordset). Có 2 giá trị có thể chỉ định: adUseClient: con trỏ phía Client. adUseServer: con trỏ phía Server (mặc định). Thực thi các câu truy vấn hành động Các câu truy vấn hành động (Insert, Update, Delete) đƣợc thực hiện nhờ phƣơng thức Execute của đối tƣợng Connection; ngoài ra phƣơng thức này cũng có thể đƣợc 165
  64. sử dụng để thực thi các thủ tục lƣu trữ sẵn trong cơ sở dữ liệu hay các câu SELECT. Cú pháp phƣơng thức này nhƣ sau: Nếu không có kết quả trả về: connection.Execute CommandText, RecordsAffected, Options Có kết quả trả về: Set recordset = connection.Execute (CommandText, RecordsAffected, Options) Trong đó: - connection: Đối tƣợng Connection. - recordset: Đối tƣợng Recordset là kết quả trả về của phƣơng thức Execute, tuy nhiên, ngƣời ta thƣờng ít khi sử dụng cách này. Thay vào đó, ngƣời ta thƣờng sử dụng phƣơng thức Open của đối tƣợng Recordset. - CommandText: là một chuỗi xác định câu truy vấn hành động, SELECT, thủ tục lƣu trữ sẵn hay tên một bảng trong cơ sở dữ liệu. - RecordEffected: Tùy chọn, là một số nguyên dài (Long) xác định trình cung cấp trả về bao nhiêu bản ghi thỏa điều kiện. - Options: Tùy chọn, là một số nguyên dài (Long) xác định trình cung cấp sẽ đánh giá các đối số của CommandText nhƣ thế nào. Thuộc tính Mode: Xác định trình cung cấp có thể hạn chế truy cập đến cơ sở dữ liệu khi có một recordset đang mở. Các giá trị có thể là: Hằng số Giá trị Ý nghĩa Mặc định, chỉ định quyền hạn chƣa adModeUnknown 0 thiết lập hay không thể xác định adModeRead 1 Mở Recordset với quyền chỉ đọc adModeWrite 2 Mở Recordset với quyền chỉ ghi adModeReadWrite 3 Mở Recordset với quyền đọc/ghi adModeShareDenyRead 4 Ngăn ngƣời khác mở kết nối với quyền chỉ đọc adModeShareDenyWrite 8 Ngăn ngƣời khác mở kết nối với quyền chỉ ghi adModeShareExclusive 12 Ngăn ngƣời khác mở kết nối Ngăn ngƣời khác mở kết nối với bất adModeShareDenyNone 16 cứ quyền nào b) Đối tƣợng Recordset Để có thể khởi tạo một đối tƣợng Recordset ta có thể thực hiện một trong hai cách: 166
  65. Cách 1. Dùng phƣơng thức Execute của đối tƣợng Connection. Tuy nhiên, cách này ta chỉ tạo đƣợc các Recordset chỉ đọc và chỉ có thể di chuyển tới. Cách 2. Xác lập các thông số thích hợp cho đối tƣợng Recordset rồi thực thi phuơng thức Open của đối tƣợng Recordset. Điều này đƣợc thực hiện nhờ các bƣớc: Bƣớc 1. Sau khi khởi tạo đối tƣợng Connection, chỉ định Recordset là của đối tƣợng Connection trên. Bƣớc 2. Thiết lập các thuộc tính thích hợp của Recordset (Source, LockType ). Bƣớc 3. Thực thi câu truy vấn nối kết nhờ phƣơng thức Open. Thuộc tính CursorType CursorType là thuộc tính dùng để xác định loại con trỏ đƣợc trả về từ cơ sở dữ liệu. Các giá trị có thể nhận: Hằng Giá trị Mô tả adOpenForwardOnly 0 Chỉ có thể di chuyển phía trƣớc Không thể thấy các bản ghi do ngƣời dùng khác thêm vào nhƣng adOpenKeyset 1 khi họ xóa hay sửa đổi bản ghi sẽ làm ảnh hƣởng đến các bản ghi ta đang làm việc. Có thể thấy toàn bộ sự thay đổi do adOpenDynamic 2 ngƣời dùng khác tác động. Bản sao tĩnh của tập mẩu tin. Mọi adOpenStatic 3 sự thay đổi của ngƣời dùng khác ta không thấy đƣợc Thuộc tính LockType Thuộc tính LockType xác định cách thức khóa bản ghi trong Recordset. Dùng thuộc tính này khi muốn kiểm soát cách thức cập nhật bản ghi với nhiều ngƣời dùng trong cơ sở dữ liệu. Hằng Giá trị Mô tả adLockReadOnly 1 Mặc định - Chỉ đọc. Khóa trang bi quan. Bản ghi trong RecordSet bị khóa khi bắt đầu sửa đổi adLockPessimistic 2 & tiếp tục khóa cho đến khi thi hành phƣơng thức Update hay di chuyển sang bản ghi khác. 167
  66. Khóa trang lạc quan. Bản ghi chỉ bị khóa ngay lúc thi hành phƣơng thức adLockOptimistic 3 Update hay di chuyển sang bản ghi khác. Khóa trang lạc quan hàng loạt. Hỗ trợ adLockBatchOptimistic 4 cập nhật nhiều bản ghi cùng một lúc. Thuộc tính Source Đây là một chuỗi xác định câu truy vấn để lấy dữ liệu, có thể là tên của bảng hay tên của thủ tục lƣu trữ sẵn. Thuộc tính ActiveConnection Đây là một thuộc tính đối tƣợng xác định Recordset là của nối kết nào trong chƣơng trình. Ví dụ: Đƣa vào form frmBook điều khiển lƣới DataGrid (Microsoft DataGrid Control 6.0), khai báo các đối tƣợng: Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Tiếp theo, đƣa các dòng lệnh sau vào sự kiện Form_Load Private Sub Form_Load() Set cn = New ADODB.Connection cn.Provider = "Microsoft.Jet.OLEDB.3.51" cn.ConnectionString = "d:\Bai tap VB\Library\Data\Library.mdb" cn.Open Set rs = New ADODB.Recordset rs.Source = "SELECT * FROM Book" Set rs.ActiveConnection = cn rs.CursorLocation = adUseClient rs.Open Set DataGrid1.DataSource = rs End Sub Kết quả thực thi chƣơng trình này nhƣ sau: 168
  67. Thêm bản ghi mới Mở Recordset Thi hành phƣơng thức AddNew Gán giá trị cho các trƣờng trong bản ghi của Recordset Lƣu lại bản ghi bằng cách thi hành phƣơng thức Update (hay UpdateBatch). Cập nhật bản ghi Mở Recordset Thực hiện câu lệnh truy vấn để nhận về các bản ghi thích hợp. Di chuyển đến bản ghi cần cập nhật lại giá trị. Gán lại giá trị cho các trƣờng. Thi hành phƣơng thức Update (hay UpdateBatch tùy thuộc vào LockType). Lƣu ý: Chế độ khóa bản ghi mặc định trong ADO là chỉ đọc, vì vậy ta phải đổi thuộc tính LockType của đối tƣợng Recordset sang chế độ soạn thảo trƣớc khi thi hành cập nhật hay thêm mới mẩu tin. Thuộc tính CursorLocation Xác định tập bản ghi trả về từ cơ sở dữ liệu đƣợc lƣu ở đâu (Server hay Client, Server là mặc định). Thuộc tính cũng giống thuộc tính CursorLocation của đối tƣợng Connection. Ngắt kết nối Khi chúng ta dùng con trỏ phía Client, ta có khả năng ngắt kết nối với Server cơ sở dữ liệu mà vẫn tiếp tục làm việc với dữ liệu. Cách này cho phép ứng dụng trở nên linh hoạt hơn bởi vì nhiều ngƣời dùng có thể làm việc với cùng một dữ liệu tại một thời điểm nếu nhƣ họ không có nối kết với server. Để ngắt nối kết với Server, ta quy định thuộc tính ActiveConnection của đối tƣợng Recordset là Nothing. Ví dụ: Dim cn As ADODB.Connection Private Sub Form_Load() Set cn = New ADODB.Connection cn.Provider = "Microsoft.Jet.OLEDB.3.51" cn.ConnectionString = "F:\Data\GiangDay.mdb" cn.Open End Sub Public Function GetList (strState As String) _ As ADODB.Recordset Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset 169
  68. Set rs.ActiveConnection = cn rs.CursorLocation = adUseClient rs.LockType = adLockBatchOptimistic rs.CursorType = adOpenKeyset rs.Open strState Set rs.ActiveConnection = Nothing Set GetList = rs Set rs = Nothing End Function Để thi hành cùng một hành động trên một mẩu tin, ta sửa đổi lại các thuộc tính của đối tƣợng Recordset. rs.LockType = adLockBatchOptimistic rs.CursorType = adOpenKeyset Chúng ta thiết lập giá trị các thuộc tính lại nhƣ trên để xác nhận rằng Recordset có thể nối kết lại để cập nhật về sau. Sau đó, ta sẽ thiết lập một hàm nhận Recordset ngắt kết nối làm tham biến để tạo một đối tƣợng Recordset khác cập nhật dữ liệu. Public Sub WriteData(rsDis As ADODB.Recordset) Dim rs As ADODB.Recordset Set rs = New ADODB.Recordset Set rs.ActiveConnection = cn rs.Open rsDis, cn rs.UpdateBatch End Sub Gọi thực thi thủ tục WriteData: Private Sub cmdWrite_Click() WriteData GetList("Select * From THanghoa") End Sub c) Đối tƣợng Command Đây là đối tƣợng đƣợc ngƣời lập trình sử dụng khi muốn thi hành các thủ tục lƣu trữ sẵn hay những câu truy vấn có tham số. Với đối tƣợng Command ta có thể thi hành một số công việc nhƣ sau: Sử dụng thuộc tính CommandText để định nghĩa các đoạn Text thi hành đƣợc. Thông thƣờng thuộc tính này dùng để thiết lập một câu lệnh SQL hoặc một lời gọi thủ tục lƣu trữ sẵn, hay những dạng khác mà trình cung cấp hỗ trợ Xây dựng chuỗi các đối số của câu truy vấn cũng nhƣ các tham số của các thủ tục lƣu trữ sẵn thông qua đối tƣợng Parameter hoặc tập hợp Parameters. 170
  69. Thực hiện một câu truy vấn và trả về đối tƣợng Recordset thông qua phƣơng thức Execute. Xác định kiểu của đối tƣợng Command để nâng cao hiệu quả thông qua thuộc tính CommandType. Xác định số giây mà trình cung cấp phải chờ khi thi hành một đối tƣợng Command thông qua thuộc tính CommandTimeOut. Các kiểu của đối tƣợng Command đƣợc trình bày trong bảng dƣới đây: Hằng Ý nghĩa Định giá thuộc tính CommandText dƣới dạng Text của adCmdText một câu lệnh hoặc một lời gọi thủ tục lƣu trữ sẵn. Định giá thuộc tính CommandText nhƣ là tên của một adCmdTable bảng khi tất cả các trƣờng của bảng đó sẽ đƣợc trả về bởi câu lệnh truy vấn nội tại. Định giá thuộc tính CommandText nhƣ là tên của một adCmdTableDirect bảng khi mà tất cả các trƣờng của bảng đó sẽ đƣợc trả về. Định giá thuộc tính CommandText nhƣ là tên của một adCmdStoredProc thủ tục lƣu trữ sẵn. Chỉ định rằng thuộc tính CommandText là một câu lệnh hoặc một thủ tục lƣu trữ sẵn không trả về bất kỳ adExecuteNoRecords dòng nào (ví dụ nhƣ lệnh thêm mới dữ liệu ). Cấu trúc này luôn bao hàm adCmdText, adCmdStoredProc. Thuộc tính Parameter đƣợc xác lập thông qua hai phƣơng thức CreateParameter và Append Set parameter = command.CreateParameter (Name, Type, _ Direction, Size, Value) Name: tùy chọn, chuỗi xác định tên của đối tƣợng Parameter. Type, Direction: giá trị xác địn kiểu của đối tƣợng Parameter Size: giá trị xác định độ dài tối đa của giá trị đối tƣợng Parameter bằng ký tự hoặc Byte. Value: biến xác định giá trị của Parameter truyền. Những giá trị có thể của thuộc tính Direction: Hằng Mô tả adParamUnknown Không biết chiều của Parameter. 171
  70. adParamInput Mặc định, xác định đây là tham số đầu vào. adParamOutput Tham số đầu ra. adParamInputOutput Vừa là tham số đầu vào vừa là tham số đầu ra. adParamReturnValue Đây là giá trị trả về. Phƣơng thức Append dùng để đƣa đối tƣợng Parameter vừa tạo vào tập hợp. Chúng ta sẽ xét qua ví dụ dau đây: Public Sub ActiveConnectionX() Dim cnn1 As ADODB.Connection Dim cmdByRoyalty As ADODB.Command Dim prmByRoyalty As ADODB.Parameter Dim rstByRoyalty As ADODB.Recordset Dim rstAuthors As ADODB.Recordset Dim intRoyalty As Integer Dim strAuthorID As String Dim strCnn As String ' Định nghĩa 1 đối tượng command cho một thủ tục lưu trữ sẵn Set cnn1 = New ADODB.Connection cnn1.Provider = "SQLOLEDB.1" cnn1.ConnectionString = "DATABASE=Pubs;" & _ "SERVER=(local);UID=user;PWD=user;" cnn1.Open Set cmdByRoyalty = New ADODB.Command Set cmdByRoyalty.ActiveConnection = cnn1 cmdByRoyalty.CommandText = "byroyalty" cmdByRoyalty.CommandType = adCmdStoredProc cmdByRoyalty.CommandTimeout = 15 ' Định nghĩa đối số đầu vào cho thủ tục lưu trữ intRoyalty = Trim(InputBox( "Enter royalty:")) Set prmByRoyalty = New ADODB.Parameter prmByRoyalty.Type = adInteger prmByRoyalty.Size = 3 prmByRoyalty.Direction = adParamInput prmByRoyalty.Value = intRoyalty cmdByRoyalty.Parameters.Append prmByRoyalty ' Tạo một recordset bằng cách thi hành đối tượng Command. Set rstByRoyalty = cmdByRoyalty.Execute() ' Mở bảng Authors để lấy tên hiển thị Set rstAuthors = New ADODB.Recordset 172
  71. rstAuthors.Open "authors", cnn1, , , adCmdTable Debug.Print "Authors with " & intRoyalty & _ " percent royalty" Do While Not rstByRoyalty.EOF strAuthorID = rstByRoyalty!au_id Debug.Print , rstByRoyalty!au_id & ", "; rstAuthors.Filter = "au_id = '" & _ strAuthorID & "'" Debug.Print rstAuthors!au_fname & “ - “ & _ rstAuthors!au_lname rstByRoyalty.MoveNext Loop rstByRoyalty.Close rstAuthors.Close cnn1.Close End Sub d) Đối tƣợng Field Dùng đối tƣợng Field và tập hợp Fields khi ta muốn truy cập giá trị của một trƣờng của một Recordset nào đó, kỹ thuật này tƣơng tự nhƣ đối với DAO. Chúng ta có thể sử dụng kỹ thuật ADO để kết nối đến CSDL và sử dụng các điều khiển thông thƣờng khác nhƣ: TextBox, Label, CheckBox để ràng buộc dữ liệu (data binding) và kết xuất dữ liệu. Hình 5.12. Điều khiển Adodc Tên mặc định của điều khiển này là Adodc1 (chúng ta có thể đổi thành tên khác). 173
  72. a) Một số thuộc tính của điều khiển Adodc: ConnectionString: Chuỗi kết nối đến CSDL CommandType: Kiểu lệnh thi hành CursorType: Kiểu trỏ LockType: Kiểu khoá RecordSource: Nguồn dữ liệu b) Truy cập đến dữ liệu trong cơ sở dữ liệu Chúng ta thực hiện 2 bƣớc: Bƣớc 1 là tạo kết nối đến CSDL, bƣớc 2 là thiết lập nguồn dữ liệu (RecordSource) từ CSDL cho điều khiển Adodc. Bƣớc 1: Tạo một kết nối (Connection) đến CSDL: Kích chuột chọn Adodc1, trong cửa sổ Properties chọn thuộc tính ConnectionString, khi đó xuất hiện nút , chúng ta kích chuột vào nút này sẽ xuất hiện ra cửa sổ Property Pages. Hình 5.13. Thuộc tính ConnectionString trong cửa sổ thuộc tính Cửa sổ Property Pages mở ra: Hình 5.14. Hộp thoại Property Pages 174
  73. Trong cửa sổ Property Pages có 3 lựa chọn: - Use Data Link File: Cho phép chúng ta nạp những thông số kết nối đã đƣợc lƣu trƣớc trong MDL file (Microsoft Data Link). - Use ODBC Data Source Name: Chúng ta có thể chọn một Data Source Name (DSN) từ những DSN trong ODBC của máy chúng ta (chúng ta phải thiết lập DSN này trong ODBC trƣớc), hoặc chúng ta có thể tạo mới DSN ngay lúc này bằng cách nhấp chọn “New” và cấu hình cho DSN này. - Use Connection String: Chúng ta phải chỉ ra một chuỗi kết nối trực tiếp. Chúng ta sử dụng lựa chọn thứ ba là “Use Connection String”, sau đó kích chuột vào nút Build, chọn Provider là “Microsoft Jet 4.0 OLE DB Provider” để kết nối đến CSDL Access, rồi nhấn nút Next. Nếu kết nối đến CSDL SQL Server thì chọn Microsoft OLE DB Provider for SQL Server, rồi nhấn nút Next. Giả sử chúng ta chọn Provider là “Microsoft Jet 4.0 OLE DB Provider” để kết nối đến CSDL Microsoft Access, sau đó nhấn nút Next. Hình 5.15. Hộp thoại Data Link Properties Sau khi nhấn nút Next, cửa sổ chuyển sang thẻ Connection: 175
  74. Tại hộp “Select or enter a database name”, chúng ta nhấn nút ở bên phải để tìm đến CSDL Microsoft Access có tên là QTKD.mdb. Hình 5.16. Cửa sổ Select Access Database Sau khi chọn xong, chúng ta kích vào nút “Open” để chỉ ra tên của CSDL cần kết nối. Sau đó chúng ta nhấn nút “Test Connection” phía dƣới để kiểm tra xem kết nối có đƣợc thiết lập tốt không? Nếu kết nối thành công thì cửa sổ sau sẽ xuất hiện: Bƣớc 2: Thiết lập nguồn dữ liệu (Record source) từ CSDL cho điều khiển Adodc1: Trong cửa sổ Property- Adodc1 chọn thuộc tính RecordSource, khi đó xuất hiện nút , kích chuột vào nút này sẽ hiện ra cửa sổ Property Pages. 176
  75. Khi chọn hộp ComboBox “Command Type” (Kiểu lệnh thi hành) xổ xuống sẽ có các lựa chọn sau: 8 – adCmdUnknown: Kiểu lệnh không xác định. 1 – adCmdText: Kiểu lệnh thi hành một câu truy vấn (câu SELECT) trên nguồn dữ liệu, câu SELECT này đƣợc ghi ở hộp “Command Text (SQL)” bên dƣới, kết quả trả về tập hợp các bản ghi thoả mãn câu SELECT trên. 2 – adCmdTable: Tên của một bảng (table) cụ thể , kết quả trả về toàn bộ các bản ghi của bảng. 4 – adCmdStoredProc: Kiểu lệnh thi hành một Stored Procedure trên CSDL, tên của Stored Procedure này (có thể có tham số đi kèm) ghi ở hộp “Command Text (SQL)” bên dƣới. Tuỳ thuộc chúng ta chọn kiểu lệnh nào thì hộp Combobox “Table or Stored Procedure Name” bên dƣới có thể Enable hoặc không. Để truy xuất danh sách khách hàng trong CSDL, chúng ta chọn Command Type là “2 – adCmdTable” , sau đó chọn bảng tblDS_KH trong hộp combobox và nhấn nút OK: Sau khi thực hiện xong việc kết nối và chọn nguồn dữ liệu để hiển thị từ ADO Data Control. Bƣớc 3. Sử dụng các điều khiển thông dụng nhƣ: Textbox, Checkbox để ràng buộc dữ liệu với ADO Data Control này. Do bảng tblDS_KH có 8 trƣờng: Makh (mã khách hàng), Tenkh (họ tên khách hàng), Diachi (địa chỉ khách hàng), Dienthoai (điện thoại), Fax (số Fax), Company (Tên công ty), Utien (ƣu tiên), Email (địa chỉ thƣ điện tử) nên khi thiết kế Form chúng ta dùng 8 TextBox và đặt tên cho chúng là TxtMakh, TxtTenkh, TxtDiachi, TxtDienthoai, TxtFax, TxtCompany, TxtUtien, TxtEmail. Chúng ta cũng sử dụng 8 Label đặt trƣớc 8 TextBox này với các tên là LblMakh, LblTenkh, LblDiachi, 177
  76. LblDienthoai, LblFax, LblCompany, LblUtien, LblEmail. Ngoài ra, ta sử dụng một Label có tên là LblDS có Caption là “Danh sách khách hàng”. Tiếp theo, chúng ta phải ràng buộc mỗi TextBox với từng trƣờng (field) cụ thể của bảng (Table) tblDS_KH dựa vào hai thuộc tính quan trọng của TextBox là DataSource và DataField. Ở đây DataSource của 8 textbox đều là Adodc1: 178
  77. Đối với thuộc tính DataField của txtmakh, ta nhấp chuột vào nút của hộp Combobox để hiển thị tất cả các trƣờng trong bảng tblDS_KH: makh, tenkh, diachi, dienthoai, fax, company, utien, email, rồi nhấp chuột chọn trƣờng “makh”: Ta làm tƣơng tự cho các textbox còn lại. Thực thi chƣơng trình bằng cách nhấp nút (Start) hoặc nhấn phím F5, ta thấy kết quả của chƣơng trình nhƣ sau: 179
  78. Nhấn chuột vào ô sẽ hiển thị bản ghi kế tiếp sau. Nhấn chuột vào ô sẽ hiển thị bản ghi cuối cùng. Nhấn chuột vào ô sẽ hiển thị bản ghi ở ngay trƣớc bản ghi hiện thời. Nhấn chuột vào ô sẽ hiển thị bản ghi đầu tiên. 5.6.4. Ví dụ minh hoạ Cho cơ sở dữ liệu qltv.mdb chứa trong thƣ mục “D:\Bai tap VB\ADO Form luoi”, gồm 3 bảng dữ liệu: Sach(Mas, Tens, Tacgia, Nhaxb, Namxb) Docgia(Madg, Tendg, Diachi, Dienthoai) Muontra(Madg, Mas, Ngaym, Ngayht, Ngayt) Hãy lập một chƣơng trình (project), trong đó có form Sách dùng để thao tác với bảng Sach theo mẫu sau: Giải: Bƣớc 1. Đƣa điều khiển ADODC, DataCombo, DataGrid vào hộp công cụ: Từ menu hệ thống, chọn Project/Components, đánh dấu kiểm vào các mục chọn nhƣ hình sau: 180
  79. Khi đó trên hộp công cụ sẽ có các điều khiển sau: Bƣớc 2. Đƣa vào form điều khiển ADODC và gán giá trị cho một số thuộc tính sau: Name = AdodcSach Connectiontring = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Bai tap VB\ADO Form luoi\qltv.mdb;Persist Security Info=False” RecordSource = Sach Bƣớc 3. Đƣa vào form điều khiển DataGrid và thực hiện các thao tác sau: Gán giá trị cho một số thuộc tính sau: Name = DataGridSach AllowAddNew =True AllowDelete =True DataSource =AdodcSach Nhấn phải chuột vào điều khiển DataGrid chọn Edit, sau đó nhấn phải chuột vào điều khiển DataGrid 3 lần nữa, mỗi lần chọn Insert để thêm 3 cột vào DataGrid Tiếp tục nhấn phải chuột vào điều khiển DataGrid chọn Property để mở hộp thoại Property Pages, nhƣ hình sau: 181
  80. Trên hộp thoại Property Pages, lần lƣợt chọn cột trong mục Column, sau đó gán tiêu đề cho cột trong mục Caption và chọn nguồn dữ liệu (tên trƣờng) trong mục DataField. Có thể thiết lập Font, màu, định dạng cho các cột bằng cách chọn các Tab: Font, Color, Format trên hộp thoại Property Pages. Bƣớc 4. Đƣa thêm điều khiển Adodc thứ hai vào form và thiết lập các thuộc tính sau: Name = AdodcTacgia Connectiontring = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Bai tap VB\ADO Form luoi\qltv.mdb;Persist Security Info=False” RecordSource = “Select distinct Tacgia from Sach” Bƣớc 5. Đƣa thêm điều khiển Adodc thứ ba vào form và thiết lập các thuộc tính sau: Name = AdodaNhaxb Connectiontring = “Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Bai tap VB\ADO Form luoi\qltv.mdb;Persist Security Info=False” RecordSource = “Select distinct Nhaxb from Sach” Bƣớc 6. Đƣa điều khiển Frame lên form rồi thiết lập giá trị cho thuộc tính Caption của nó là “Lọc theo”. Sau đó, đƣa điều khiển 2 điều khiển DataCombo lên trên Frame đó, rồi thiết lập giá trị cho các thuộc tính của hai điều khiển DataCombo. Đối với DataCombo thứ nhất: Name: cboTacgia BoundColumn =Tacgia DataField =Tacgia DataSource =AdodcTacgia ListField =Tacgia RowSource =AdodcTacgia Đối với DataCombo thứ hai, ta thiết lập giá trị cho một số thuộc tính sau: Name = cboNhaxb BoundColumn = Nhaxb DataField = Nhaxb DataSource = AdodcNhaxb ListField =Nhaxb RowSource = AdodcNhaxb Bƣớc 7. Đƣa thêm 8 điều khiển CommandButton và 2 điều khiển Label lên form, xác định vị trí và các thƣớc của tất cả các điều khiển trên form cho phù hợp, rồi thiết lập một số thuộc tính của các điều khiển mới đƣa lên form theo bảng sau: TT Điều khiển Thuộc tính Giá trị Ghi chú 1 CommandButton Name cmdfirst 182
  81. Caption Về đầu Name cmdpre 2 CommandButton Caption Về trƣớc Name cmdadd 3 CommandButton Caption Thêm Name cmdedit 4 CommandButton Caption Sửa Name cmddel 5 CommandButton Caption Xóa Name cmdundo 6 CommandButton Caption Bỏ lọc Name cmdnext 7 CommandButton Caption Về sau Name cmdlast 8 CommandButton Caption Về cuối 9 Label Caption Tác giả 10 Label Caption Nhà xuất bản Đến đây ta thu đƣợc form có dạng sau Bƣớc 8. Mở cửa sổ Code của form frmSach và gõ vào các dòng lệnh sau: Dim Cnn As New ADODB.Connection Private Sub cbonhaxb_Click(Area As Integer) Dim x As String If cbotacgia.Text = "" Then x = "select * from sach where nhaxb like '" & Trim(cbonhaxb.Text) & "'" Else x = "select * from sach where (tacgia like '" & Trim(cbotacgia.Text) & "'" & ") and ( nhaxb like '" & Trim(cbonhaxb.Text) & "')" End If Dim rsxem As New ADODB.Recordset 183