Tiếp nối phần 1, phần 2 của giáo trình cung cấp bạn kiến thức như tương tác giữa người dùng với ứng dụng, đồ họa và multimedia, liên kết cơ sở dữ liệu và xây dựng và triễn khai các ứng dụng. Mời các bạn tham khảo!
BÀI TƯƠNG TÁC GIỮA NGƯỜI DÙNG VỚI ỨNG DỤNG Mã bài : ITPRG03.6 Giới thiệu : Trong học nghiên cứu phương pháp tạo tương tác dễ dàng cho người sử dụng với chương trình cách sử dụng cơng cụ có Borland C++ Builder 6.0 Mục tiêu thực hiện: Học xong học viên có khả năng: Sử dụng số hộp thoại C++ Builder Sử dụng hộp thoại dùng chung Windows Biết tạo quản lý hộp thoại Mơ tả mơ hình giao diện ứng dụng người dùng Windows Nội dung chính: 6.1 Sử dụng hộp thoại Các hộp thoại Windows: Một hộp thoại cửa sổ dùng để tương tác với máy tính Bản thân hộp thoại khơng mang ý nghĩa Các điều khiển nằm thực luật tương tác người sử dụng máy tính Trước tiên, hộp thoại có đặc trưng sau đây: Nó trang bị nút nhấn Close Nút nhấn cho phép người sử dụng hủy bỏ hộp thoại Thông thường, nút nhấn cấu hình giống người sử dụng nhấn Cancel nhấn phím Esc Nó khơng thể thu nhỏ, phóng to, hay trả lại trạng thái ban đầu (restored) Một hộp thoại khơng có nút hệ thống khác ngồi nút Close Nó modal Người sử dụn thường khơng cho phép tiếp tục hành động khác đóng hộp thoại Nó cung cấp cách cho người sử dụng đóng hay hủy bỏ hộp thoại Đa số hộp thoại có nút Ok nút Cancel, tùy thuộc ứng dụng phát triển Khi hộp thoại có nút Ok Cancel, nút Ok cấu hình để kích hoạt phím Enter; nút Cancel kích hoạt phím Esc Hộp thoại thơng điệp (Message Boxes) Hình 88-Hộp thoại minh họa 134 Một hộp thoại thôn điệp hộp thoại nhỏ dùng để hiển thị thông điệp cung cấp hay nhiều nút nhấn Nó thường dùng để cung cấp thông tin tới người sử dụng hay yêu cầu định từ người sử dụng Bằng cách nhấn nút nhấn, người sử dụng tạo định chương trình tiếp tục Các hộp thoại thông điệp tạo từ hàm dựng sẵn từ VCL thư viện Win32 Chúng ta tiến hành chuẩn bị để tạo ứng dụng mẫu hộp thoại thông điệp theo bước sau: Tạo dự án với form mặc định Đổi thuộc tính caption form thành Message Boxes Configurations Từ ngăn công cụ Standard, chọn đối tượng Edit đặt lên Form Đổi tên đối tượng thành edtMessage xóa nội dụng thuộc tính Text Hàm ShowMessage Hàm ShowMessage() cung cấp hộp thoại Borland Hàm có tham số chuỗi không trả giá trị Nó sử dụng để hiển thị thông điệp đến người sử dụng người sử dụng nhấn nú Ok để chấp nhận Cú pháp hàm ShowMessage() là: void fastcall ShowMessage(const AnsiString Message); Một hộp thoại thông điệp tạo với hàm ShowMessage() sử dụng tên dự án làm tiê đề Thông điệp để hiển thị chuỗi cung cấp người sử dụng Đây ví dụ: // void fastcall TForm1::btnShowMsgClick(TObject *Sender) { ShowMessage("Welcome to the Sellers Bank."); } // Chuỗi dẫn xuất từ đối tượng khác chẳng hạn nội dung hộp thoại thảo, vùng nhớ (memo) đối tượng văn khác Đây ví dụ: // void fastcall TForm1::btnMsgFromEditClick(TObject *Sender) { ShowMessage(edtMessage->Text); } // Chuỗi ghép nối nhiều chuỗi khác nhau: // void fastcall TForm1::Button1Click(TObject *Sender) { ShowMessage("The name " + AnsiString("\"") + 135 edtMessage->Text + AnsiString("\"") + " is not in our records."); } // Sử dụng hàm ShowMessage() Từ ngăn công cụ Standard, chọn đối tượng Button đặt lên form Thay đổi thuộc tính Button thành Show &Msg đổi tên thành butnShowMsg Nhấn đơi chuột lên nút butnShowMsg để viết mã lệnh cho kiện Click Nhấn phím tab cài đặt đoạn mã lệnh sau: // void fastcall TForm1::btnShowMsgClick(TObject *Sender) { ShowMessage("Please fill out your Time Sheet before leaving."); } // Để kiểm thử chương trình, nhấn phìm F9 Nhấn vào nút Show Msg: Hình 89-Hộp thoại hiển thị nấn vào nút Show Msg Nhấn Ok để đóng form Để lưu dự án, thực đơn chính, chọn File/Save All Tìm thư mục để lưu ví dụ Nhấn nút Create new Folder Gõ Message Boxes nhấn phím Enter hai lần để hiển thị thư mục hộp đổ xuống Save Nhấn nút Save để lưu Unit Gõ Messages để thay tên dự án nhấn Enter Để hiển thị thơng điệp nhiều dịng, thay đổi mã lệnh thành sau: // void fastcall TForm1::btnShowMsgClick(TObject *Sender) { ShowMessage("Please fill out your Time Sheet before leaving.\n" "Make sure you sign and send it to Human Resources."); } // 136 Chạy chương trình xem kết quả: Hình 90-Hộp thoại nhiều dịng Hàm MessageBox Hàm MessageBox() dẫn xuất từ Win32 Cú pháp là: int fastcall MessageBox(const char * Message, const char * Caption, int Flags); Hình 91-Minh họa tham số hàm MessageBox() MessageBox() tạo với ba tham số Tham số đầu tiên, Message, chuỗi kết thúc rỗng định thông điệp mà người sử dụng đọc Chuỗi Message câu tĩnh Nó kiếm tạo từ đối tượng khác Hoặc kết hợp nhiều chuỗi khác cách sử dụng hàm phép tốn chuỗi C/C++ Chúng ta tạo hộp thoại thông điệp đơn giản tương tự việc sử dụng hàm ShowMessage() để hiển thị hộp thoại thông điệp đơn giản với nút OK Trong trường hợp này, chần cung cấp tham số Message Cài đặt hai tham số lại NULL Đây ví dụ: // void fastcall TForm1::Button1Click(TObject *Sender) { Application->MessageBox( "This operation can only be " "performed by an administrator.", NULL, NULL); } // Tham số thứ 2, chuỗi, tiêu đề hiển thị tiêu đề hộp thoại Chúng ta cài đặt tạo hộp thoại thơng điệp hay xây dựng vào lúc thực thi Nếu khơng có tiêu đề, cài đặt giá trị tham số thành NULL Trong trường hợp này, tiêu đề hiển thị thành Error Do đó, để tạo hộp thoại buồn chán, cung cấp tham số Caption Đây ví dụ: // 137 void fastcall TForm1::Button1Click(TObject *Sender) { Application->MessageBox("Make sure the music is playing.", "CD PLayer Instructions", NULL); } // Tham số thứ ba định cờ muốn hiển thị hộp thoại: hay nhiều nút nhấn số hình ảnh tùy chọn Chúng ta tạo hộp thoại đơn giản với nút OK Trong trường hợp đó, cài đặt tham số thứ ba thành MB_OK Đây ví dụ: // void fastcall TForm1::Button1Click(TObject *Sender) { Application->MessageBox("Make sure the music is playing.", "CD PLayer Instructions", MB_OK); } // Để hiển thị nhiều nút nhấn, sử dụng số nguyên để ấn định nhóm nút cho phép Sau số nút nhấn nó: Hằng số nguyên Các nút nhấn MB_OK MB_OKCANCEL MB_ABORTRETRYIGNORE MB_YESNOCANCEL MB_YESNO MB_RETRYCANCEL MB_CANCELTRYCONTINUE MB_HELP Ví dụ, để tạo hộp thoại hiển thị nút Yes va nút No, viết: // void fastcall TForm1::Button1Click(TObject *Sender) { Application->MessageBox("Do you hear any music now or any sound at all?", 138 "CD Player Instructions", MB_YESNO); } // Nếu chung ta cung cấp MB_HELP nút nhấn nhất, hộp thoại hiển thị với nút OK nút Help Chúng ta hiển thị biểu tượng sử dụng số nguyên Win32 Mặc dù, sử dụng biểu tượng với nút nhấn nào, phải khéo việc hiển thị biểu tưởng tương ứng với ngữ cảnh thông điệp Các giá trị biểu tượng liệt kê: Giá trị Biểu tượng Thích hợp MB_ICONEXCLAMATION MB_ICONWARNING Cảnh báo người sử dụng hành động thi hành ứng dụng MB_ICONINFORMATION MB_ICONASTERISK Thông báo người sử dụng trạng thái không phê phán MB_ICONQUESTION Hỏi câu hỏi với câu trả lời: Yes No hay Yes, No Cancel MB_ICONSTOP MB_ICONERROR Một tình phê phán hay có lỗi xảy Biểu tượng tương ứng thông tin cho người sử dụng kết thúc hay từ chối hành động Các biểu tượng sử dụng chung với số nút nhấn Để kết hợp cờ này, sử dụng phép toán bit OR “|” Đây ví dụ: // void fastcall TForm1::Button1Click(TObject *Sender) { Application->MessageBox("Do you hear any music now or any sound at all?", "CD Player Instructions", MB_YESNOCANCEL | MB_ICONQUESTION); } // Khi hộp thoại cấu hình để hiển thị hay nhiều nút nhấn, hệ điều hành cài đặt định nút nút mặc định Nút mặc định có đường viền đậm đặt tách rời với nút khác Nếu người sử dụng nhấn phím Enter, hộp thoại phát sinh kiện người sử dụng nhấn nút nút mặc định May mắn thay, hộp thoại có nhiều nút, định nút nhấn 139 trở thành mặc định Để định nút mặc định, sử dụng số sau: Giá trị Nếu hộp thoại có nhiều nút nhấn, nút nhấn mặc định MB_DEFBUTTON1 Nút MB_DEFBUTTON2 Nút thứ hai MB_DEFBUTTON3 Nút thứ ba MB_DEFBUTTON4 Nút thứ tư Để định nút nhấn mặc định, sử dụng phép toán bit OR để kết hợp số nguyên để định nút nhấn mặc định với số nút nhấn biểu tượng Sau ví dụ: // void fastcall TForm1::Button1Click(TObject *Sender) { Application->MessageBox("Do you hear any music now or any sound at all?", "CD Player Instructions", MB_YESNOCANCEL | MB_ICONQUESTION | MB_DEFBUTTON2); } // Sau đọc thông điệp hiển thị hộp thoại, người sử dụng nhấn nút nhấn hộp thoại đóng lại Mỗi nút nhấn có số nguyên gán đồng trình dịch Chúng ta sử dụng giá trị để tìm xem nút nhấn nhấn Điều có nghĩa hàm MessageBox() trả giá trị số nguyên liệt kê bảng sau: MessageBox() trả Nếu người sử dụng nhấn IDOK OK phím Enter IDCANCEL Cancel phím Esc IDABORT Abort IDRETRY Retry IDIGNORE Ignore IDNO No IDYES Yes IDCONTINUE Continue IDTRYAGAIN Try Again 140 Do đó, sử dụng giá trị nguyên để hành động phụ thuộc nút nhấn nhấn: // void fastcall TForm1::Button1Click(TObject *Sender) { if( Application->MessageBox( "Do you hear any music now or any sound at all?", "CD Player Instructions", MB_YESNOCANCEL | MB_ICONQUESTION) == IDNO ) Panel1->Caption = "We will stop these tests now " "Let the machine rest!"; } // Sử dụng hàm MessageBox() Thêm đối tượng Button lên form Đổi Caption đối tượng Button thành Simple &1 tên thành btnSimpleMsg Nhấn đôi chuột lên nút nhấn để viết mã lệnh cho kiện Click Nhấn phím Tab gõ: Application->MessageBox("This administrator.", NULL, NULL); operation can only be performed by an Để kiểm thử form, nhấn phím F9 Nhấn nút Simple để xem hộp thoại thông điệp Chú ý hộp thoại có nút nhấn OK tiêu đề Error: Hình 92-Minh họa kết sử dụng hàm MessageBox() Nhấn OK đóng form Nhấn phím F12 để hiển thị form Thêm nút nhấn khác vào form Đổi tiêu đề (caption) thành Simple &2 tên thành btnSimple2 Nhấn đơi chuột vào nút Simple Nhấn Tab gõ: 141 Application->MessageBox("Make Instructions", MB_OK); sure the music is playing.", "CD PLayer Kiểm thử form lại Borland C++ Builder Thêm nút nhấn khác vào form Đổi tiêu đề thành &Question tên thành btnQuestion Nhấn đơi chuột lên nút Question Nhấn phím Tab gõ: Application->MessageBox("Do you hear any music now or any sound at all?", "CD Player Instructions", MB_YESNOCANCEL | MB_ICONQUESTION); Kiểm thử form: Hình 93-Hộp thoại Question Trở lại Borland C++ Builder Thêm nút nhấn khác vào Form Đổi Caption thành &Default tên thành btnDefault Nhấn đơi chuột cài đặt đoạn mã sau: // void fastcall TForm1::btnDefaultClick(TObject *Sender) { Application->MessageBox( "The file you are trying to copy is being " "used by someone else.\n" "Would you like to try later? If you click\n" "Yes: You will be reminded when the file is ready.\n" "No: Copy the file anyway You will get only the source file\n" "Cancel: Cancel the operation.", "Copying Files", MB_YESNOCANCEL | MB_ICONQUESTION | MB_DEFBUTTON2); } // Kiểm thử Form: 142 Hình 94-Hộp thoại có nút nhấn mặc định Trở lại Borland C++ Builder Hàm MessageDlg: Hình 95-Minh họa kết hàm MessageDlg Hàm MessageDlg() hộp thông điệp tinh chỉnh Borland cung cấp thay tốt cho hàm MessageBox() Win32 Cú pháp hàm MessageDlg() là: int fastcall MessageDlg(const AnsiString Message, TMsgDlgType IconType, TMsgDlgButtons Buttons, int HelpContext); Tham số đầu tiên, Message, thông điệp gởi đến người sử dụng Nó câu đơn giản, đoạn hay kết hợp nhiều chuỗi IconType biểu tượng sử dụng để làm bật hộp thoại Biểu tượng cài đặt cách sử dụng số nguyên số sau: Giá trị Biểu tượng mtWarning mtError mtInformation mtConfirmation mtCustom None Tham số Buttons sử dụng kiểu nút nhấn hiển thị hộp thoại Các nút nhận định nghĩa sử dụng tập hợp TMsgDlgButtons sau: Giá trị Nút nhấn Giá trị Nút nhấn 143 Cửa sổ chọn mã số khách hàng dùng để chọn mã số khách hàng từ listbox Hình 147-Cửa sổ chọn mã số khách hàng Cửa sổ chọn report dùng để chọn loại báo cáo in Hình 148-Cửa sổ chọn báo cáo Cửa sổ chọn khoảng thời gian dùng để chọn giai đoạn ngày Hình 149-Cửa sổ chọn khoảng thời gian Cửa sổ Splash chương trình, cửa sổ chạy lên chương trình dùng để giảm độ trễ chương trình tải nhiều liệu lớn 288 Hình 150-Cửa sổ splash chương trình Cửa sổ tìm kiếm dùng để tìm kiếm văn trường Hình 151-Cửa sổ tìm kiếm Bây giờ, nhấn phím F9 để tiến hành thực thi chương trình 8.6 Thực hành Bài 1: Tạo chương trình quản lý danh bạ điện thoại Bài 2: Tạo chương trình quản lý đĩa CD Bài 3: Tạo chương trình quản lý danh sách học sinh, sinh viên BÀI Tên bài: XÂY DỰNG VA TRIỂN KHAI CÁC ỨNG DỤNG Mã bài : ITPRG03.9 Giới thiệu : Trong học này, nghiên cứu phương pháp triển khai ứng dụng cơng cụ sẵn có Windows chương trình InstallShield Express Mục tiêu thực hiện: Học xong học viên có khả năng: - Mô tả số kỹ thuật gỡ rối C++ Builder - Sử dụng số tài nguyên Windows 289 - Xây dựng trợ giúp trực tuyến - Sử dụng chương trình InstallShield Express Nội dung chính: 9.1 Các kỹ thuật gỡ rối C++ Builder Khi lập trình với C++ Builder, chương trình biên dịch thành tập tin exe mặc định kèm chương trình gỡ rối biên dịch bên Chương trình có nhiệm vụ kiểm soát lỗi phát sinh trình thực thi chương trình lỗi lập trình lỗi hệ điều hành phát sinh Các chức kích hoạt điều chỉnh hộp thoại Tools/Debugger Options Hình 152-Hộp thoại tinh chỉnh Debugger Options Thơng thường chức cài đặt mặc định C++ Builder phù hợp với đa số chương trình mà tạo Tuy nhiên, chúng tơi đề nghị để truy bắt lỗi ngoại lệ phát sinh trình lập trình chủ quan Chúng ta nên dùng chức truy bắt ngoại lệ C++ Builder C++ Builder cung cấp khối lệnh try để truy bắt lỗi chặc chẽ hai trường hợp lỗi chương trình lỗi phát sinh Chúng ta nghiên cứu thêm lĩnh vực tài liệu hướng dẫn C++ Builder 9.2 Sử dụng tài nguyên Windows để xây dựng trợ giúp trực tuyến Sau cài đặt xong C++ Builder, nhận cơng cụ miễn phí Html Help Workshop Công cụ cho phép tạo tập tin trợ giúp dạng hlp Chúng ta khởi động cách chọn Start/Program Files/HTML Help Workshop/HTML Help Workshop Khi khởi động xong nhận giao diện sau: 290 Hình 153-Cửa sổ chương trình HTML Help Workshop Trước tiên cần tạo nội dung cho file Help Để tạo nội dung file mở FontPage express, FrontPage 98, 2000 đánh vào nội dung mà cần để hướng dẫn người sử dụng Sau lưu file lên đĩa với tên sau: Congty.htm, Diachi.htm, hdCaidat.htm, hdSudung.htm, Sanpham.htm, Ykien.htm, Index.htm (dùng ví dụ này) Một ví dụ cách tạo file dùng FrontPage 2000 (tương tự cho Frontpage 98 FrontPage express): Nhấn Start/Programs/Microsoft Frontpage hình xuất hiện, gõ nội dung vào cửa sổ soạn thảo Chúng ta chọn Tab Normal (ngầm định chọn) đánh nội dung vào hình bỏ trắng Nếu thích dùng tab HTML để tạo nội dung thay cho tab Normal có kiến thức HTML Tab Preview cho biết trước nội dung vừa nhập xuất Sau nhập đầy đủ nội dung lưu file lên đĩa cách nhấn File/Save, chọn thư mục lưu trữ đánh tên file vào, chẳng hạn Vidu.htm Sau hoàn thành nội dung cho file Congty.htm, Diachi.htm, hdCaidat.htm, hdSudung.htm, Sanpham.htm, Ykien.htm tiếp tục công việc tạo lập file trợ giúp cho ứng dụng Quản lý Nhân Tiền lương Đến gọi trình ứng dụng tạo lập Help (Start/Programs/HTML Help Workshop/HTML Help Workshop) bắt đầu đặt nội dung, mục cho file nội dung Đầu tiên cần tạo file Project (.hhp) file mà sau dịch file Help.chm riêng chúng ta, cửa sổ HTML Help Workshop chọn File/New cửa sổ sau xuất 291 Chúng ta chọn vào Project (có màu sáng khác biệt) nhấn OK, hình trợ giúp xuất Chúng ta đánh vào khoảng trắng Browse C:\My Documents\nstlHelp.hhp, muốn tạo thư mục khác với thư mục C:\My Document nhấn chọn Browse để tìm thư mục lưu file Project đánh vào tên file (ngầm định có phần mở rộng hhp), ta đánh vào nstlHelp.hhp nhấn Open thấy xuất tên đường dẫn thư mục chứa file nstlHelp.hhp kèm Tiếp tục nhấn Next hình xuất Check vào HTML files (.htm) tiếp tục nhấn Next hình xuất hiện: Chúng ta nhấn vào nút Add thêm vào tất file.htm mà tạo nội dung lúc trước FrontPage 2000: Tiếp tục nhấn Next hình xuất hiện, hình nhấn chọn Finish để tạo Project chúng ta, muốn chỉnh sửa thêm, bớt file nội dung htm hay nhấn nút Back để thay đổi lại mặc định lúc trước cuối ta nhấn Finish để kết thúc việc tạo File Project Sau nhấn chọn Finish kết là: Trong tab Project nhấn vào Change Project Options tab Project thấy xuất cửa sổ, cửa sổ lựa chọn tab General đánh nội dung vào khung Title (hướng dẫn sử dụng) nhấn OK, title xuất góc trái file Help sau dịch hoàn chỉnh - Tiếp tục nhấn chọn tab Contents (ngay bên phải tab Project) thấy xuất cửa sổ sau: Nhấn chọn Create a new contents file nhấn OK, thấy xuất cửa sổ yêu cầu thư mục chứa đánh vào tên cho file.hhc để lưu giữ file nội dung (ở ta đánh tên file Contents.hhc lưu thư mục với file.htm tạo) Trong tab Contents nhấn chọn Contents Properties (ngay bên tab Contents) để chọn font chữ thích hợp muốn đánh tiếng Việt Tiếp tục nhấn vào nút insert a heading (ngay nút Contents Properties có biểu tượng thư mục): - Đánh nội dung "Hướng dẫn" vào phần Entrry title nhấn OK Tiếp theo nhấn vào nút Insert a page (ngay nút Insert a heading) thấy xuất hiện: Chúng ta chọn No (để trang chèn vào nằm heading vừa tạo), thấy xuất cửa sổ giống lúc nhấn vào nút Insert a heading, đánh nội dung "hướng dẫn cài đặt" vào phần Entry Title, nhấn vào nút Add cửa sổ này, cửa sổ xuất nhấn vào Nút Browse cửa sổ để mở file hdCaidat.htm (file tạo nội dung từ bước đầu), cuối liên tiếp chọn Open, OK để đóng cửa sổ vào (khi mở xong file nội dung hdSudung.htm) Tương tự, nhấn vào Insert a page nhập nội dung "Hướng dẫn sử dụng" vào Phần Entry title, nhấn Add để liên kết đến file hdSudung.htm Chúng ta tiếp tục nhìn vào hình phần Contents thấy phía gần có nút, nhấn vào đề mục "Hướng dẫn cài đặt" "Hướng dẫn 292 sử dụng", sau nhấn vào mũi tên sang phải "đ" để đề mục lùi vào phía chút (nhằm phân biệt rõ Heading Page - hình thức) Tương tự, tiếp tục thực cho Heading "Giới thiệu" gồm đề mục là: "Giới thiệu công ty" liên kết với file Congty.htm "Giới thiệu sản phẩm" liên kết với Sanpham.htm hai đề mục đẩy lùi vào chút nhờ nhấn vào nút lệnh có hình mũi tên sang phải Cuối tạo tương tự cho đề mục đứng độc lập "Đóng góp ý kiến" liên kết với file Ykien.htm "Địa liên lạc" liên kết tới file Diachi.htm, có điều đề mục để ngun vịt trí khơng nhấn vào nút lệnh có hình mũi tên sang phải để lùi vào chút (vì chúng ngang hàng với Heading kia) Đến bước hoàn thành xong phần Contents, tiếp tục làm việc với trang Index sát bên phải trang Contents (chúng ta cố kiên nhẫn chút thành sẵp đạt rồi) Chúng ta nhấn chuột vào tab Index, cửa sổ ra, nhấn vào lựa chọn Crêat a new index file nhập vào tên file Index cho hệ thống trợ giúp (ở nhập vào tên file Index.hhk thư mục lưu trưc file nội dung lúc trước): Để thay đổi font chữ nhấn vào nút lệnh Index properties (ở tab Index) chọn font chữ thích hợp Chúng ta tiếp tục cơng việc cách nhấn vào nút lệnh Insert a keyword có hình chìa khố bên nút lệnh Index properties, nhập vào nội dung "About Company" cho phần Keyword, tiếp tục nhấn vào nút Add để tạo liên kết tới file Congty.htm cho keyword này: Tương tự, tiếp tục tạo keyword: "About Software" liên kết với file Sanpham.htm, "Address" liên kết tới file Diachi.htm, "Feedback" liên kết với file Ykien.htm, "Guide to Setup" liên kết tới file hdCaidat.htm "Guide to Use" liên kết tới file hdSudung.htm Cuối cùng, nhấn vào nút lệnh có chữ A Z mũi tên kèm theo chúng để xếp Index theo thứ tự "a, b, c" Bước cuối cùng, nhấn chọn lại tab Project nhấn vào nút lệnh Save all project files and compile có hình đĩa mềm phễu để lưu lại tất file Contents, Index tạo bước dịch chúng thành file Help tổng hợp chạy độc lập mơi trường khác (ở sau dịch tạo file Help có tên nstlHelp.chm chứa thư mục C:\My Documents): Đến hoàn toàn làm chủ file Help dạng chm đưa vào ứng dụng khác cách dễ dàng (tương tự cách đưa vào ứng dụng file Help dạng hlp loại cũ mà nhiều số báo đề cập đến) Cuối cùng, sử dụng chương trình ABC Chm Convert để chuyển tập tin chm thành tập tin hlp Sau chuyển xong thành tập tin hlp, vào cửa sổ Project/Options, chọn ngăn Application tiến hành liên kết tập tin hướng dẫn hlp vào ứng dụng thông qua mục chọn Help File 9.3 Sử dụng chương trình InstallShield Express 293 Phần mềm InstallShield Express (ISXpress) phần mềm kèm theo cài Borland C++ Builder Sau khởi động, phần mềm có giao diện sau: Hình 154-Cửa sổ chương trình InstallShield Express Để tạo cài mới, theo bước sau (bộ cài ví dụ caidat.exe hay caidat.msi) - Chọn lệnh File/New Project đặt tên cho project đầy đủ sau: C:\Documents and Settings\lt01\My Documents\caidat\Caidat.ism - Nhấn nút ok gặp hộp thoại sau: 294 Hình 155-Cửa sổ tinh chỉnh cho cài đặt Trong cửa sổ làm việc bên khung bên trái sử dụng chức sau: - Nhóm mục chọn 1: Cho phép khai báo thông tin cài đặt như: thơng tin chương trình, gói cài đặt tùy chọn, đường dẫn cập nhật - Nhóm mục chọn 2: Những định liệu chương trình bao gồm: tập tin thành phần, mô đun cần thêm vào, sở liệu, - Nhóm mục chọn 3: Cho phép khai báo cài đặt cho máy tính cài phần mềm bao gồm: lối tắt, khóa registry, kết nối ODBC, tập tin INI, biến mơi trường, - Nhóm mục chọn 4: Cho phép tinh chỉnh đưa vào văn bản, hình ảnh, hộp thoại hiển thị trình cài đặt chương trình - Nhóm mục chọn 5: Chứa đựng yêu cầu hệ thống như: RAM, hệ điều hành, tập tin yêu cầu khai báo hành động tùy biến đáp ứng cho nhu cầu hệ thống - Nhóm mục chọn 6: Cho phép tiến hành đóng gói sản phẩm thành cài EXE 9.4 Thực hành Bài tập 1: Hãy tiến hành tạo hướng dẫn cho chương trình tập Bài tập 2: Hãy tiến hành tạo cài đặt cho chương trình tập BÀI 10 MỘT SỐ TÍNH NĂNG ĐẶC BIỆT KHÁC Mã bài : ITPRG03.10 Giới thiệu : Trong học này, nghiên cứu phương pháp lập trình mạng với chuẩn lập trình mạng dựa cơng cụ sẵn có C++ Buider Mục tiêu thực hiện: Học xong học viên có khả năng: Mơ tả số tính đặc biệt khác C++ Builder Áp dụng lập trình client/server mức độ đơn giản Áp dụng lập trình Internet mức độ đơn giản Áp dụng lập trình với socket mức độ đơn giản Nội dung chính: 10.1 Các tính đặc biệt khác C++ Builder Trong nội dung mục này, giới thiệu sơ lược số tính đặc biệt khác C++ Buider 295 - C++ Builder hỗ trợ đầy đủ hàm API, đó, người lập trình sử dụng chức tùy biến hệ điều hành hay tận dụng sức mạnh API để mang lại tính độc đáo cho chương trình cấp độ hệ điều hành - C++ Builder cung cấp công cụ lập trình song song tảng, nghĩa lập trình Windows với cơng cụ VCL có cơng cụ tương tự hỗ trợ cho hệ thống không Windows CLX - C++ Builder hỗ trợ công cụ cho chuyển ứng dụng từ Visual C++ sang Borland C++ Builder cách nhanh chóng với sửa đổi - C++ Builder công cụ gần không phụ thuộc tảng cài có mã nguồn VCL Do đó, mang lại điều kiện thuận lợi để công ty thứ phát triển công cụ mở rộng Đặc biệt C++ Builder chức lập trình mạng với mã lệnh mà hiệu đạt cao Chúng ta nghiên cứu thông qua đề mục 10.2 Lập trình mạng với Socket Socket hiểu ổ cắm nối máy chủ máy Mỗi ổ cắm quy định cổng (port) để mở kết nối Người lập trình sử dụng socket để kết nối phải tránh cổng quy định thành chuẩn cho mạng riêng biệt sau đây: Dịch vụ Số cổng Ftp 21 Http 80 Telnet 23 Finger 79 Sntp 25 Mơ hình lập trình mạng thông qua Socket thông qua hai đối tượng sau: Đối tượng TServerSocket: Dùng phục vụ cho máy chủ Sau thuộc tính kiện quan trọng: Thuộc tính Ý nghĩa Active Đặt server socket vào trạng thái hoạt động tạm dừng Port Số cổng mà server socket phục vụ Service Tên ứng dụng hay dịch (không bắt buộc) 296 Sự kiện Ý nghĩa OnAccept Chấp nhận kết nối từ máy hay không OnClientConnect Tiếp nhận kết nối từ client OnClientDisconnec t Ngắt kết nối với client OnClientRead Đọc liệu máy client gởi đến Đối tượng TClientSocket dùng để phục vụ cho máy Sau liệt kê thuộc tính kiện TClientSocket Thuộc tính Phương thức Active Yêu cầu ngắt kết nối với Server Address Địa máy chủ Port Cổng phục vụ máy chủ Service Tưởng tự máy chủ Host Địa IP Các kiện thông dụng Sự kiện Ý nghĩa OnConnect Kết nối thành công với máy chủ OnDisconnect Ngắt kết nối với máy chủ OnError Quá trình kết nối hay chuyển liệu bị lỗi OnRead Đọc liệu trả từ máy chủ Chúng ta nghiên cứu thông qua chương trình chat sau: 297 Hình 156-Chương trình chat đơn giản Mã lệnh liệt kê kèm theo thích sau: void fastcall TChatForm::FileListenItemClick(TObject *Sender) { FileListenItem->Checked = !FileListenItem->Checked; if (FileListenItem->Checked) { ClientSocket->Active = false; ServerSocket->Active = true; StatusBar1->Panels->Items[0]->Text = "Listening "; }else { if (ServerSocket->Active) { ServerSocket->Active = false; } StatusBar1->Panels->Items[0]->Text = ""; } } // // void fastcall TChatForm::FileConnectItemClick(TObject *Sender) { if (ClientSocket->Active) { ClientSocket->Active = false; } if (InputQuery("Computer to connect to", "Address Name:", Server)) { 298 if (Server.Length() > 0) { ClientSocket->Host = Server; ClientSocket->Active = true; FileListenItem->Checked = false; } } } // // void fastcall TChatForm::Exit1Click(TObject *Sender) { ServerSocket->Close(); ClientSocket->Close(); Close(); } // // void fastcall TChatForm::Memo1KeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if (Key == VK_RETURN) { if (IsServer){ServerSocket->Socket->Connections[0]->SendText( Memo1->Lines->Strings[Memo1->Lines->Count - 1]); } else { ClientSocket->Socket->SendText(Memo1->Lines->Strings[ Memo1->Lines->Count -1]);} } } // // void fastcall TChatForm::FormCreate(TObject *Sender) { FileListenItemClick(NULL); } // 299 // void fastcall TChatForm::ClientSocketConnect(TObject *Sender, TCustomWinSocket *Socket) { StatusBar1->Panels->Items[0]->Text = "Connect to: " + Socket->RemoteHost; } // // void fastcall TChatForm::Disconnect1Click(TObject *Sender) { ClientSocket->Active = false; ServerSocket->Active = true; StatusBar1->Panels->Items[0]->Text = "Listening "; } // // void fastcall TChatForm::ClientSocketRead(TObject *Sender, TCustomWinSocket *Socket) { Memo2->Lines->Add(Socket->ReceiveText()); } // // void fastcall TChatForm::ServerSocketClientRead(TObject *Sender, TCustomWinSocket *Socket) { Memo2->Lines->Add(Socket->ReceiveText()); } // // void fastcall TChatForm::ServerSocketAccept(TObject *Sender, TCustomWinSocket *Socket) { IsServer = true; StatusBar1->Panels->Items[0]->Text = "Connect to: " + Socket->RemoteAddress; } // 300 // void fastcall TChatForm::ServerSocketClientConnect(TObject *Sender, TCustomWinSocket *Socket) { Memo2->Lines->Clear(); } // // void fastcall TChatForm::ClientSocketDisconnect(TObject *Sender, TCustomWinSocket *Socket) { FileListenItemClick(NULL); } // // void fastcall TChatForm::ClientSocketError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) { Memo2->Lines->Add("Error connecting to:" + Server); ErrorCode = 0; } // // void fastcall TChatForm::ServerSocketClientDisconnect(TObject *Sender, TCustomWinSocket *Socket) { StatusBar1->Panels->Items[0]->Text = "Listening "; } 10.3 Thực hành Bài tập 1: Viết chương trình chuyển tập tin máy chủ máy Bài tập 2: Hãy sử dụng nguồn tài nguyên internet viết chương trình tạo trình duyệt Web đơn giản 301 THUẬT NGỮ CHUYÊN MÔN Templates: mẫu name spaces: không gian tên không gian tên VCL – Visual Component Library : viện thành phần trực quan component palette: bảng thành phần form: biểu mẫu events : kiện Button : nút nhấn IDE (Integrated Development Environment): môi trường phát triển tích hợp Popup menu : đơn đổ xuống package project : dự án gói Package Library : thư viện gói import library : thư viện nhập drop-down list : danh sách đổ xuống Repository : kho chứa Image Editor: trình soạn thảo ảnh TextEditor : nội dung hướng dẫn Runtime Type Information- RTTI: Runtime Type Information- RTTI Nonpersitent classes : Các lớp không liên tục Properity streaming : Thuộc tính dịng TwinControl: cửa sổ hố TgraphicControl : khơng cửa sổ hố Focus : điểm Screen : hình Hide: Ẩn đối tượng, giống gán thuộc tính Visible=false MouseDown: Phát sinh kiện OnMouseDown MouseMove: Phát sinh kiện OnMouseMove MouseUp: Phát sinh kiện OnMouseUp ParentToClient: Chuyển toạ độ từ đối tượng cha sang toạ độ đối tượng Perform: Phát sinh kiện định Refresh: Làm tươi lại đối tượng Repaint: Vẽ lại đối tượng Resize: Thay đổi kích cỡ đối tượng ScreenToClient: Chuyển toạ độ hình sang toạ độ đối tượng SendCancelMode: Huỷ bỏ trạng thái “modal” đối tượng SendToBack: Chuyển đối tượng nằm tất đối tượng khác SetBounds: Cài đặt đường biên cho đối tượng Checkbox : Ô đánh dấu TÀI LIỆU THAM KHẢO [1] Jarrod Hollingworth, Dan Butterfield, Bob Swart, Jamie Allsop C++ Builders Developer's Guide SAMS , CD [2] Kent Reisdorph, Ken Henderson Teach Yourself Borland C++Builder in 21 Days Borland Press/Sams,CD [3] Charlie Calvert Charlie Calvert's Borland C++Builder Unleashed Borland Press/Sams,CD [4] Jim Mischel, Jeff Duntemann, Al Williams Borland C++Builder Programming Explorer, The HandsOn Guide to Mastering the Power of Borland's Coriolis Group [5] Jason Vokes, Michael Sadler Borland C++Builder for Dummies IDG Books,CD [6] John Miano, Harold Howe, Tom Cabanski Borland C++Builder How-To Waite Group Press 302 ... BrushBmp->LoadFromFile("MyBitmap.bmp"); Form 1-> Canvas->Brush->Bitmap = BrushBmp; Form 1-> Canvas->FillRect(Rect(0,0,100,100)); } finally { 1 82 Form 1-> Canvas->Brush->Bitmap = NULL; delete BrushBmp; } -. .. random(Screen->Width - 10); y = random(Screen->Height - 10); Canvas->Pen->Color = (Graphics::TColor) random(65535); switch (random(5)) { case 0: Canvas->Pen->Style = psSolid; break; case 1: Canvas->Pen->Style... *Sender) { TCanvas *pCanvas = Image 1-> Canvas; pCanvas->Brush->Color = clRed; pCanvas->Brush->Style = bsDiagCross; pCanvas->Ellipse(0, 0, Image 1-> Width, Image 1-> Height); } - Trong ví dụ sau dùng Timer