Giáo trình Lập trình nâng cao - Nghề: Lập trình máy tính - Trình độ: Cao đẳng nghề

pdf 133 trang Gia Huy 17/05/2022 1840
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình nâng cao - Nghề: Lập trình máy tính - Trình độ: Cao đẳng nghề", để 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:

  • pdfgiao_trinh_lap_trinh_nang_cao_nghe_lap_trinh_may_tinh_trinh.pdf

Nội dung text: Giáo trình Lập trình nâng cao - Nghề: Lập trình máy tính - Trình độ: Cao đẳng nghề

  1. BỘ LAO ĐỘNG - THƯƠNG BINH VÀ XÃ HỘI TỔNG CỤC DẠY NGHỀ GIÁO TRÌNH Môn học: LẬP TRÌNH NÂNG CAO Mã số: ITPRRG03 NGHỀ: LẬP TRÌNH MÁY TÍNH Trình độ Cao đẳng nghề NĂM 2012
  2. Tuyên bố bản quyền : Tài liệu này thuộc loại sách giáo trình Cho nên các nguồn thông tin có thể được phép dùng nguyên bản hoặc trích dùng cho các mục đích về đào tạo và tham khảo . Mọi mục đích khác có ý đồ lệch lạc hoặc sử dụng với mục đích kinh doanh thiếu lành mạnh sẽ bị nghiêm cấm. Tổng Cục Dạy nghề sẽ làm mọi cách để bảo vệ bản quyền của mình. Tổng Cục Dạy Nghề cám ơn và hoan nghênh các thông tin giúp cho việc tu sửa và hoàn thiện tốt hơn tàI liệu này. Địa chỉ liên hệ: Dự án giáo dục kỹ thuật và nghề nghiệp Tiểu Ban Phát triển Chương trình Học liệu
  3. LỜI TỰA Để đáp ứng nhu cầu học tập của người học, chúng tôi đã tiến hành biên soạn giáo trình Lập trình nâng cao để làm tài liệu tham thảo cho người học và người nghiên cứu. Cuốn sách này được biên soạn dựa trên các tài liệu tiếng Anh của C++ Builder, đặc biệt là dựa trên tài liệu User Guide của Borland. Đồng thời lồng ghép những kinh nghiệm giảng dạy các môn lập trình của chúng tôi. Tài liệu này được biên soạn theo đề cương chi tiết môn học Lập trình nâng cao của Tổng cục dạy nghề với mã ITPRG03. Mục tiêu của nó nhằm giúp các bạn sinh viên chuyên ngành có một tài liệu cô đọng dùng làm tài liệu học tập, nhưng chúng tôi cũng không loại trừ toàn bộ các đối tượng khác tham khảo. Chúng tôi hi vọng người đọc sẽ tìm thấy được những kiến thức bổ ích trong tài liệu này. Mặc dù đã rất cố gắng nhiều trong quá trình biên soạn giáo trình nhưng chắc chắn giáo trình sẽ còn nhiều thiếu sót và hạn chế. Rất mong nhận được sự đóng góp ý kiến quý báu của của những người đọc và người học để giáo trình ngày một hoàn thiện hơn.
  4. MỤC LỤC ĐỀ MỤC TRANG BÀI 1 C++ BUILDER VÀ CÁC ƯU THẾ SO VỚI C++ 9 1.1 Lịch sử phát triển C++ Builder 9 1.2 Các tính năng tiên tiến 11 1.3 Ưu thế của C++ Builder so với Visual C++ 12 BÀI 2 GIỚI THIỆU VỀ C++ BUILDER 13 2.1 Giới thiệu C++ Builder 13 2.2 Môi trường phát triển tích hợp IDE và các công cụ đặc trưng 18 2.3 Xây dựng chương trình Text Editor 28 2.4. Thực hành 37 BÀI 3 TỔNG QUAN VỀ VCL 38 3.1 Giới thiệu VCL 38 3.2 Mô hình phân cấp VCL 39 3.3 Các thuộc tính, biến cố chung với TControl 40 3.4 Các thuộc tính, biến cố chung với TWinControl 44 3.5 Các đối tượng, thành phần chuẩn của VCL 47 3.6 Thực hành 80 BÀI 4 PHÁT TRIỂN GIAO DIỆN NGƯỜI DÙNG ỨNG DỤNG 82 4.1 Tổng quan về phát triển giao diện người dùng 82 4.2 Tạo và quản lý các form 84 4.3. Làm việc với thành phần 89 4.4 Xử lý đầu vào từ chuột 89 4.5 Làm việc với bàn phím 92 4.6 Tạo và quản lý các menu 96 4.7 Các đối tượng hành động 102 4.8 Thực hành 103 BÀI 5 LÀM VIỆC VỚI CÁC ĐIỀU KHIỂN 104 5.1 Thực hiện các hành động kéo và thả 104 5.2 Thực hiện các hành động rê và kết dính 116 5.3 Làm việc với văn bản trong các điều khiển 117 5.4 Thêm đồ hoạ vào điều khiển 119 5.5 Thực hành 121 BÀI 6 TƯƠNG TÁC GIỮA NGƯỜI DÙNG VỚI ỨNG DỤNG 122
  5. 6.1 Sử dụng các hộp thoại 122 6.2 Hộp thoại Windows dùng chung 133 6.3 Tạo và quản lý các hộp thoại 134 6.4. Sử dụng đa biểu mẫu 143 6.5 Thực hành 160 BÀI 7 ĐỒ HOẠ VÀ MULTIMEDIA 160 7.1 Tổng quan về lập trình đồ hoạ 160 7.2 Các thành phần đồ hoạ VCL 160 7.3 Sử dụng các thuộc tính và các phương thức của đối tượng Canvas 161 7.4. Tạo và quản lý các bức vẽ 164 7.5 Lập trình multimedia 196 7.6 Thực hành 216 BÀI 8 LIÊN KẾT CƠ SỞ DỮ LIỆU 217 8.1 Các kỹ thuật truy cập dữ liệu trong C++ Builder 218 8.2 Các thành phần truy cập cơ sở dữ liệu của C++ Builder 218 8.3. Các điều khiển nhận biết dữ liệu của C++ Builder 223 8.4 Các thành phần cơ sở dữ liệu cơ bản 224 8.5. Xây dựng chương trình Marine 226 8.6 Thực hành 227 BÀI 9 XÂY DỰNG VÀ TRIỄN KHAI CÁC ỨNG DỤNG 260 9.1 Các kỹ thuật gỡ rối trong C++ Builder 261 9.2 Sử dụng tài nguyên Windows để xây dựng trợ giúp trực tuyến 261 9.3 Sử dụng chương trình InstallShield Express 263 9.4 Thực hành 264 BÀI 10 MỘT SỐ TÍNH NĂNG ĐẶC BIỆT KHÁC 266 10.1 Các tính năng đặc biệt khác trong C++ Builder 266 10.2 Lập trình mạng với Socket 266 10.3 Thực hành 268 THUẬT NGỮ CHUYÊN MÔN 271 TÀI LIỆU THAM KHẢO 272
  6. GIỚI THIỆU VỀ MÔ ĐUN/MÔN HỌC Vị trí, ý nghĩa, vai trò môn học : Khi học lập trình căn bản, chúng ta đã lập trình và làm việc với ngôn ngữ C++ bằng công cụ Turbo C++. Trong môn học này, chúng ta sẽ phát triển ứng dụng cao cấp dành cho Windows bằng ngôn ngữ C++ với công cụ Borland C++ Builder. Do đó, để nghiên cứu tốt môn học này, chúng ta cần phải nắm vững ngôn ngữ lập trình C++ và một số khái niệm của Windows như ListBox, Button, Multimedia, Mục tiêu của môn học: Sau khi học xong môn học này học viên có khả năng: Nêu được tính năng tiên tiến và các ưu thế của các môi trường lập trình mới. Biết sử dụng các đối tượng thành phần và điều khiển trong các thư viện lập trình thông dụng. Biết thiết kế các giao diện người dùng ứng dụng,sử dụng các thao tác trên các điều khiển. Biết tạo các tương tác giữa người dùng với ứng dụng. Biết tạo và xử lý các đối tượng đồ hoạ, đưa âm thanh hay các video clip vào ứng dụng. Biết xây dựng các ứng dụng cơ sở dữ liệu đơn giản, biết tạo các chương trình ứng dụng đơn giản. Mục tiêu thực hiện của môn học: Học xong môn học này học viên có khả năng: Khái quát được quá trình phát triển phần mềm trên công cụ C++ Builder. Nêu các tính năng tiên tiến của C++ Builder. Nhận biết các ưu thế của C++ Builder so với Visual C++. Hiểu biết về môi trường lập trình Borland C++ Builder. Sử dụng IDE của C++ Builder để soạn thảo chương trình nguồn, biên dịch, liên kết và chạy kiểm tra các chương trình. Mô tả một số công cụ đặc trưng của C++ Builder. Hiểu cách xây dựng một ứng dụng Windows với C++ Builder. Hiểu biết về thư viện nền Visual Component library (VCL). Mô tả vắn tắt về mô hình phân cấp của thư viện VCL. Liệt kê các đối tượng, thành phần và điều khiển trong thư viện VCL. Sử dụng một số thành phần chuẩn của thư viện VCL. Tạo và quản lý các Form. Làm việc với các thành phần trên Form. Xử lý thông tin đầu vào từ chuột và bàn phím. Tạo và quản lý các menu, sử dụng menu designer. Sử dụng các hành động, tạo, đăng ký, viết các bộ soạn thảo danh sách hành động. Xử lý các hành động rê và thả, rê và liên kết với các đối tượng trên form. Sử dụng các văn bản trong điều khiển, sử dụng đối tượng clipboard. Thêm các đối tượng đồ hoạ vào các điều khiển. Sử dụng các hộp thoại. Phân biệt các hộp thoại modal và modeless. Sử dụng các thành phần hộp thoại Windows dùng chung. Tạo và quản lý các hộp thoại. Sử dụng đa biểu mẫu. Hiểu biết về các thành phần đồ hoạ thuộc thư viện VCL. Sử dụng các thuộc tính của đối tượng Canvas. Sử dụng các phương thức của Canvas để vẽ các đối tượng đồ hoạ. Tạo và quản lý các bức vẽ. Thêm âm thanh hay các video clip vào ứng dụng. Sử dụng các thành phần nhận biết dữ liệu, các thành phần truy cập dữ liệu và một số thành phần khác. Hiểu biết cách xây dựng một ứng dụng cơ sở dữ liệu. Cơ bản về tổ chức, quản lý và khai thác các cơ sở dữ liệu.
  7. Sử dụng một số kỹ thuật gỡ lỗi trong bộ công cụ C++ Builder. Sử dụng và khai thác các tài nguyên Windows. Hiểu biết cách xây dựng các trợ giúp trực tuyến. Sử dụng chương trình cài đặt InstallShield. Xây dựng một ứng dụng Windows đơn giản và hoàn chỉnh. Nắm bắt các tính năng đặc biệt của bộ công cụ C++ Builder. Áp dụng vào việc lập trình Client/Server, lập trình Internet, lập trình với Socket ở mức độ đơn giản.
  8. Sơ đồ quan hệ theo trình tự học nghề Hệ thống Giao diện Lập trình Lập trình máy tính người máy nâng cao Web Lập trình Phân tích thiết căn bản Lập trình hướng kế hệ thống đối tượng Mạng căn bản Thiết kế hướng đối Kỹ năng tin học Cấu trúc dữ liệu tượng và thuật giải văn phòng Kỹ năng Ứng dụng Giao tiếp CNTT trong doanh nghiệp Cơ sở dữ liệu Kỹ năng Công nghệ Internet & WWW phần mềm Cơ sở toán học Thiết kế Web Công nghệ Đa Quản lý dự án phương tiện phần mềm Hệ cơ sở dữ Hướng dẫn đồ Lập trình liệu Visual Basic án tốt nghiệp Anh văn Phần cứng An toàn Thi cho tin học máy tính lao động tốt nghiệp
  9. CÁC HÌNH THỨC HỌC TẬP TRONG MÔ ĐUN 1. Học tại phòng lý thuyết - Trình bày đầy đủ các đối tượng và phương pháp triển khai các bài tập của từng bài học. - Phân tích và thiết kế các phép toán hợp lý bằng mô hình. - Học sinh phải tập trung hết sức và phải tận dụng thời gian giải lao để giải lao thật tốt. - Học sinh luôn rèn luyện khả năng tư duy logic để phân tích, tổng hợp các vấn đề cần giải quyết. Không ngừng học hỏi các kiến thức về ngôn ngữ lập trình. Luôn chú ý rèn luyện các thao tác chính xác, cẩn thận khi lập trình. 2. Học tại phòng thực hành - Cài đặt các bài tập. - Phân tích các bài toán thật kỹ lưỡng và cài đặt nhiều lần các bài tập. - Học viên phải tập trung hết sức và phải tận dụng thời gian giải lao để giải lao thật tốt. YÊU CẦU VỀ ĐÁNH GIÁ HOÀN THÀNH MÔ ĐUN/MÔN HỌC Đánh giá thông qua kiểm tra trắc nghiệm: Kiểm tra trắc nghiệm được thực hiện trên máy tính và chấm cho kết quả ngay Xây dựng ngân hàng các câu hỏi. Học viên sẽ nhận được ngẫu nhiên các câu hỏi trắc nghiệm 100 câu (mỗi chức năng 20 câu), Thời gian kiểm tra hạn chế trong 60 phút. Thang điểm: 0-49 : Không đạt 50-69 : Đạt trung bình 70-85 : Đạt khá 86-100 : Đạt Giỏi Đánh giá thông qua các tiểu đề tài : Các tiểu đề tài được các nhóm học viên chuẩn bị và thực hiện trên máy tính có thể chấm và cho kết quả ngay. Xây dựng một bộ các tiểu đề tài. Học viên sẽ được nhận ngẫu nhiên các tiểu đề tài theo nhóm. Có thời gian chuẩn bị trước. Nội dung chính của môn học : 9
  10. BÀI 1 C++ BUILDER VÀ CÁC ƯU THẾ SO VỚI C++ Mã bài : ITPRG03.1 Giới thiệu : Trong nội dung môn học này, chúng ta sẽ quan sát sơ lược về lịch sử phát triển của C++ Builder, các tính năng tiên tiến của C++ Builder, so sánh giữa C++ Builder với Visual C++. Bài học này mang lại một tầm nhìn tổng quan về ưu thế của C++ Builder cho chúng ta. Mục tiêu thực hiện: Học xong bài này học viên sẽ có khả năng: Khái quát lịch sử phát triển C++ Builder Liệt kê một số tính năng tiên tiến của C++ Builder. Liệt kê các ưu thế của C++ Builder so với Visual C++. Nội dung chính: 1.1 Lịch sử phát triển C++ Builder C++ Builder originally targeted only the Microsoft Windows platform. Later versions incorporated Borland CLX, a cross-platform development visual component library based on Qt, that supports Windows and Linux. Sau một số năm, Borland ấn bản phiên bản Borland C++ Builder 2006, cung cấp chức năng quản lý mạnh và sửa các lỗi. C++ Builder 2006 là một phần của Borland Developer Studio, một gói chứa Delphi, C++ Builder và C# Builder. Borland cũng làm sống lại nhánh “Turbo” và ấn bản hai phiên bản “Turbo” của C++ Builder: Turbo C++ Professional và Turbo C++ Explorer (miễn phí): Tên sản phẩm Mã Ngày ấn bản ?Delphi 2008? - ?CF? Highlander ? Delphi for PHP - PHP a-la Delphi Astro 2007, Mar 27 Delphi 2007 for Windows Vista and Spacely 2007, Mar 19 AJAX Chrome 1.5.5 by RemObjects (VS 2006, Oct 27 2005, .Net 2.0) Free Pascal 2.0.4 2006, Aug 28 Borland Developer Studio 2006 - Delphi (W32 and .Net), C++ and C# DeXter 2005, Oct 10 under one IDE 10
  11. Chrome - Object Pascal in VS by 2005, May 1 RemObjects Free Pascal 2.0 2005, May Borland Delphi 2005 - C# and Delphi Diamondba 2004, Oct 12 under one IDE ck Borland Delphi 8 for .Net Octane 2003, Dec 22 Borland C++BuilderX Tomahawk 2003, Aug 28 Sidewinder Borland C#Builder 1.0 (Galileo IDE 2003, Jun 16 1.0) Borland Delphi.NET compiler Morpheus Borland Delphi 7 Aurora 2002, Aug 9 Borland C++ Builder 6.0 Riptide 2002, Feb 1 Borland Delphi 6 Illiad 2001, May 21 Free Pascal 1.0 2000, Jul Borland C++ Builder 5.0 Rampage 2000, Jan 30 Borland Delphi 5 Argus 1999, Aug 10 Borland C++ Builder 4.0 1999, Jan 26 Borland Delphi 4 Allegro 1998, Jun 17 Borland C++ Builder 3.0 1998, Feb 8 Borland Delphi 3 Ivory 1997, Aug 5 Borland C++ 5.0 1997, Mar 25 Borland C++ Builder 1.0 1997, Feb 4 Borland Delphi 2 Polaris 1996, Feb 10 Borland C++ 4.5 1995, Aug 29 Turbo C++ for Windows 4.5 1995, Apr 28 Delphi95, Wasabi, Borland Delphi 1 1995, Feb 14 Mango, AppBuilder 11
  12. Borland C++ 4.0 1993, Dec 15 Delphi project hatched mid 1993 Free Pascal (project born) 1993, Jun Borland Pascal 7 1992, Oct 27 Borland C++ 3.1 1992, Jun 10 Turbo Pascal for Windows 1.5 1992, Jun 8 Turbo C++ for DOS 3.0 1992, Feb 18 Borland C++ 3.0 1991, Nov 11 Turbo C++ for Windows 3.0 1991, Nov 11 Turbo Pascal for Windows 1.0 1991, Feb 13 Borland C++ 2.0 1991, Feb 13 Turbo Pascal 6.0 1990, Oct 23 Turbo C++ for DOS 1.0 1990, May 4 Turbo C for DOS 2.0 1989, May 11 Turbo Pascal 5.5 1989, May 2 Turbo C for DOS 1.5 1988, Dec 10 Turbo Pascal 5 1988, Aug 24 Turbo C for DOS 1.0 1987, May 13 Turbo Pascal 4 1987, Nov 20 Turbo Pascal 3 1986, Sept 17 Turbo Pascal 2 1984, Apr 17 Turbo Pascal 1 (Compass Pascal 3.0) 1983, Nov 20 Pascal as Modula 1977 Pascal - first book by Wirth and Jensen 1975 Pascal implemented 1973 Pascal defined by Prof. Niklaus Wirth 1971 1.2 Các tính năng tiên tiến 12
  13. Tính năng tiên tiến nhất của C++ Builder là hỗ trợ kiểu dữ liệu AnsiString thay thế cho kiểu dữ liệu chuỗi char truyền thống. Nói tạm biệt với char* cho công việc điều tác chuỗi. Chúng ta chuyển sang sử dụng lớp AnsiString để điều tác chuỗi. Một sự minh họa cho sự chuyển đổi sử dụng cho chuỗi ở dưới đây: int __cdecl printf(const char* format, ); int __cdecl cat_printf(const char* format, ); AnsiString& __cdecl sprintf(const char* format, ); AnsiString& __cdecl cat_sprintf(const char* format, ); Phiên bản này còn cung cấp một loạt các phương thức để làm việc chuỗi một cách linh hoạt mang lại phong cách lập trình mới đối với chuỗi. C++ Builder cung cấp thêm kiểu dữ liệu tập hợp, đây là một kiểu dữ liệu mới tương thích với kiểu dữ liệu tập hợp của Pascal. Các giá trị được thêm vào kiểu tập hợp qua phép toán >. Ví dụ, để thêm hai phần tử có giá trị bằng mbNoToAll và mbNo vào kiểu tập hợp TMsgDlgButtons(), chúng ta sử dụng lệnh TMsgDlgButtons() Name. Các đối tượng trong C++ Builder phải được khởi tạo bởi từ khóa new và xóa bằng việc sử dụng từ khóa delete. Ví dụ: TButton *Button1; và lệnh khởi tạo: Button1 = new TButton(this); sau khi sử dụng xong Button1, chúng ta sẽ hủy bỏ đối tượng này bằng lệnh: delete Button1; Ngoài ra, C++ Builder còn cung cấp một bộ biên dịch để tạo ra các chương trình thực thi với dung lượng thấp nhất và tốc độ chạy nhanh nhất. 1.3 Ưu thế của C++ Builder so với Visual C++ C++ Builder có nhiều ưu thế hơn so với Visual C++, sau đây chúng tôi liệt kê một số tính năng ưu việt: - C++ Builder là công cụ phát triển phần mềm nhanh, cung cấp các thành phần trực quan được gói gọn mà tránh gọi các lệnh WinAPI như visual C++. Tuy nhiên, C++ Builder vẫn hỗ trợ cho người lập trình khả năng gọi các hàm WinAPI. - C++ Builder lập trình với giao diện đơn giản và trình sinh mã tự động mang lại hiệu quả cao mà không cần phải viết các đoạn lệnh để tạo cửa sổ từ đầu như Visual C++. - C++ Builder có thể gói chương trình và các thành phần liên quan vào một tập tin duy nhất trong khi Visual C++ phải phụ thuộc vào MFCxx.DLL và các tập tin .DLL khác. 13
  14. - C++ Builder cho phép chúng ta lập trình trên nền tảng chéo trong khi Visual C++ chỉ lập trình trên Windows. - C++ Builder sử dụng các thành phần VCL trong khi visual C++ sử dụng MFC. Thành phần VCL được bao gồm vào bộ cài đặt C++ Builder giúp người lập trình có thể tùy biến theo ý mình thích. - C++ Builder cho phép phát triển các phần mềm trên nền tảng chéo (Linux và Windows) trong khi Visual C++ chỉ cho phép phát triển trên nền Windows. - Visual C++ kết nối với cơ sở dữ liệu chỉ sử dụng công nghệ dựa trên nền tảng ADO trong khi C++ Builder còn có thể kết nối cơ sở dữ liệu có thể sử dụng BDE và SQL Links. BÀI 2 GIỚI THIỆU VỀ C++ BUILDER Mã bài : ITPRG03.2 Giới thiệu : Trong bài học này học viên sẽ làm quen với các khái niệm mà C++ Builder đưa ra, các công cụ của C++ Builder cũng như có thể hiểu được môi trường làm việc của Borland C++ Builder 6.0. Bài học này càng cung cấp cho chúng ta các thuật ngữ mới, các phương pháp làm việc cũng như quy tắc lưu trữ của C++ Builder. Để nghiên cứu thành công nội dung bài học, chúng ta phải cố gắng quan sát và ghi chép những điều cần thiết của các công cụ trong môi trường cũng như những thuật ngữ mới. Mục tiêu thực hiện: Học xong bài này học viên sẽ có khả năng: Mô tả các thành phần chính của C++ Builder Mô tả một số công cụ đặc trưng của C++ Builder. Mô tả các bước để xây dựng một chương trình Windows với C++ Builder. Nội dung chính: 2.1 Giới thiệu C++ Builder. Borland C++ Builderlà một trong những bộ biên dịch đầu tiên cho phép bạn sử dụng các đối tượng được gọi là những thành phần bằng cách sử dụng chuột và di chuyển xung quanh để thay đổi thiết kế trực quan của chương trình hơn là sử dụng các đoạn mã lệnh để thực hiện điều này. Cốt lõi của kỹ thuật này là lập trình thành phần, các thành phần có thể chạy với một tốc độ rất nhanh, thậm chí một đối tượng có thể hiện ra và ẩn đi mà mắt chúng ta chưa kịp nhìn thấy và nhấn chuột lên nó. Lập trình với Borland C++ Builder dễ đến mức bất ngờ. C++ Builder tạo thêm sự sôi nổi cho ngôn ngữ lập trình C++. Đây là một công cụ tốt để chúng ta phát triển nhanh các chương trình một cách dễ dàng và tạo được các chương trình mạnh. C++ Builder cho phép sử dụng đầy đủ các thành phần cao cấp của C++, bao gồm mẫu (templates), không gian tên (name spaces), phép toán nạp chồng và toàn bộ hàm Windows API, kể cả các hàm dùng cho DirectX, OLE và ActiveX. Ngôn ngữ C++ vẫn là cốt lõi của C++ Builder. C++ Builder đưa ra một cấp độ cao hơn để hỗ trợ ngôn ngữ C++. Borland C++ Builder tích hợp thư viện các thành 14
  15. phần trực quan (Visual Component Library) vào để dùng cho ngôn ngữ C++. Vấn đề nằm ở chỗ C++ Builder sử dụng ngôn ngữ Pascal, trong khi đó C++ Builder lại sử dụng ngôn ngữ C++. Tuy nhiên, dựa trên sự phê chuẩn của ANSI, Borland đã thêm các thành phần để hỗ trợ cho C++. Trong ngôn ngữ lập trình hướng đối tượng, các biến thành viên dùng để lưu trữ các giá trị hoặc trạng thái của đối tượng trong suốt thời gian sống của nó. Tuy nhiên, những biến lại được truy cập trực tiếp, do đó, có thể một phần nào đó của chương trình sẽ làm gãy chương trình vì đã đưa vào các giá trị không phù hợp. Để giải quyết vấn đề trên, rất nhiều nhà phát triển ứng dụng hướng đối tượng tạo ra các hàm thành viên gọi là hàm lấy giá trị và cài đặt giá trị nhằm mục đích không cho phép truy cập trực tiếp các biến thành viên đồng thời cũng tạo ra các truy bắt ngoại lệ nhằm áp đặt giá trị luôn luôn phù hợp với biến lưu trữ. Phương pháp này còn cho phép lập trình viên có thể ẩn được các dạng biến dùng để lưu trữ dữ liệu chẳng hạn như tập tin, cơ sở dữ liệu, hoặc một kiểu dữ liệu phức hợp. Borland tạo ra ngôn ngữ C++ Builder đã cung cấp thuộc tính nhằm thống nhất hai hàm thành viên lấy giá trị và cài đặt giá trị thành một thành viên trong lớp. Trong lớp của C++ Buider, một thuộc tính thường gồm một biến khai báo với bổ từ private và một hàm dùng để lấy giá trị và cài đặt giá trị được khai báo với bổ từ protected, một khai báo thuộc tính với bổ từ public. Sau đây là một minh họa: class aClassWithAProperty //khai báo lớp aClassWithAProperty { private: int myMemberVariable; //biến thành viên protected: int __fastcall GetMemberVariable(void) //hàm lấy giá trị { return myMemberVariable; }; void __fastcall SetMemberVariable(int theMemberVariable) //hàm cài đặt giá trị { myMemberVariable = theMemberVariable; }; public: __property int MemberVariable = //thuộc tính { read=GetMemberVariable, write=SetMemberVariable }; Khi đó, chúng ta có thể sử dụng cài đặt của lớp để truy cập thuộc tính MemberVariable như sau: 15
  16. AClassWithAProperty ClassWithAProperty; ClassWithAProperty.MemberVariable = 2; int Something = ClassWithAProperty.MemberVariable; Các thuộc tính được sử dụng rất nhiều trong các thành phần C++ Builder. Để trợ giúp cho môi trường trực quan được cung cấp bởi C++ Buidler, Borland đã tạo ra một phần đặc biệt cho lớp, được định nghĩa bởi __published tương tự như hai phần public và private ở ví dụ trên. Nếu một thuộc tính được đặt trong phần __published, nó sẽ được nhìn thấy trong cửa sổ điều chỉnh thuộc tính trong quá trình thiết kế. Sau đây là minh họa về thuộc tính được đặt trong phần published: class aClassWithAProperty: public TComponent { private: int myMemberVariable; protected: int __fastcall GetMemberVariable(void) { return myMemberVariable; }; void __fastcall SetMemberVariable(int theMemberVariable) { myMemberVariable = theMemberVariable; }; __published: __property int MemberVariable = { read=GetMemberVariable, write=SetMemberVariable }; }; Khi đó thuộc tính MemberVariable có thể được điều chỉnh trực tiếp trong cửa sổ điều chỉnh thuộc tính của Borland C++ Builder (Object inspector). Như đã nói ở trên, C++ Builder thưa hưởng rất nhiều đặc tính của C++ Builder. C++ Builder cung cấp một thuộc tính mặc định. Với thuộc tính này, chúng ta có thể truy cập bằng cách dùng phép toán chỉ số. Chúng ta có thể truy cập thuộc tính mặc định này như sau: (*StringListVariable)[Index] hoàn toàn tương thích với cách truy cập sau vì Strings là thuộc tính mặc định: StringListVariable->Strings[Index] 16
  17. Ngôn ngữ C++ Builder giới thiệu một thành phần cho phép truy bắt ngoại lệ được chấp nhận bởi Java. Trong C++ Builder, chúng ta dùng __finally và try để truy bắt các ngoại lệ. Ví dụ: TStringList *List = new TStringList; try { // thực hiện các câu lệnh } __finally { delete List; Đoạn lệnh đặt trong __finally sẽ thực hiện khi các câu lệnh trong try đã được thực hiện xong hay có một ngoại lệ xảy ra. Khi viết chương trình bằng Borland C++ Builder, chúng ta dùng thư viện thành phần trực quan (VCL – Visual Component Library). VCL là nguồn gốc cho các thành phần được sử dụng để tạo các ứng dụng C++ Builder (các thành phần tương tự VCL dùng đê phát triển đa nền tảng gọi là CLX). Một thành phần là một đối tượng, thường trực quan, chẳng hạn một hộp đánh dấu (checkbox), một danh sách chọn ổ đĩa, hoặc một hình ảnh. Các thành phần cũng có thể không trực quan, chẳng hạn như các kết nối cơ sở dữ liệu hoặc các kết nối mạng. Các thành phần có thể được chọn từ bảng thành phần (component palette) của IDE bằng dùng chuột trái để chọn và đặt chúng lên vùng làm việc. Hình 1 – IDE của Borland C++ Builder Chúng ta cũng có thể thêm hoặc viết thêm cái thành phần của chúng ta, VCL thực sự đã giảm bớt mức độ khó cho quá trình làm việc của chúng ta. Tất cả các thành phần đều có các thuộc tính, chúng ta có thể điều chỉnh bằng cửa sổ object inspector (xem hình 1) 17
  18. Khi chúng ta tạo một ứng dụng mới trong C++ Builder, một biểu mẫu (form) trống sẽ được tạo một cách tự động. Để xây dựng giao diện ứng dụng của chúng ta, một cách đơn giản là thêm các đối tượng trực quan vào biểu mẫu, sau đó điều chỉnh vị trí và kích thước cho phù hợp. Chúng ta cũng có thể thêm các thành phần không trực quan vào một biểu mẫu, chẳng hạn như các timer; những thành phần này sẽ hiển thị một biểu tượng trong quá trình thiết kế nhưng sẽ không nhìn thấy khi chương trình được thực thi. Chúng ta cũng có thể tạo các biểu mẫu đặc biệt như tool window hoặc dialog. Một chương trình có thể có nhiều biểu mẫu nhưng chỉ có một biểu mẫu làm biểu mẫu chính (main form). Mặc định, khi người sử dụng chạy chương trình của chúng ta, biểu mẫu chính sẽ hiển thị lên màn hình, các biểu mẫu sẽ hiển thị đúng vị trí mà chúng ta đã thiết kế trên màn hình IDE, vị trí này có thể được điều chỉnh lại bởi Object Inspector. Để đưa các thành phần vào biểu mẫu, chúng ta phải sử dụng các thành phần trong bảng thành phần. Bảng thành phần (Component Palette) nằm ở dưới menu chính, chứa tất cả các thành phần trong VCL. Các thành phần này được nhóm thành từng nhóm theo tên chủ đề trên các ngăn (tab) trên các thành phần. Để lựa chọn một thành phần, nhấn chuột trái lên nó, sau đó nhấn lại một lần nữa lên biểu mẫu để đặt đối tượng vào vị trí mà chúng ta muốn. Như đã đề cập ở trên, chúng ta có thể điều chỉnh các thuộc tính của thành phần bằng Object Inspector. Chúng ta cũng có thể điều chỉnh lại các thành phần trực quan bằng cách rê cạnh biên để điều chỉnh kích thước của nó, hoặc có thể rê nó đến vị trí mới. Để đối tượng có thể tương tác được với người sử dụng, chúng ta phải viết mã lệnh để thực thi nhằm đáp ứng các sự kiện (events) do người dùng phát sinh hay do hệ điều hành phát sinh. Các mã lệnh để đáp ứng một sự kiện nào đó gọi là giải quyết sự kiện. Một ví dụ đầu tiên về việc sử dụng sự kiện trong C++ Builder, chúng ta hãy đưa một nút nhấn (Button) đơn giản vào giữa màn hình như sau: Hình 2-Nút nhấn Button1 nằm giữa biểu mẫu C++ Builder đã tạo một nút nhấn như một phần của chương trình. Tại thời điểm này, nút nhấn này vẫn chưa thể thực hiện được gì, nghĩa là nếu chương trình được biên dịch và thực thi thì sẽ không có kết quả gì khi chúng ta nhấn chuột vào nút trên. Chúng ta có thể dùng các đoạn mã lệnh để đáp ứng sự kiện nhằm thực hiện một vài hành động như: lưu thông tin người sử dụng nhập vào, hiển thị một hộp thoại thông báo, hoặc bất cứ việc gì có thể. 18
  19. Khi nút nhấn được nhấn chuột tại thời điểm thực thi, một sự kiện được phát sinh. Ứng dụng của chúng ta phải có đoạn mã lệnh để xử lý, đoạn mã lệnh này sẽ tự động thực hiện mỗi khi sự kiện tương ứng được phát sinh. Để giải quyết vấn đề này, C++ Builder đã tạo ra sự kiện OnClick để viết các mã lệnh nhằm thực thi khi sự kiện nhấn chuột được phát sinh. Để viết lệnh cho sự kiện này, trong cửa sổ Object Inspector, chúng ta chọn ngăn Events, chọn tên sự kiện OnClick, nhấn đôi chuột trái lên nó hoặc đơn giản hơn, chúng ta có thể nhấn đôi chuột lên đối tượng Button1 trên biểu mẫu. Khi đó, cửa sổ soạn thảo mã lệnh (Source code editor Window) sẽ xuất hiện với văn bản như sau: Cấu trúc của sự kiện OnClick như sau: void __fastcall TForm1::Button1Click(TObject *Sender) { } Nếu chúng ta nhấn chuột phải trong cửa sổ soạn thảo mã lệnh và chọn Open Source/Header File, chúng ta sẽ nhìn thấy được đoạn mã lệnh sau: // #ifndef Unit1 #define Unit1 // #include #include #include #include // class TForm1 : public TForm { __published: // IDE-managed Components TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; // extern PACKAGE TForm1 *Form1; // #endif Đoạn mã lệnh trên được sinh ra một cách tự động bởi C++ Buider. Tôi đưa vào đây để chúng ta có thể nhìn thấy những gì mà C++ Builder có thể làm cho chúng ta một cách tự động. 19
  20. Bây giờ, chúng ta sẽ thêm một đoạn mã lệnh để hiển thị một hộp thoại thông báo khi người sử dụng nhấn chuột lên nút nhấn trên. Trong cửa sổ soạn thảo mã lệnh, chúng ta nhấn vào ngăn Unit1.cpp để chuyển về vị trí viết mã lệnh cho sự kiện của Button. Thêm đoạn mã lệnh vào để có được đoạn mã lệnh sau: void __fastcall TForm1::Button1Click(TObject *Sender) { ShowMessage("Hello world! This is a test application! Press OK"); Close(); } Khi chương trình thực thi, người sử dụng nhấn chuột vào nút nhấn và sự kiện được phát sinh, đoạn mã lệnh trên sẽ được thực thi và hiển thị lên màn hình một thông báo. Khi người sử dụng đóng thông báo này lại, chương trình sẽ được dừng bởi câu lệnh Close(). 2.2 Môi trường phát triển tích hợp IDE và các công cụ đặc trưng Khi chúng ta khởi động C++ Builder, chúng ta được đặt trong một môi trường phát triển tích hợp gọi là IDE (Integrated Development Environment). IDE cung cấp cho chúng ta tất cả các công cụ cần thiết để thiết kế, phát triển, kiểm tra, gỡ rối (debug) và triển khai các ứng dụng, cho phép phát triển các ứng dụng với thời gian phát triển nhanh hơn. IDE gồm các công cụ sau: * Cửa sổ chính và các công cụ Cửa sổ chính của IDE khít với phần trên của màn hình. Nó chứa các công cụ khác nhau, bao gồm hệ thống thực đơn (menu bar), tất cả chúng có thể được di chuyển. Chúng ta có thể thêm hoặc loại bỏ các nút nhấn bằng cách sử dụng chức năng Customize từ thực đơn đổ xuống (Popup menu) trên bất kỳ thanh công cụ nào. Chúng ta cũng có thể kéo và thả (drag and drop) bất kỳ lệnh nào được liệt kê trong hộp thoại ngăn Commands của hộp thoại Customize vào bất kỳ thanh công cụ nào. Chúng ta chỉ có thể sử dụng những công cụ đã có mà không được tạo ra bất kỳ công cụ nào cũng như xóa chúng đi. Sử dụng cách tương tự như trên để loại bỏ các nút nhấn bằng cách chọn chức năng customize và kéo nút nhấn ra khỏi thanh công cụ đang giữ nó. * Project Manager Project Manager không hiển thị một cách mặc định nhưng nó thường rất quan trọng. Để hiển thị cửa sổ này (dĩ nhiên trong trường hợp nó chưa hiển thị), chúng ta chọn nó từ thực đơn View. Project Manager cho phép chúng ta quản lý dự án (project) đang làm việc. 20
  21. Hình 3- Cửa sổ Project Manager Như hình minh họa trên, cửa sổ project manager hiển thị các tập tin trong dự án đang làm việc. Chúng ta có thể sắp xếp lại thứ tự biên dịch của những file này trong cửa sổ Project Manager và thực hiện nhiều thao tác khác nhờ thực đơn đổ xuống cho từng tập tin hoặc cho cả dự án. Understanding C++Builder Projects IDE cung cấp hai con đường để phát triển bằng cách kết hợp cửa sổ thiết kế biểu mẫu và cửa sổ mã lệnh. Project Manager được dùng chủ yếu cho quản lý các tập tin trong dự án của C++ Buider. Các dự án của C++ Builder bao gồm rất nhiều kiểu tập tin khác nhau. C++ Builder tạo một vài tập tin một cách tự động; khi một dự án mới được khởi tạo hay khi một thành phần (như tập tin, hình ảnh ngoài, ) được thêm vào dự án hiện có. Các tập tin trong dự án mà chúng ta cần quan tâm có thể chia ra thành các chủ đề như sau: Các tập tin chính của dự án: Khi chúng ta tạo một dự án mới, ba tập tin sau đây được tạo: - Tập tin dự án: ProjectName .bpr - Tập tin mã nguồn: ProjectName .cpp - Tập tin tài nguyên (resource): ProjectName .res Các tập tin biểu mẫu: Khi chúng ta tạo một biểu mẫu, C++ Builder sẽ sinh ra các tập tin sau: - Tập tin bố cục (layout): Unitname.dfm - Tập tin mã nguồn: UnitName.cpp - Tập tin tiêu đề (header - một tập tin chứa các khai báo hàm, lớp, ): UnitName.h Các tập tin gói: Các gói đơn giản là các thư viện liên kết động được chia sẻ cho nhiều ứng dụng C++ Builder. Nó cho phép chúng ta chia sẻ các lớp, các thành phần và dữ liệu giữa các ứng dụng. Ví dụ, các đối tượng thường dùng trong C++ Builder cư trú trong một gói gọi là VCL. Hầu hết các ứng dụng được tạo bằng C++ Builder đều chia sẻ các đoạn mã lệnh trong gói này, gói này có tên VCL60.bpl. Khi chúng ta tạo ra các thành phần riêng hoặc thư viện của riêng chúng ta, chúng ta phải tạo chúng trong một dự án gói (package project). Dự án gói chứa một tập 21
  22. tin .bpk giống như tập tin .bpr nhưng nó chỉ dùng cho dự án gói. Tập tin này được tạo ra khi chúng ta chọn thực đơn File/New/Package. Dự án gói sau khi được biên dịch sẽ trở thành thư viện gói (Package Library), chúng sẽ có phần mở rộng .bpl. Đây là thư viện thực thi (nghĩa là không chứa mã lệnh, chỉ chứa mã nhị phân) được sinh ra cho gói. Nó giống như thư viện DLL, ngoại trừ chúng chứa các thành phần được chỉ định trong C++ Builder khi chúng ta thiết kế nó. Mỗi một lần chúng ta biên dịch một gói, một tập tin có phần mở rộng .bpi sẽ được tạo ra, tập tin này gọi là thư viện nhập khẩu (import library). Chúng ta sẽ bàn kỹ hơn về vấn đề này trong một chương khác. The IDE can be set to save the layout automatically when you close the project. From the menu, select Tools, Environment Options. This will take you to the Environment Options dialog. Select the Preferences tab and check AutoSave Options, Project Desktop. Các tập tin sao lưu để dự trữ: C++ Builder sẽ tiến hành sao lưu các tập tin trong dự án mỗi lần dự án được lưu lại, dĩ nhiên, ngoại trừ lần lưu đầu tiên. Các tập tin này có tiếp đầu ngữ ~ cho phần mở rộng của nó. * Sắp xếp cửa sổ trong IDE Các cửa sổ trong môi trường IDE có thể neo lại với nhau. Chức năng này cho phép chúng ta tùy biến bố cục (layout) giao diện theo nhu cầu của chúng ta. Thao tác điều chỉnh thật hết sức đơn giản bằng cách kéo và thả các cửa sổ. Chẳng hạn, trong hình minh họa sau, cửa sổ Object Tree View được neo vào góc dưới của cửa sổ Object Inspector theo các hình minh họa sau: Hình 4 - Hai cửa sổ chưa được neo 22
  23. Hình 5 - Đang neo cửa sổ Hình 6 - Đã neo xong cửa sổ * Object Inspector 23
  24. Hình 7-Cửa sổ Object Inspector Cửa sổ Object Inspector hiển thị các thuộc tính cho đối tượng hay biểu mẫu đang được chọn. Chúng ta cũng có thể lựa chọn các thành phần từ danh sách đổ xuống (drop-down list) ở trên cùng của cửa sổ Object inspector. Hình minh họa cho thấy Object Inspector đang hiển thị các thuộc tính của thành phần TclientDataSet , tuy nhiên các thuộc tính có thể sẽ không giống nhau cho mỗi thành phần. Chúng ta có thể nhấn nút cộng (+) để xem thêm các thuộc tính khác nằm trong một thuộc tính. Object inspector dùng màu sắc để hiển thị bản chất của thuộc tính. Những thuộc tính có tên màu đỏ chỉ rằng nó tham chiếu đến những thành phần khác. Màu xanh lá cây (green) chỉ định thuộc tính này được mang sang từ những đối tượng được tham chiếu bởi thuộc tính này nhằm tiện nghi trong việc sửa chữa các thuộc tính của thành phần đang tham chiếu. * Object Tree View Object Tree View là một bổ trợ quan trọng cho Object Inspector. Trong trường hợp các đối tượng có hơn mười hay nhiều hơn, Object Inspector sẽ hiển thị không phù hợp. Trong khi đó, cửa sổ Object Tree View hiển thị với quan hệ cha con và có thể cuộn lên xuống. Dĩ nhiên, nếu trường hợp các đối tượng con quá nhiều, chúng ta vẫn không thể nhìn thấy phần tử cha của nó (đã bị cuộn lên trên), do đó, vẫn khó khăn khi click chuột lên đối tượng cha. 24
  25. Hình 8-Cửa sổ Object TreeView Chúng ta có thể sử dụng Object TreeView để điều chỉnh các đối tượng, chẳng hạn như tạo bảng sao. * Cửa sổ soạn thảo mã lệnh Cửa sổ soạn thảo mã lệnh đươc minh họa như hình sau: Hình 9-Cửa sổ soạn thảo mã lệnh Cửa sổ được chia thành nhiều ngăn, mỗi ngăn chứa một tập tin được mở. Nó cho phép mở và chỉnh sửa nhiều loại tập tin tin khác nhau như các tập tin của C++, các tập tin của C++ Builder, tập tin văn bản, * Ngăn Diagram Ngăn này cho phép chúng ta điều chỉnh sơ đồ đang hiện có giữa các đối tượng. 25
  26. Hình 10-Diagram Ngăn này cho phép chúng ta thiết kế lưu đồ quan hệ cho các đối tượng trên biểu mẫu và các đối tượng trong chương trình. * Code Insight Code Insight là một thành phần quan trọng của IDE. Thật khó khăn cho các nhà phát triển khi phải nhớ rất nhiều các hàm, các phương thức và cả tham số của chúng nữa. Code Insight cho phép chúng ta xem tất cả những phương pháp và tham số ngay khi chúng ta nhập mã lệnh trong cửa sổ soạn thảo mã lệnh. Hình sau cho thấy Code Insight cho thấy một tập hợp các phương thức hiện có của đối tượng này. s Hình 11-Code insight Các phương thức có thể trùng tên nhưng danh sách tham số khác nhau. Trong trường hợp này chúng ta sẽ gặp màn hình tương tự như phương thức PaintTo dưới đây. Hình 12 - PaintTo() được nạp chồng 26
  27. Khi một biểu mẫu được lưu lại, C++ Builder sẽ lưu thiết kế của Form dưới dạng văn bản trong tập tin DFM. Ví dụ: object Form1: TForm1 Left = 192 Top = 107 Width = 311 Height = 158 Caption = 'Text Form' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Label1: TLabel Left = 13 Top = 24 Width = 277 Height = 20 Caption = 'This form is saved as text (default)' Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -16 Font.Name = 'MS Sans Serif' Font.Style = [fsBold] ParentFont = False end object Button1: TButton Left = 114 Top = 72 Width = 75 Height = 25 Caption = 'OK' TabOrder = 0 27
  28. OnClick = Button1Click end end Ngoài cách lưu trữ trên, chúng ta có thể click chuột phải lên biểu mẫu trong lúc thiết kế, bỏ chọn mục Text DFM; khi đó biểu mẫu sẽ được lưu dưới dạng nhị phân. Chúng ta có thể điềuchỉnh chức năng này thành mặc định bằng cách chọn thực đơn Tools/ Environment Options. Trong cửa sổ này chọn ngăn Desinger, bỏ chọn chức năng New Form as Text. Hình 13-Điều chỉnh để thiết kế biểu mẫu lưu ở dạng nhị phân Để chuyển một dự án từ Visual C++, chúng ta sử dụng công cụ chuyển đổi của C++ Builder được gọi bằng lệnh Tools/Visual C++ Project Convertion Untility. * Translation Repository Đây là kho chứa bộ thông dịch, chúng ta có thể sử dụng nó để lưu trữ và các văn bản biên dịch. Chúng ta cũng có thể truy cập Repository một cách trực tiếp thông qua giao diện của nó để xuất khẩu và nhập khẩu dữ liệu, tìm kiếm và sửa đổi các chuỗi văn bản hoặc xoá bỏ những đoạn dịch mà chúng ta không muốn. Chúng ta có thể truy cập công cụ này bằng cách chọn Tools/Translation Repository. Repository (kho chứa) lưu dữ liệu bằng 1 tập tin có đuôi mở rộng là .rps. Và chúng ta có thể dùng đuôi mở rộng là .rps để mặc định tập tin trong thư mục. Để lưu trữ tập tin hiện hành có đuôi mở rộng là .rps, ta nhấn nút Save. Để lưu dữ liệu hiện tại trong một tập tin khác ta nhấn nút Save As. Để mở tập tin khác có đuôi mở rộng là .rps ta nhấn nút Open. Để mở tập tin mới (trống) có đuôi mở rộng là .rps ta nhấn nút New. Để tìm kiếm một chuỗi dữ liệu nằm trong kho chứa hiện hành ta nhấn nút Find. Để xoá 1 mẫu tin ta chọn bất kì phím mũi tên nào đó và nhấn nút Delete. Để soạn thảo ta nhấn chuột vào vị trí muốn soạn thảo hoặc ta có thể chọn mục soạn thảo và nhấn phím F2. 28
  29. Một số thiết lập Repository bị kiểm soát bởi hộp thoại Translation Tools Options. Để thay đổi những thiết lập này ta chọn Tools/Translation Tools Options từ thực đơn chính của C++ Builder. Để tự động khôi phục nguồn liên kết động (Resource DLL) từ kho chứa ta chọn Automatic Repository Query. CodeGuard CodeGuard cung cấp các thư viện thực thi để truy bắt lỗi để phát triển ứng dụng trong C++ Builder. Nó giúp cho phép tạo báo cáo về những lỗi mà trình dịch không bắt được vì những lỗi này không vi phạm cú pháp đồng thời hỗ trợ đầy đủ trong các ứng dụng đa tuyến trình. Image Editor (trình soạn thảo ảnh) Đây là công cụ cho phép chỉnh sửa nhiều kiểu ảnh khác nhau. Để mở công cụ này, chúng ta chọn Tools|Image Editor. XML Mapper XML Mapper là công cụ thiết kế cho phép chúng ta gắn kết tài liệu XML và gói thao tác dữ liệu cho dataset nhằm tạo một ánh xạ cho mỗi phần tử trong tài liệu XML với mỗi trường trong gói thao tác dữ liệu. Chúng ta cũng có thể tạo sự gắn kết từ tài liệu giản đồ XML với một dataset. 2.3 Xây dựng chương trình Text Editor Trong nội dung bài này, chúng ta sẽ gắng xây dựng một chương trình soạn thảo văn bản đơn giản. Khi xây dựng chương trình này, chúng ta sẽ gặp một số đối tượng chưa được nghiên cứu. Tuy nhiên, khó khăn này sẽ không phải là vấn đề lớn, chúng ta sẽ tiến hành ứng dụng theo từng bước. 2.3.1. Tạo dự án Chúng ta tiến hành tạo một dự án đế bắt đầu thực hiện chương trình của chúng ta theo các bước sau: Bước 1: Tạo một thư mục có tên TextEditor tại vị trí lưu trữ thích hợp. Bước 2: Tạo một dự án mới bằng cách chọn thực đơn File/New/Application. Bước 3: Chọn File/Save All để lưu các tập tin vào đĩa. Khi hộp thoại Save As hiển thị ra, chúng ta tìm đến thư mục TextEditor đã tạo ở bước 1. Tiến hành: - Lưu tập tin Unit1 với tên mặc định Unit1.cpp. - Lưu tập tin dự án với tên TextEditor. Bước 4: Đặt thuộc tính Caption cho biểu mẫu thành Text Editor. 2.3.2. Thêm đối tượng soạn thảo Ở nội dung này, chúng ta tiến hành thêm các đối tượng vào biểu mẫu để tạo giao diện chính cho chương trình: Bước 1: Để thêm vùng soạn thảo văn bản, trước tiên, chúng ta thêm đối tượng RichEdit (ngăn công cụ Win32). Điều chỉnh thuộc tính Lines để nó trở thành giá trị rỗng. Bước 2: Điều chỉnh thuộc tính Align của đối tượng RichEdit ở trên thành alClient. Khi điều chỉnh thuộc tính này, đối tượng RichEdit sẽ lấp đầy trên biểu mẫu, kích thước của đối tượng RichEdit cũng sẽ thay đổi mỗi khi biểu mẫu thay đổi kích thước. 29
  30. Bước 3: Thêm đối tượng StatusBar (thanh trạng thái - ngăn Win32), đối tượng này sẽ tự động được thêm ở cạnh dưới của biểu mẫu (Thuộc tính Align = alBottom). Bước 4: Nhấn đối chuột lên thanh trạng thái để mở hộp thoại thiết kế thanh trạng thái. (Nhấn trên nút cạnh thuộc tính Panels). Bước 5: Nhấn nút Add để thêm một phần tử cho đối tượng thanh trạng thái. Phần tử này dùng để hiển thị tên tập tin. Bước 6: Điều chỉnh thuộc tính Text của phần tử vừa thêm vào thanh trạng thái thành untitled.txt. Hình 14-Soạn thảo phần tử trên thanh trạng thái Bước 7: Đóng hộp thoai soạn thảo thanh trạng thái. 2.3.3. Hoạch định chức năng Một ứng dụng làm gì đi nữa thì thường nó cần một thực đơn và thanh công cụ. Chúng ta sử dụng đối tượng ActionList để xây dựng các đoạn mã lệnh dùng chung cho các chức năng nằm trên thanh thực đơn và thanh công cụ. Bảng sau liệt kê các lệnh có được hoạch định: Thực đơn Lệnh Nằm trên Ý nghĩa thanh công cụ File New Có Tạo một tập tin mới File Open Có Mở một tập tin trên đĩa File Save Có Lưu tập tin đang soạn thảo vào đĩa File Save as Không Lưu tập tin với tên khác File Exit Có Thoát khỏi chương trình Edit Cut Có Cắt văn bản vào vùng clipboard Edit Copy Có Sao chép văn bản vào vùng clipboard Edit Paste Có Dán văn bản từ clipboard Help Contens Không Hiển thị nội dung hướng dẫn chính Help Index Không Hiển thị ngăn Index của phần hướng dẫn 30
  31. Help About Không Hiển thị thông tin bản quyền 2.3.4. Thiết kế danh sách hành động Trong nội dung này chúng ta sẽ dùng đối tượng ActionList để chia sẽ các đoạn mã lệnh dùng chung cho lệnh nằm trên thực đơn và trên thanh công cụ. Trước tiên chúng ta chuẩn bị hình ảnh để gắn kết với thực đơn và thanh công cụ theo các bước sau: Bước 1: Thêm đối tượng ImageList (ngăn Win32) vào biểu mẫu. Bước 2: Nhấn đôi chuột lên đối tượng ImageList để mở hộp thoại soạn thảo hình ảnh. Bước 3: Nhấn nút Add. Bước 4: Hộp thoại chọn hình ảnh hiển thị lên màn hình, chúng ta tìm thư mục chứa hình ảnh, mặc định chứa trong thư mục C:\Program Files\Common Files\Borland Shared\Images\Buttons. Bước 5: Nhấn đôi chuột lên tập tin filenew.bmp. Khi cửa sổ hiển thị ra hỏi rằng bạn có muốn chia thành 2 tập tin hay không? Chọn Yes. Khi đó, chúng ta sẽ nhìn thấy hai hình ảnh được thêm vào. Chúng ta xoá hình ảnh xám đi (Hình thứ 2). Bước 6: Tương tự bước 5, thêm các hình ảnh sau: fileopen.bmp; filesave.bmp; doorshut.bmp; cut.bmp; copy.bmp; paste.bmp Như vậy khi kết thúc bước này, các hình ảnh sẽ có ImageIndex liệt kê như sau: Tên tập tin ImageIndex Filenew.bmp 0 Fileopen.bmp 1 Filesave.bmp 2 Doorshut.bmp 3 Cut.bmp 4 Copy.bmp 5 Paste.bmp 6 Help.bmp 7 Chúng ta tiến hành gắn kết các hình ảnh lên các hành động và thêm các hành động vào ActionList theo các bước sau: Bước 7: Nhấn đôi chuột lên đối tượng ActionList trên ngăn Standard. Khi đó đối tượng được tạo ra mang tên ActionList1. Bước 8: Cài đặt thuộc tính Images của đối tượng ActionList1 thành ImageList1. Bước 9: Nhấn đôi chuột lên đối tượng ActionList1, chúng ta mở được cửa sổ soạn thảo Action List. 31
  32. Bước 10: Nhấn chuột lên lên nút New Action (hoặc phím Insert). Đối tượng mới tạo ra mang tên Action1. Bước 11: Điều chỉnh thuộc tính cho đối tượng Action1 theo bảng sau: Thuộc tính Giá trị Ghi chú Caption &New Ký tự N là phím nóng Category File Lệnh này thuộc nhóm lệnh File Hint Create file Dòng văn bản chú thích ngắn gọn về chức năng ImageIndex 0 Name FileNew Bước 12: Chúng ta tiến hành các bước tương tự như bước 11 để có được bảng đối tượng liệt kê như sau: Đối tượng Thuộc tính Giá trị Caption &Save Category File Action Hint Save file ImageIndex 2 Name FileSave Caption &Index Category Help Action ImageIndex -1 Name HelpIndex Caption &About Category Help Action ImageIndex 7 Name HelpAbout C++ Builder có dựng sẵn cho chúng ta các hành động chuẩn như Copy, Cut, Chúng ta sẽ vận dụng các hành động chuẩn này để tạo các lệnh còn lại theo các bước sau: 32
  33. Bước 13: Chọn New Standard Action như hình sau: Hình 15-Tạo hành động chuẩn Bước 14: Trong hộp thoại Standard Action Classes, dùng phím Ctrl và chọn các phần tử TEditCut, TEditCopy, and TEditPaste của chức năng Edit. Nhấn Ok. Cửa sổ soạn thảo ActionList sẽ như sau: Hình 16-Soạn thảo ActionList Bước 15: Thực hiện tương tự bước 14 để tạo các hành động của chức năng File: Scroll TFileOpen, TFileSaveAs, và TFileExit. THelpContents của chức năng Help. Bước 16: Các hành động được gán hình ảnh mặc định, chúng ta có thể giữ nguyên hoặc có thể thay đổi các hình ảnh cho đúng với các hình ảnh ta đã lưu trữ trong ImageList1. Tên đối tượng Thuộc tính ImageIndex EditCut1 4 EditCopy1 5 33
  34. EditPasted1 5 FileOpen1 1 FileExit 3 Bước 17: Đóng cửa sổ soạn thảo ActionList và chọn File/Save All để lưu tất cả những gì đã sửa đổi. 2.3.5. Tạo thực đơn cho chương trình Trong phần này, chúng ta sẽ thêm thực đơn chính với ba thực đơn đổ xuống gồm: File, Edit, Help với mỗi mục chọn con trong mỗi mục chọn File, Edit, Help được liên kết với các hành động đã tạo ở trên. Các bước thực hiện thực đơn chính như sau: Bước 1: Thêm đối tượng MainMenu trong ngăn Standard của bảng công cụ. (Đối tượng sẽ mang tên MainMenu1) Bước 2: Cài đặt giá trị cho Images thành ImageList1 để thêm các hình ảnh cho MainMenu. Bước 3: Nhấp đôi chuột lên đối tượng MainMenu1 để mở cửa sổ Menu Designer (cửa sổ thiết kế thực đơn). Bước 4: Phần tử đầu tiên sẽ được đặt thuộc tính Caption thành &File và nhấn Enter. Bước 5: Chọn phần tử trống phía dưới lệnh File vừa tạo. Cài đặt thuộc tính Action thành FileNew Bước 6: Tương tự như thế chúng ta tiến hành gắn kết các đối tượng. Theo thứ tự được liệt kê dưới đây: Chọn phần tử dưới phần tử New và cài đặt thuộc tính Action thành FileOpen1. Chọn phần tử dưới phần tử Open và cài đặt thuộc tính Action thành FileSave. Chọn phần tử dưới phần tử Save và cài đặt thuộc tính Action thành FileSaveAs1. Chọn phần tử dưới phần tử Save As, điều chỉnh thuộc tính Caption thành “-” (không có dấu nháy) để tạo dòng phân cách Chọn phần tử dưới dòng phân cách và cài đặt thuộc tính Action thành FileExit1. Bước 7: Tạo thực đơn Edit: Chọn phần tử bên phải của lệnh File, cài đặt thuộc tính Action thành &Edit, và nhấn phím Enter. Chọn phần tử dưới phần tử Edit và cài đặt thuộc tính Action thành EditCut1. Chọn phần tử dưới phần tử Cut và cài đặt thuộc tính Action thành EditCopy1. Chọn phần tử dưới phần tử Copy và cài đặt thuộc tính Action thành EditPaste1. Bước 8: Tạo thực đơn Help 34
  35. Chọn phần tử bên phải của lệnh Edit command, cài đặt thuộc tính Action thành &Edit, và nhấn phím Enter. Chọn phần tử dưới phần tử Help and và cài đặt thuộc tính Action thành HelpContents. Chọn phần tử dưới phần tử Contents và cài đặt thuộc tính Action thành HelpIndex. Chọn phần tử dưới phần tử Index, và cài đặt thuộc tính Caption thành “-” (không có dấu nháy) để tạo dòng ngăn cách. Chọn phần tử dưới dòng ngăn cách và cài đặt thuộc tính Action thành HelpAbout. Bước 9: Đóng cửa sổ thiết kế thực đơn và chọn File/Save All để lưu lại những thay đổi. 2.3.6. Thêm thanh công cụ Chúng ta tiến hành thêm thanh công cụ bằng các bước sau: Bước 1: Thêm đối tượng Toolbar trong ngăn Win32 vào biểu mẫu. Bước 2: Cài đặt giá trị cho thuộc tính Images thành giá trị ImageList1. Cài đặt thuộc tính Indent thành 4 (Giá trị này canh lề trái cho hình ảnh cách lề trái 4 điểm ảnh). Cài đặt giá trị ShowHint thành true. Bước 3: Để thêm nút nhấn vào thanh công cụ, chúng ta nhấn chuột phải và chọn New Button. Chúng ta thêm bốn nút nhấn vào công cụ. Bước 4: Nhấn chuột phải lên thanh công cụ, chọn New Separator để thêm một dòng ngăn cách. Bước 5: Thêm ba nút nhấn nữa. Bước 6: Gắn kết nối các hành động với các nút nhấn: Điều chỉnh thuộc tính Action thành các giá trị như sau: Nút đầu tiên thành FileNew; nút thứ 2 thành FileOpen1; nút thứ 3 thành FileSave; nút thứ 4 thành FileExit. nút nhấn thứ 5 thành EditCut1; nút nhấn thứ 6 thành EditCopy1; nút nhấn cuối cùng thành EditPaste1. Bước 7: Chọn File/Save All. Bước 8: Nhấn phím F9 để chạy chương trình. Kết quả như hình sau: Hình 17-Cửa sổ chương trình 2.3.7. Hoàn chỉnh sự kiện 35
  36. Trong phần này, chúng ta sẽ tiến hành hoàn chỉnh mã lệnh cho các hành động không chuẩn và bổ sung các giá trị để hoàn chỉnh các hành động chuẩn. a) Mã lệnh cho hành động FileNew Bước 1: Khai báo thêm một biến mang tên FileName có phạm vi toàn cục bằng cách chọn View/Units , chọn Unit1, nhấn nút OK. Nhấn chuột phải lên ngăn Unit1.cpp, chọn Open Source/Header file. Tìm vị trí public và chèn thêm đoạn lệnh để được như sau: public: // User declarations __fastcall TForm1(TComponent* Owner); AnsiString FileName; Bước 2: Nhấn phím F12 để về cửa sổ thiết kế biểu mẫu. Bước 3: Nhấn đôi chuột lên đối tượng ActionList1, nhấn đôi chuột lên hành động FileNew. Chèn đoạn mã lệnh để đạt được đoạn mã lệnh sau: void __fastcall TForm1::FileNewExecute(TObject *Sender) { RichEdit1->Clear(); FileName = "untitled.txt"; //khởi tạo tên tập tin StatusBar1->Panels->Items[0]->Text = FileName; } Bước 4: Chọn File/Save All. b) Viết mã lệnh cho hành động FileOpen1 Bước 1: Nhấn phím F12, nhấn đôi chuột lên đối tượng ActionList1. Bước 2: Chọn hành động FileOpen1. Bước 3: Trong cửa sổ thuộc tính, nhấn chuột vào dấu cộng bên trái thuộc tính Dialog để mở các thuộc tính của Dialog. Dialog tham chiếu đến hộp thoại mở tập tin với tên mặc định là FileOpen1->OpenDialog. Khi phương thức Excute được thực thi nó sẽ mở một hộp thoại để cho phép chúng ta chọn tập tin để mở. Bước 4: Cài đặt thuộc tính DefaultExt thành txt. Bước 5: Nhấn đôi chuột lên thuộc tính Filter để hiển thị cửa sổ soạn thảo Filter (Tạo bộ lọc tập tin theo phần mở rộng). Trong dòng đầu tiên, chúng ta gõ Text Files (*.txt) vào cột Filter Name và gõ .txt vào cột Filter. Ở dòng thứ hai, chúng ta gõ All files (*.*) vào cột Filter Name và giá trị *.* vào cột Filter. Nhấn nút Ok. Bước 6: Cài đặt giá trị thuộc tính Title thành Open file. Như vậy hộp thoại này sẽ có tiêu đề là Open file. Bước 7: Chọn ngăn Events, chúng ta nhấn đôi chuột lên sự kiện OnAccept để viết mã lệnh cho sự kiện này. Chèn đoạn mã lệnh để đạt được kết quả như sau: void __fastcall TForm1::FileOpen1Accept(TObject *Sender) { RichEdit1->Lines->LoadFromFile (FileOpen1->Dialog->FileName); 36
  37. FileName = FileOpen1->Dialog->FileName; StatusBar1->Panels->Items[0]->Text = FileName; } Bước 8: Chọn File/Save All c) Viết mã lệnh cho hành động FileSave Bước 1: Nhấn F12, nhấn đôi chuột trái lên đối tượng ActionList1. Bước 2: Nhấn đôi chuột lên hành động FileSave và chèn đoạn mã lệnh để đạt được đoạn mã lệnh như sau: void __fastcall TForm1::FileSaveExecute(TObject *Sender) { if (FileName == "untitled.txt") FileSaveAs1->Execute(); //lưu lần đầu gọi FileSaveAs1 else RichEdit1->Lines->SaveToFile(FileName); } Bước 3: Chọn File/Save All d) Viết mã lệnh cho hành động FileSaveAs1 Bước 1: Nhấn F12 và nhấn đôi chuột lên đối tượng ActionList1. Bước 2: Chọn hành động FileSaveAs1. Bước 3: Trong cửa sổ thuộc tính mở rộng thuộc tính Dialog để điều chỉnh các thuộc tính cho hộp thoại lưu tập tin. . Bước 4: Cài đặt giá trị của thuộc tính DefaultExt thành txt. Bước 5: Thực hiện theo bước 5 của phần b ở trên. Bước 6: Cài đặt thuộc tính Title thành Save as Bước 7: Viết mã lệnh cho sự kiện BeforeExcute như sau: void __fastcall TForm1::FileSaveAs1BeforeExecute(TObject *Sender) { FileSaveAs1->Dialog->InitialDir = ExtractFilePath (FileName); } Bước 8: Viết mã lệnh cho sự kiện OnAccept như sau: void __fastcall TForm1::FileSaveAs1Accept(TObject *Sender) { FileName = FileSaveAs1->Dialog->FileName; RichEdit1->Lines->SaveToFile(FileName); StatusBar1->Panels->Items[0]->Text = FileName; 37
  38. } Bước 9: Chọn File/Save all d) Tạo tập tin hướng dẫn Chúng ta có thể sử dụng chương trình hcw.exe trong thư mục C:\Program Files\ Borland\CBuilder6\Help\Tool để tạo tập tin hướng dẫn. Trong mục này, chúng tôi sử dung ba tập tin hướng dẫn mẫu TextEditor.rtf (rich text file)s, tập tin hướng dẫn (TextEditor.hlp) và tập tin nội dung hướng dẫn (TextEditor.cnt) được giải nén từ tập tin C:\Program Files\Borland\CBuilder6\Help\B6X1.zip vào thư mục TextEditor. Chúng ta mở cửa sổ thiết kế biểu mẫu, nhấn đôi đối tượng ActionList1, nhấn đôi hành động HelpContents1 và chèn đoạn mã lệnh để được đoạn mã lệnh sau: void __fastcall TForm1::HelpContents1Execute(TObject *Sender) { const static int HELP_TAB = 15; const static int CONTENTS_ACTIVE = -3; Application->HelpCommand(HELP_TAB, CONTENTS_ACTIVE); } Đoạn mã lệnh trên dùng để mở cửa sổ Help và kích hoạt ngăn contents. Tương tự, chúng ta viết mã lệnh cho hành động HelpIndex như sau: void __fastcall TForm1::HelpIndexExecute(TObject *Sender) { const static int HELP_TAB = 15; const static int INDEX_ACTIVE = -2; Application->HelpCommand(HELP_TAB, INDEX_ACTIVE); } e) Viết mã lệnh cho hành động HelpAbout Chúng ta theo các bước sau: Bước 1: Thêm hộp thoại AboutBox bằng cách chọn File/New/Other/Forms. Bước 2: Nhấn đôi chuột lên biểu tượng About Box. Bước 3: Đổi các thuộc tính Caption như sau: Product Name thành Text Editor. Version thành Version 1.0. Copyright thành Copyright by Ky Thuat Da Lat. Comment thành This program written by Le Xuan Thach Bước 4: Lưu biểu mẫu trên bằng cách chọn File|Save As và lưu với tên About.cpp. Trong cửa sổ soạn thảo mã lệnhchúng ta thấy có những ngăn sau: Unit1.cpp, Unit1.h, About.cpp 38
  39. Bước 5: Nhấn chuột lên ngăn Unit1.cpp, nhấn tổ hợp phím Ctrl + Home. Chọn File|Include Unit Hdr, sau đó chọn About và nhấn OK. Chú ý rằng có câu lệnh #include được thêm vào đầu tập tin Unit1.cpp . Bước 6: Nhấn F12, nhấn đôi chuột lên đối tượng ActionList1. Bước 7: Nhấn đôi chuột lên hành động HelpAbout và viết đoạn mã lệnh để có đoạn mã lệnh sau: void __fastcall TForm1::HelpAboutExecute(TObject *Sender) { AboutBox->ShowModal(); } Sự kiện ShowModal() sẽ mở cửa sổ ở chế độ Modal, chế độ này yêu cầu người sử dụng phải đóng biểu mẫu này lại nếu muốn tiếp tục thực hiện một tác vụ khác. Bước 8: Chọn File/Save All g) Khởi tạo các giá trị đầu tiên Viết đoạn mã lệnh cho sự kiện OnCreate của biểu mẫu như sau: void __fastcall TForm1::FormCreate(TObject *Sender) { Application->HelpFile = ExtractFilePath(Application->ExeName) + "TextEditor.hlp"; FileName = "untitled.txt"; StatusBar1->Panels->Items[0]->Text = FileName; } Trong đoạn mã lệnh này, chúng ta tiến hành gán tên tập tin hướng dẫn là TextEditor.hlp cho chương trình và khởi tạo tên tập tin cũng như thanh trạng thái. Chúng ta đã xây dựng thành công chương trình trên. 2.4. Thực hành. a) Xây dựng lại các ví dụ trong giáo trình. b) Điều chỉnh lại chương trình TextEditor để đạt được các yêu cầu sau: - Sử dụng thuộc tính ShortCut của các hành động để đặt tổ hợp phím tắt cho các hành động. - Thêm các hành động cài đặt kiểu dáng chữ, kiểu chữ cho vùng văn bản được chọn. - Thêm hành động đổi màu chữ cho vùng văn bản được chọn. - Điều chỉnh thuộc tính PlaintText để có thể mở và điều chỉnh văn bản .rtf đồng thời điều chỉnh lại hộp thoại mở và lưu tập tin. - Cho phép xử lý đoạn văn bản (Paragraph). 39
  40. BÀI 3 TỔNG QUAN VỀ VCL Mã bài : ITPRG03.3 Giới thiệu : Trong bài học này chúng ta sẽ nghiên cứu cấu trúc nền tảng để thường được dùng để tạo các dòng sản phẩm của Borland. Đây chính là bộ thư viện nền tảng của Borland, một bộ thư viện giúp cho các công cụ có thể phát triển trên hệ điều hành xuyên suốt trong các dòng sản phẩm của Borland. Vì đây là thư viện dùng chung cho hầu hết các sản phẩm của Borland nên khi chúng ta đã từng lập trình với một sản phẩm nào của Borland thì chúng ta rất dễ chuyển sang lập trình trên một bộ công cụ lập trình khác của Borland. Để thành công trong việc nghiên cứu nội dung bài học này, chúng ta phải nghiêm túc trong việc phân tích cây thừa kế VCL cũng như các thuộc tính, sự kiện và phương thức được đề cập trong nội dung của bài. Mục tiêu thực hiện: Học xong bài này học viên sẽ có khả năng: Mô tả phân cấp các lớp trong VCL, các thuộc tính, phương thức và biến cố chung của các thành phần VCL. Mô tả một số đối tượng, thành phần chuẩn của VCL. Sử dụng một số thuộc tính của một số thành phần cơ bản trong C++ Builder Nội dung chính: 3.1 Giới thiệu VCL. VCL là viết tắt của cụm từ Visual Component Library, VCL là thư viện trực quan dùng để lập trình trên môi trường Windows. Tất cả các đối tượng VCL đều được tham chiếu dưới dạng con trỏ và lưu trữ trên vùng nhớ động (Heap). VCL được viết bằng C++ Builder; có thể nói VCL là hạt nhân cho hầu hết các công cụ được xây dựng bởi Borland. Các đối tượng của VCL được xây dựng theo mô hình phân cấp thừa kế. Cây thừa kế này ngày sẽ được mở rộng thông qua các phiên bản mới. VCL là cơ sở co lập trình PME bao gồm các thuộc tính (properties), phư ơng thức (methods) và sự kiện (Events) giúp phát triển cácc ứng dụng nhanh (RAD-Rapid Application Development). Người phát triển có thể xây dựng các ứng dụng với ít dòng lệnh nhất bởi lẽ VCL đã được xây dựng để nắm giữ rất nhiều công việc giúp bạn. 40
  41. 3.2 Mô hình phân cấp VCL. Mô hình phân cấp và cây thừa kế của C++ Builder 6 có thể tìm thấy trong trang web hoặc có thể liên lạc với địa chỉ email: lexuanthach@gmail.com để nhận poster về cây thừa kế về VCL. Sau đây, chúng tôi sẽ trình bày ngắn gọn về một số phân nhánh và cố gắng phân tích một số đối tượng trong cây thừa kế. Lớp cao nhất trong cây thừa kế là TObject, lớp TObject là lớp trừu tượng. Lớp này cung cấp các khả năng để đáp nhằm đáp ứng việc khởi tạo và huỷ bỏ của các đối tượng, cung cấp sự nắm giữ thông điệp, và chứa các kiểu lớp, thông tin kiểu thực thi các thuộc tính xuất bản (Runtime Type Information- RTTI). RTTI cho phép chúng ta xác định kiểu của một đối tượng vào thởi điểm thực thi thậm chí khi mã lệnh sử dụng con trỏ hay tham chiếu đến đối tượng đó. Ví dụ, C++ Builder chuyển một con trỏ kiểu TObject như một tham số cho mỗi sự kiện của nó. RTTI cũng có thể thực hiện một phép toán ép kiểu để sử dụng một đối tượng hoặc xác định kiểu của đối tượng. Chúng ta có thể để kiểm tra xem kiểu của một đối tượng bằng cách sử dụng phép toán typeid. Một thuật ngữ của VCL là Persitent data (tạm dịch: dữ liệu liên tục) ám chỉ các được lưu trứ trong các giá trị thuộc tính. Một ví dụ đơn giản nhất là thuộc tính Caption của một nút nhấn hoặc một nhãn. Thuộc tính này có thể được điều chỉnh trong lúc thiết kế và lúc thực thi bằng mã lệnh hay giữa các phiên làm việc. Các lớp không liên tục (Nonpersitent classes) ám chỉ các lớp đơn giản được thiết kế để thực hiện các hàm cụ thể nhưng nó không cho phép lưu trữ dữ liệu giữa các phiên làm việc. Một trình bao bọc có thể được diễn giải như một nơi để thay thế cho sự phức tạp của các hàm Windows API. Nó cho phép tạo ra các đối tượng hoặc các thành phần để dễ sử dụng và sử dụng chéo cho nhiều dự án khác nhau. Một lớp thường được sử dụng là lớp Exception. Nó cung cấp rất nhiều lớp ngoại lệ dựng sẵn để nắm giữ các lỗi ngoại lệ như lỗi chia cho 0, Các nhánh chính của TObject bao gồm TPersitent, TComponent, TControl, TGraphicControl và TWinControl. 41
  42. TPersistent thêm các phương thức cho TObject nhằm cho phép các đối tượng lưu lại trạng thái của nó trước khi bị huỷ đi và nạp lại trạng thái đó khi nó được tạo lại lần nữa. Lớp này quan trọng trong việc tạo ra những thành phần chứa đựng các thuộc tính có dữ liệu là lớp. Nhánh này cũng bao gồm nhiều lớp khác như: TCanvas, TClipboard, TGraphic, TGraphicsObject, và TStrings. TPersistent rẽ xuống TComponent, nó là nền tảng cho tất cả các thành phần VCL. Thuộc tính dòng (Properity streaming) ám chỉ những thuộc tính này có giá trị được lưu giữ trong tập tin của biểu mẫu (form’s file). Khi dự án được mở ra lại thì giá trị sẽ được phục hồi như cũ (chẳng hạn giá trị tại thời điểm thiết kế). Các đối tượng TComponent cung cấp nền tảng cho việc xây dựng các ứng dụng C+ + Builder, chúng được đặt trên bảng công cụ và trở thành cha của các thành phần khác. Có hai loại thành phần: trực quan và không trực quan. Những thành phần không trực quan không yêu cầu giao diện trực quan, do đó nó phái sinh trực tiếp từ TComponent. Các thành phần trực quan yêu cầu phải được nhìn thấy và tương tác với người sử dụng trong lúc thực thi. TControl thêm các chương trình con để vẽ và các sự kiện cần thiết để định nghĩa một thành phần trực quan. Những đối tượng trực quan chia thành hai nhóm: được cửa sổ hoá (TWinControl) và không được cửa sổ hoá (TGraphicControl). Các thành phần TGraphicControl có nhiệm vụ vẽ chính nó nhưng không bao giờ nhận được chỉ điểm (focus). Ví dụ như TImage, TLabel, TBevel và TShape. Thành phần TWinControl cũng tương tự như TGraphicControl ngoại trừ nó có thể nhận được chỉ điểm, cho phép tương tác với người sử dụng. Những thành phần này được hiểu là được cửa sổ hoá, nó có một thẻ quản cửa sổ và có thể chứa trong nó các đối tượng khác (cha của đối tượng khác). 3.3 Các thuộc tính, biến cố chung với TControl Trong phần này, chúng tôi liệt kê các thuộc tính, phương thức và sự kiện thường được sử dụng, còn một số thuộc tính, phương thức, sự kiện phức tạp khác chúng ta sẽ bàn luận kỹ hơn khi gặp nó. 3.3.1. Các thuộc tính - Action: Chỉ định hành động kết hợp với đối tượng. Những hành động (Action) cho phép một ứng dụng tập trung các đáp ứng cho các lệnh. Khi một điều khiển kết hợp với một hành động, hành động sẽ tự xác định các thuộc tính và sự kiện thích hợp của điều kiện. (chẳng hạn nó có thể tác động lên thuộc tính Enabled hoặc nó chứa mã lệnh đáp ứng cho sự kiện OnClick) - Align: Chỉ định canh lề cho đối tượng trong đối tượng chứa nó. Sử dụng thuộc tính này để đính đối tượng vào các biên của biểu mẫu hay panel. Giá trị mặc định của Align là alNone, có nghĩa là không có đính. Nếu giá trị này là alClient thì đối tượng sẽ lấp đầy toàn bộ vùng hiển thị của đối tượng chứa nó. - Anchors: Chỉ định cách thức mà đối tượng sẽ neo vào đối tượng chứa nó. Sử dụng thuộc tính này để chắc chắn rằng luôn luôn bảo toàn vị trí của nó hiện tại trên đối tượng cha, thậm chí đối tượng cha có bị thay đổi kích cỡ. Khi đối tượng cha thay đổi kích cỡ, đối tượng sẽ thay đổi kích cỡ theo sự liên hệ với các cạnh của đối tượng cha mà nó neo vào. 42
  43. Ví dụ: Chúng ta có thể neo đối tượng vào cạnh trái và cạnh phải của đối tượng cha (akLeft=true, akRight=true) đối tượng sẽ giãn theo chiều rộng mỗi khi chiều rộng của biểu mẫu thay đổi. - AutoSize: Chỉ định rằng kích cỡ của đối tượng sẽ tự động thay đổi theo độ lớn của nội dung. Thường thường, giá trị mặc định cho thuộc tính này false.s - BoundsRect: Là thuộc tính có kiểu dữ liệu TRect lưu trữ hình chữ nhật nhỏ nhất để chứa được đối tượng. Đây là phương cách để chúng ta lấy các cạnh của đối tượng. Ví dụ: Câu lệnh R = Control->BoundsRect; tương ứng với các câu lệnh sau: R.Left = Control->Left; R.Top = Control->Top; R.Right = Control->Left + Control->Width; R.Bottom = Control->Top + Control->Height; - BiDiMode: Hướng hiển thị của đối tượng như từ trái sang phải, từ phải sang trái, . Tuy nhiên, thuộc tính này sẽ không được thay đổi trong một số trường hợp như dữ liệu được lấy từ trường có kiểu là ftInteger, - Caption: Xâu văn bản hiển thị trên đối tượng.ClientHeight - ClientOrigin: Toạ độ trên màn hình (Screen) của góc trên trái. - ClientRect: Kích thước xác định của hình chữ nhật hiển thị đối tượng. (Đo bằng điểm ảnh). - ClientWidth: Chiều rộng của đối tượng. - Color: Màu nền của đối tượng. - ControlState: Trạng thái hiện tại của đối tượng vào thời điểm thực thi. - ControlStyle: Định đặt tính của kiểu dáng. - Cursor: Con trỏ chuột hiển thị khi di chuyển lên đối tượng. - DockOrientation: Chỉ định cách thức đối tượng kết dính với đối tượng khác trong cùng một đối tượng chứa chúng. - DragCursor: Con trỏ di rê đối tượng trong chức năng kéo thả. - DragKind: Kiểu của kéo thả: kéo thả bình thường hay kéo thả kết dính. - DragMode: Chế độ kéo thả: kéo thả bằng tay hay kéo thả tự động. - Enabled: Cho phép đối tượng nhận chỉ điểm hay không. - Floating: Chỉ định cách để một đối tượng nổi lên (floating - FloatingDockSiteClass: Xác định lớp của đối tượng tạm thời để chứa đối tượng khi nó nổi lên. - Font: Kiểu phôn chữ cho đối tượng như: tên kiểu chữ, kiểu dáng chữ, kích cỡ, - Height: Độ cao của đối tượng. - HelpContext,HelpKeyword, HelpType: Chỉ định các giá trị để kết gán hướng dẫn với đối tượng. - Hint: Dòng văn bản nhắc nhở ngắn thường để tóm lượt chức năng của đối tượng. - HostDockSite: Chỉ định đối tượng mà đối tượng có thuộc tính này sẽ kết dính vào. 43
  44. - Left: Giá trị tọa độ x của cạnh bên trái. - LRDockWidth: Chỉ định chiều rộng của đối tượng mỗi khi nó được kết dính vào đối tượng khác. - MouseCapture: Xác định liệu đối tượng có “chụp” sự kiện của chuột hay không? Khi được phép, mọi sự kiện sẽ đến đối tượng cho đến khi người dùng thả phím chuột ra. - Name: Tên của đối tượng. - Parent: Đối tượng cha của đối tượng hiện tại. Nó chỉ đến đối tượng sẽ chứa đối tượng hiện tại. - ParentBiDiMode: Chỉ định liệu xem đối tượng hiện tại có sử dụng thuộc tính BidiMode của đối tượng cha hay không? - ParentColor: Chỉ định xem đối tượng có sử dụng màu của đối tượng cha hay không. - ParentFont: Chỉ định xem đối tượng này có sử dụng màu - ParentShowHint: Chỉ định xem đối tượng có sử dụng thuộc tính Hint của đối tượng cha may không. - PopupMenu: Chỉ đến thực đơn ngữ cảnh (thực đơn hiển thị khi nhấn chuột phải lên đối tượng) - ShowHint: Chỉ định xem đối tượng có được phép hiển thị giá trị chỉ dẫn ngắn trong thuộc tính Hint hay không. - TBDockHeight: Chỉ định chiều cao của đối tượng khi nó kết dính vào đối tượng khác. - Text: Văn bản người sử dụng nhập vào đối tượng hoặc được lập trình viên thiết kế bằng cửa sổ thiết kế hoặc bằng mã lệnh. - Top: Chỉ định tọa Y của cạnh trên của đối tượng. - Visible: Chỉ định đối tượng có được nhìn thấy hay không nhìn thấy. - Width: Chiều rộng của đối tượng. - WindowProc: Chỉ định địa chỉ của hàm sẽ xử lý các sự kiện gởi đến đối tượng. - WindowText: Văn bản đính kèm với đối tượng. - Tag: Lưu trữ một số nguyên đính kèm với đối tượng, nó là một phần của đối tượng. Thường giá trí này không có ý nghĩa về mặt xử lý. 3.3.2. Các phương thức - ActionChange: Được gọi một cách tự động mỗi khi thuộc tính Action bị thay đổi hoặc các thuộc tính của đối tượng được chỉ trong Action bị thay đổi. - AdjustSize: Được gọi một cách tự động bởi thuộc tính AutoSize để điều chỉnh lại kích thước của đối tượng cho khớp với dữ liệu hiển thị. - AssignTo: Gán những giá trị cho đối tượng TAction. - BeginAutoDrag: Được gọi một cách tự động khi đối tượng bắt đầu được kéo trong chế độ kéo và thả tự động. - BeginDrag: Được gọi một cách tự động khi đối tượng bắt đầu được kéo trong chế độ kéo và thả tự động. Nếu chúng ta viết mã lệnh để kéo và thả đối tượng bằng tay, 44
  45. chúng ta phải gọi phương thức này để đối tượng đưa vào trạng thái bắt đầu được kéo. - BringToFront: Đưa đối tượng lên trên các đối tượng khác nằm trong cùng một đối tượng cha. - CanAutoSize: Kiểm tra xem đối tượng có thể tự động điều chỉnh kích thước hay không? - CanResize: Kiểm tra xem có thể thay đổi được kích thước của đối tượng. - Changed: Phát sinh sự kiện OnChange cho đối tượng. - ChangeScale: Thay đổi tỷ lệ hiển thị của đối tượng. - Click: Được sử dụng để phát sinh sự kiện OnClick hoặc được gọi một cách tự động bởi sự kiện OnClick. - ClientToParent: Chuyển tọa độ sang tọa độ của đối tượng cha. - ClientToScreen: Chuyển tọa độ sang tọa độ của màn hình. - Create: Khởi tạo đối tượng. Không sử dụng trực tiếp mà phương thức này sẽ được gọi một cách tự động khi khởi tạo bằng từ khóa new. - DblClick: Được sử dụng để phát sinh sự kiện OnDblClick. - Destroy: Được gọi để hủy đối tượng. - DoDock: Bắt đầu quá trình kết dính đối tượng. - DoEndDock: Kết thúc quá trình kết dính đối tượng. - DoEndDrag: Kết thúc quá trình rê và thả đối tượng. - DoMouseWheel: Phát sinh sự kiện cuộn nút giữa của chuột. - DoMouseWheelDown: Phát sinh sự kiện cuộn xuống của nút giữa chuột . - DoMouseWheelUp: Phát sinh sự kiện cuộn lên của nút giữa chuột. - DoStartDock: Bắt đầu quá trình kết dính đối tượng. - DoStartDrag: Bắt đầu quá trình kéo thả đối tượng. - DragCanceled: Hủy công việc kéo thả. - DragDrop: Phát sinh sự kiện OnDragDrop. - Dragging: Thử kiểm tra xem đối tượng có phải là đang được kéo hay không. - DragOver: Phát sinh sự kiện OnDragOver. - EndDrag: Kết thúc kéo và thả đối tượng. - GetClientOrigin: Trả về tọa độ màn hình góc trên trái của đối tượng. - GetClientRect: Trả về hình chữ định nghĩa vùng hiển thị của đối tượng. - GetControlsAlignment: Trả về giá trị canh lề của văn bản bên trong đối tượng. - GetDragImages: Trả về ImageList chứa các hình ảnh mà cont rỏ - GetEnabled: Lấy giá trị của thuộc tính Enabled. - GetFloating: Lấy giá trị của thuộc tính Floating. - GetPopupMenu: Lấy giá trị của thuộc tính PopupMenu - GetTextBuf: Trả về văn bản được sao chép vào bộ nhớ đệm. 45
  46. - GetTextLen: Trả về chiều dài văn bản của đối tượng. - HasParent: Trả về kết quả xem đối tượng có đối tượng cha hay không? - Hide: Ẩn đối tượng, giống như chúng ta gán thuộc tính Visible=false. - MouseDown: Phát sinh sự kiện OnMouseDown. - MouseMove: Phát sinh sự kiện OnMouseMove. - MouseUp: Phát sinh sự kiện OnMouseUp. - ParentToClient: Chuyển toạ độ từ đối tượng cha sang toạ độ của đối tượng con. - Perform: Phát sinh một sự kiện chỉ định. - Refresh: Làm tươi lại đối tượng. - Repaint: Vẽ lại đối tượng. - Resize: Thay đổi kích cỡ của đối tượng. - ScreenToClient: Chuyển toạ độ màn hình sang toạ độ đối tượng. - SendCancelMode: Huỷ bỏ trạng thái “modal” của đối tượng. - SendToBack: Chuyển đối tượng nằm dưới tất cả các đối tượng khác. - SetBounds: Cài đặt các đường biên cho đối tượng. - SetDragMode: Cài đặt chế độ kéo thả cho đối tượng. - SetEnabled: Cài đặt thuộc tính Enabled cho đối tượng. - SetParent: Cài đặt đối tượng cha cho đối tượng. - SetTextBuf: Cài đặt văn cho đối tượng. - SetZOrder: Cài đặt thứ tự nhận thông điệp trong đối tượng cha của nó. - Show: Hiện đối tượng. - Update: Xử lý ngay lập tức các sự kiện yêu cầu vẽ lại đối tượng đang chờ đợi. 3.3.3. Các sự kiện chung - OnCanResize: Xảy ra khi đối tượng thay đổi kích thước. - OnClick: Phát sinh khi người dùng nhấn chuột trái lên đối tượng. Sự kiện này phát sinh trong rất nhiều tình huống như: Người sử dụng chọn một phần tử trong lưới, đường biên, danh sách hoặc hộp danh sách đổ xuống bằng cách nhấn phím mũi tên. Người sử dụng nhấn phím SpaceBar trong khi một nút nhấn hay một ô đánh dấu có chỉ điểm. Người sử dụng nhấn phím Enter khi biểu mẫu kích hoạt có nút nhấn mặc định là nút nhấn phát sinh sự kiện này.(được chỉ định bởi thuộc tính Default của biểu mẫu). Người sử dụng nhấn phím Cancel khi biểu mẫu kích hoạt có nút nhấn huỷ bỏ trỏ đến đối tượng phát sinh sự kiện này (được chỉ định bởi thuộc tính Cancel của biểu mẫu). Khi người sử dụng nhấn các phím nóng hay phím tắt của nút nhấn hoặc ô đánh dấu. Thuộc tính Checked của ô chọn được cài đặt thành true. Khi phương thức Click của một thực đơn được gọi. 46
  47. - OnContextPopup: Phát sinh khi thực đơn ngữ cảnh được mở ra. (Thường là nhấn chuột phải để mở thực đơn này). - OnDblClick: Phát sinh khi nhấn đôi chuột lên đối tượng. - OnDragDrop: Phát sih khi đối tượng được kéo. - OnDragOver: Phát sinh khi có đối tượng kéo di chuyển trên bề mặt của đối tượng phát sinh sự kiện này. - OnEndDock: Phát sinh khi kết thúc quá trình kết dính. - OnEndDrag: Phát sinh khi kết thúc quá trình kéo và thả. - OnMouseDown: Phát sinh khi nhấn chuột xuống. - OnMouseMove: Phát sinh khi di chuyển chuột trên đối tượng. - OnMouseUp: Phát sinh khi thả phím chuột ra (sau khi nhấn lên đối tượng và thả ra). - OnMouseWheel: Phát sinh khi nút cuộn trên con chuột được cuộn. - OnMouseWheelDown: Phát sinh khi người dùng cuộn xuống bằng nút cuộn của chuột. - OnMouseWheelUp: Phát sinh khi người dùng cuộn lên bằng nút cuộn của chuột. - OnResize: Phát sinh khi đối tượng được thay đổi kích thước. - OnStartDock: Phát sinh khi quá trình kết dính đối tượng được bắt đầu. - OnStartDrag: Phát sinh khi quá trình kéo và thả đối tượng được bắt đầu. 3.4 Các thuộc tính, biến cố chung với TWinControl. Trong phần này, chúng tôi liệt kê các thuộc tính, phương thức và sự kiện thường được sử dụng, còn một số thuộc tính, phương thức, sự kiện phức tạp khác chúng ta sẽ bàn luận kỹ hơn khi gặp nó. 3.4.1. Thuộc tính chung - BevelEdges: Xác định những cạnh của đối tượng được tạo cạnh xiên. - BevelInner: Xác định độ sâu của các cạnh trong của đối tượng có cạnh được tạo cạnh xiên. - BevelKind: Xác định kiểu cạnh xiên cho cạnh của đối tượng. - BevelOuter: Xác định độ nổi của các cạnh trong của đối tượng có cạnh được tạo cạnh xiên. - BevelWidth: Xác định của độ rộng giữa cạnh chìm và cạnh nổi. - BorderWidth: Xác định độ rộng của đường viền. - Brush: Chứa các giá trị làm nền cho đối tượng như: màu nền, kiểu nền, - ClientRect: Hình chữ nhật chứa đối tượng. - ControlCount: Tổng cộng các đối tượng con của đối tượng hiện tại. - Controls: Chứa các đối tượng con của đối tượng hiện tại. - Ctl3D: Xác định xem đối tượng có hiển thị ở dạng ba chiều hay hai chiều. - DefWndProc: Con trỏ trỏ đến hàm mặc định xử lý các sự kiện. - DockClientCount: Trả về số lượng đối tượng được kết dính vào đối tượng này. 47
  48. - DockClients: Danh sách các đối tượng được kết dính với đối tượng. - DockManager: - Handle: Thẻ quản cửa sổ của đối tượng. - ParentWindow: Lưu trữ thẻ quản cửa sổ của đối tượng. - Showing: Trả về giá trị cho biết đối tượng có đang được hiển thị hay không. - TabOrder: Số thứ tự khi chúng ta nhấn phím Tab để di chuyển chỉ điểm đến đối tượng. - TabStop: Lưu trữ giá trị cho phép chúng ta di chuyển chỉ điểm đến đối tượng bằng phím Tab hay không. - WindowHandle: Tương tự như Handle. Ngoài ra, TWincontrol còn thừa kế một số thuộc tính từ TControl và TComponent. 3.4.2. Các phương thức chung - ActionChange: Giống phương thức ActionChange của đối tượng TControl. - AdjustClientRect: Điều chỉnh kích thước của hình chữ nhật chứa đối tượng. - AdjustSize: Điều chỉnh kích thước của đối tượng cho khớp với dữ liệu. Phương thức này được gọi một cách tự động nhờ vào thuộc tính AutoSize=true. - AssignTo: Sao chép các thuộc tính sang một đối tượng khác. - Broadcast: Gởi một thông điệp đến tất cả các đối tượng con. - CanFocus: Trả về giá trị xem đối tượng có thể nhận chỉ điểm được hay không. - CanResize: Trả về giá trị xem đối tượng có thể thay đổi kích cỡ của hay không. - ChangeScale: Thay đổi tỷ lệ hiển thị của đối tượng. - ContainsControl: Kiểm tra xem một đối tượng có được chứa trong đối tượng hiện tại hay không. - ControlAtPos: Trả về đối tượng con tại toạ độ chỉ định. - CreateHandle: Tạo một thẻ quản cho cửa sổ nằm dưới. - CreateParams: Tạo một cửa sổ với các tham số tuỳ chọn, giống như sử dụng hàm CreateWindowEx của Windows API. - CreateParentedControl: Tạo và gán đối tượng thành đối tượng con của đối tượng hiện tại. Dùng để tạo các đối tượng không trực quan. - CreateSubClass: Tạo một đối tượng cửa sổ phái sinh từ một lớp sẵn có. - CreateWindowHandle: Tạo thẻ quản cửa sổ. - CreateWnd: Tạo thẻ quản cửa sổ. - DestroyHandle: Huỷ thẻ quản của đối tượng nhưng không huỷ đối tượng. - DockDrop: Phát sinh sự kiện OnDockDrop. - DoDockOver: Phát sinh sự kiện DoDockOver. - DoEnter: Phát sinh sự kiện OnEnter. - DoExit: Phát sinh sự kiện OnExit. - DoKeyDown: Phát sinh sự kiện KeyDown. 48
  49. - DoKeyPress: Phát sinh sự kiện KeyPress. - DoKeyUp: Phát sinh sự kiện KeyUp. - DoUnDock: Phát sinh sự kiện OnUnDock. - FindChildControl: Tìm kiếm đối tượng con bằng cách chỉ định tên của nó. - FindNextControl: Tìm kiếm đối tượng con kế tiếp của hộp điều khiển bằng phím tab. - FixupTabList: Phân loại đối tượng con bằng phím tab. - FlipChildren: Đảo ngược vị trí của đối tượng con. Nghĩa là chúng ta có thể di chuyển đối tượng con trong hộp điều khiển từ vị trí bên trái sang vị trí phải va ngược lại và chúng ta cũng có thể điều chỉnh, canh lề, - Focused: xác định xem đối tượng đã được nhập vào chưa. - GetActionLinkClass: trở về hành động được kết hợp với lớp liên kết. - GetChildren: kêu gọi một phương thức cụ thể cho mỗi đối tượng con trong hộp điều khiển. - GetClientOrigin: Trả về giá trị của thuộc tính ClientOrigin. - GetClientRect: Trả về giá trị của thuộc tính ClientRect. - GetControlExtents: trả về hình chữ nhật nhỏ nhất mà khít với đối tượng con trong hộp điều khiển. - GetDeviceContext: Cung cấp một thiết bị cho hộp điều khiển. - GetParentHandle: Trả về thẻ quản của cửa sổ điều khiển cho cửa sổ điều khiển cha trong hộp điều khiển. - GetTabOrderList: xây dựng một danh sách trong hộp điều khiển bằng phím tab. - GetTopParentHandle: trả về cửa sổ điều khiển của cửa sổ đầu tiên mà không liên quan đến hộp điều khiển VCL. - HandleAllocated: chỉ rõ giá trị của bộ điều khiển. -HandleNeeded: tạo một đối tượng trong hộp điều khiển nếu đối tượng đó không tồn tại. - InsertControl: Chèn một hộp điều khiển vào thuộc tính đã được dàn trận. - Invalidate: Một hộp điều khiển cần được điều chỉnh lại. - IsControlMouseMsg: dấu hiệu cho biết chuột đã sẵn sàng trong đối tượng con của cửa sổ điều khiển. - KeyDown: phản ứng lại những sự kiện đã được nhấn phím. - KeyPress: đáp ứng lại những dữ liệu nhập vào từ bàn phím. - KeyUp: đáp ứng lại những gì mà phím thả ra. - MainWndProc: nhận những thông điệp của cửa sổ cho hộp điều khiển. - NotifyControls: gởi thông điệp đến tất cả các hộp điều khiển con. - PaintControls: mô tả các đối tượng con trong cửa sổ điều khiển bằng việc sử dụng những thiết bị cụ thể. - PaintHandler: đáp ứng lại những thông điệp từ WM_PAINT. - PaintTo: Vẽ đối tượng lên thiết bị như vẽ biễu đồ hoặc vẽ hình ảnh, 49
  50. - PaintWindow: hoàn trả lại hình ảnh của cửa sổ điều khiển. - PaletteChanged: đáp ứng lại sự thay đổi trong hệ thống bảng màu bằng việc nhận biết màu của bảng điều khiển và màu của mỗi đối tượng con. - ReadState: Sẵn sàng kiểm soát các thuộc tính gắn với giá trị dòng. - RecreateWnd: Tạo lại đối tượng Windows ở phía dưới màn hình. - ReloadDockedControl: nhập lại một bộ điều khiển neo. - RemoveControl: Gỡ bỏ một điều khiển cụ thể từ mảng điều khiển. - Repaint: Vẽ lại toàn bộ bộ điều khiển. - ResetIme: Khôi phục lại phương pháp soạn thảo dữ liệu ( input method editor (IME)) đã hoạt động khi ứng dụng bắt đầu làm việc. - ResetImeComposition: quản lí thành phần cấu tạo của phương pháp soạn thảo dữ liệu ( input method editor (IME) để thực hiện một hành động cụ thể. - ScaleBy: Thay đổi tỉ lệ điều khiển và đối tượng con. - ScaleControls: Chỉ thay đổi tỉ lệ của đối tượng con. - ScrollBy: Cuộn nội dung. - SelectFirst: Định chỉ điểm đến đối tượng con đầu tiên tính theo giá trị thuộc tính TabOrder. - SelectNext: Di chuyển chỉ điểm đến đối tượng con kế tiếp theo thứ tự TabOrder. - SetBounds: Cài đặt biên cho đối tượng. - SetFocus: Cài đặt chỉ điểm đến đối tượng. - SetZOrder: Điều chỉnh điều khiển đến đầu hoặc cuối trong thứ tự Z-Order. - ShowControl: Cài đặt một điều khiển hiển thị. - Update: Ép đối tượng phải cập nhật lại như vẽ lại đối tượng, - WndProc: Con trỏ của hàm xử lý thông điệp được gởi đến đối tượng bởi Windows. Ngoài ra, còn một số phương thức được phái sinh từ lớp TControl, TPersistent và TObject. Chúng ta có thể tra thêm hướng dẫn của C++ Builder để tìm hiểu kỹ hơn. 3.4.3. Các sự kiện chung - OnDockDrop: Phát sinh khi điều khiển khác kết dính vào điều khiển này. - OnDockOver: Phát sinh khi một điều khiển được kéo di chuyển trên bề mặt điều khiển. - OnEnter: Phát sinh khi điều khiển nhận được chỉ điểm. - OnExit: Phát sinh khi điều khiển mất chỉ điểm. - OnKeyDown: Phát sinh khi người sử dụng nhấn phím. - OnKeyPress: Phát sinh khi ký tự hiển thị trên điều khiển. - OnKeyUp: Phát sinh người sử dụng nhả phím. - OnUnDock: Phát sinh khi huỷ bỏ neo đối tượng. 3.5 Các đối tượng, thành phần chuẩn của VCL. Trong mục này, chúng ta sẽ tìm hiểu tóm lược về các thành phần đặc trưng trong môi trường Windows. 50
  51. 3.5.1. Nút nhấn (Button) N út nhấn hoạt động rất đơn giản nhưng lại là thành phần rấ quan trọng trong các giao diện sử dụng đồ họa. Nút nhấn được sử dụng với nhiều mục đích khác nhau như các nút trên thanh công cụ, trên thanh tác vụ (taskbar), nút nhấn Start của Windows, hay kết hợp để tạo nên một công cụ mới như thanh trượt (Scrollbar), bao gồm nút nhấn của hai đầu có dạng hình mũi tên. Nút nhấn được C++ Builder thiết kế với lớp TButton. Sự kiện thường sử dụng nhất của nút nhất là OnClick. Nút nhấn rất đơn giản, chúng ta không thể thay đổi màu nền, màu chữ cho nút nhấn cũng như thêm hình ảnh vào nút nhấn. Tuy nhiên, chúng ta có thể thay đổi tên kiểu chữ và kích cỡ chữ cho nút nhấn. Để có thể thay đổi được màu nền và màu chữ, chúng ta phải sử dụng các đối tượng thuộc lớp TspeedButton, TbitButt. Thuộc tính thường dùng của đối tượng nút nhấn như: Caption (văn bản hiển thị trên đối tượng). Ví dụ sau, cho thấy cách sử dụng đối tượng nút nhấn trong một chương trình theo hình minh hoạ sau: Hình 18-Kết quả chương trình nút nhấn Khi chúng ta nhấn nút Thoát, chương trình sẽ thoát. Chúng ta thiết kế và viết mã lệnh theo hình sau: Hình 19- Thiết kế chương trình 3.5.2. Nhãn (Label) Nhãn là thành phần đơn giản nhất trong thư viện VCL. Đối tượng nhãn chỉ dùng để trình bày một chuỗi văn bản thông thường, nhằm mục đích mô tả thêm thông tin cho các đối tượng. Đối tượng văn bản vẫn là cách đơn giản để đưa kết quả hiển thị ra màn hình dưới dạng một chuỗi văn bản. Các thuộc tính thường dùng của đối tượng nhãn: Thuộc tính Ý nghĩa 51
  52. Caption Văn bản hiển thị trên nhãn Font Định kiểu chữ, kích cỡ chữ, Tranparen Cho phép màu nền trong suốt hay không t Ví dụ: Xây dựng chương trình cho kết quả như sau: Hình 20- Kết quả chương trình Label - B1: Chúng ta tạo ra một dự án mới, chọn thực đơn File/New/Application. - B2: Đặt một đối tượng Label lên trên biểu mẫu. - B3: Điều chỉnh các thuộc tính theo hình minh hoạ sau: Hình 21-Thiết kế chương trình nhãn - B4: Nhấn phím F9 để chạy chương trình. 52
  53. Trong ví dụ đầu tiên này, chúng ta sẽ tiến hành phân tích kỹ hơn ở ví dụ này: Trước tiên, chúng ta xét mã lệnh được sinh ra tự động với tập tin có phần mở rộng .cpp (cụ thể trong ví dụ này là Project1.cpp) // #include #pragma hdrstop // USEFORM("Unit1.cpp", Form1); // WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { try { Application->Initialize(); Application->CreateForm(__classid(TForm1), &Form1); Application->Run(); } catch (Exception &exception) { Application->ShowException(&exception); } catch ( ) { try { throw Exception(""); } catch (Exception &exception) { Application->ShowException(&exception); } } return 0; } Kế tiếp, chúng ta khảo sát thêm mã lệnh của biểu mẫu được khai báo với tên Form1, biểu mẫu này có kiểu dữ liệu là lớp TForm1. Tập tin sau là tập tin mã lệnh của Unit1, tập tin này mang tên Unit1.cpp // 53
  54. #include #pragma hdrstop #include "Unit1.h" // #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; // __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } Kế tiếp chúng ta xem xét tập tin .h (tập tin header đã đề cập ở trên) của Unit1.cpp , tập tin này mang tên Unit1.h: // #ifndef Unit1H #define Unit1H // #include #include #include #include // class TForm1 : public TForm { __published: // IDE-managed Components TLabel *Label1; private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; // extern PACKAGE TForm1 *Form1; // 54
  55. #endif Ở tập tin này cho thấy lớp TForm1 có nguồn gốc là lớp TForm, điều này có nghĩa là mọi thành phần trong lớp của TForm đều được chuyển sang TForm1, những thành phần được thêm vào khi thiết sẽ sẽ được thêm vào TForm1. Chẳng hạn đối tượng mang tên Label1 có kiểu Tlabel được khai báo trong quá trình thiết kế Form. Chú ý: Trong quá trình thiết kế, chúng ta chỉ nên sửa đổi những đoạn mã lệnh mà chúng ta thêm vào, không nên sửa đổi những đoạn mã lệnh mà C++ Builder đã tự sinh ra. Việc làm này cực kỳ nguy hiểm, có khả năng dẫn đến trình biên dịch sẽ không hiểu những gì mà nó đã sinh ra mà bị bạn thay đổi. Việc làm này chỉ có thể thực hiện nếu như chúng ta đã là một lập trình viên cao cấp hoặc chỉ sửa đổi trong trường hợp thật sự cần thiết. 3.5.3. Ô đánh dấu (Checkbox) Ô đánh dấu cho phép chúng ta chọn hoặc bỏ một yêu cầu nào đó bằng cách thể hiện một trong hai trạng thái: được đánh chéo hoặc không đánh chéo. Ô đánh đấu thường thể hiện trạng thái tắt-mở (on/off), có/không (yes/no), hoặc kết hợp nhiều tuỳ chọn khác nhau. Ô đánh dấu thuộc lớp TCheckbox. Thuộc tính thường sử dụng nhất của ô đánh dấu là thuộc tính Checked. Nếu Checked=false, đối tượng ô đánh dấu không được đánh dấu; Checked=true, đối tượng được đánh chéo. Mỗi khi trạng thái của đối tượng đánh dấu bị đổi trạng thái từ đánh chéo sang không đánh chéo hoặc ngược lại, sự kiện OnClick sẽ được phát sinh. Ví dụ sau bao gồm một nhãn và ba ô đánh dấu, mỗi khi một nút nhấn được đánh chéo, dòng văn bản trong nhãn sẽ đổi theo kiểu dáng chữ được đánh chéo. Kết quả minh hoạ như hình sau: Hình 22- Chương trình ô đánh dấu Trong ví dụ này, chúng ta thiết kế chương trình theo ưu thế của C++ Builder. Chúng ta sẽ thiết kế sự kiện OnClick cho ba đối tượng ô đánh chéo cùng một đoạn mã lệnh. Cửa sổ thiết kế biểu mẫu như sau: 55
  56. Hình 23-Thiết kế chương trình ô đánh dấu Bước 1: Tạo biểu mẫu với các đối tượng liệt kê từ trên xuống dưới như sau: Đối tượng Thuộc tính Giá trị Name Lbldongchu Caption Kiểu dáng chữ TLabel Font->Name VNI-Times Font->Size 18 Font->Color clRed Name chkdam Caption Chữ đậm TCheckbox Font->Name VNI-Times Font->Size 14 Name chknghieng Caption Chữ nghiêng TCheckbox Font->Name VNI-Times Font->Size 14 Name chkgachchan Caption Chữ gạch chân TCheckbox Font->Name VNI-Times Font->Size 14 Bước 2: Tra hướng dẫn bằng cách chọn thực đơn Help/C++ Builder Help, nhấn nút Help Topics và thực hiện theo các bước sau minh hoạ sau để biết khai báo của sự 56
  57. kiện OnClick theo các hình minh hoạ sau (những con trỏ chuột là vị trí chúng ta phải nhấn): Hình 24-Tra hướng dẫn và nhấn đội chuột lên vị trí Tcontrol Hình 25-Tra hướng dẫn nhấn chuột trái vào TNotifyEvent 57
  58. Hình 26- Hàm khai báo cho sự kiện OnClick Từ hình 22, chúng ta có khai báo của hàm cho sự kiện OnClick như sau: typedef void __fastcall (__closure *TNotifyEvent)(System::TObjectTObject* Sender); Bước 3: Chúng ta thiết kế một phương thức cho sự kiện OnClick của cả 3 sự kiện bằng cách thực hiện theo hai hình minh hoạ sau: Hình 27- Thêm phương thức 58
  59. Hình 28- Thêm phương thức Sau đó, thêm đoạn mã lệnh để đạt được kết quả sau: void __fastcall TForm1::checkboxclick(TObject* Sender) { //TODO: Add your source code here TFontStyles style; style=this->lblchumau->Font->Style; if (Sender==chkdam) { if (this->chkdam->Checked) style= style > fsBold; } else if (Sender==chknghieng) { if (this->chknghieng->Checked) style = style > fsItalic; } 59
  60. else { if (this->chkgachchan->Checked) style = style > fsUnderline; } this->lblchumau->Font->Style = style; } Bước 4: Chúng ta gắn phương thức trên với sự kiện OnClick của từng đối tượng ô đánh dấu ở trên như hình minh hoạ sau: Hình 29-Gắn phương thức cho sự kiện - Bước 5: Nhấn phím F9 để chạy chương trình. Trong đoạn mã lệnh trên, chúng ta chú ý về một kiểu dữ liệu mới được cung cấp trong C++ Builder, đó là kiểu dữ liệu tập hợp (Set), đây là kiểu dữ liệu tương thích với C++ Builder. Để thêm một phần tử vào tập hợp, chúng ta dùng phép toán >. Đoạn mã lệnh trên thực hiện so sánh xem đối tượng phát sinh sự kiện với từng đối tượng (Sender==chkdam, Sender = chknghieng, ) và kiểm tra thuộc tính Checked để cài đặt giá trị kiểu dáng chữ cho nhãn lbldongchu. 3.5.4. Ô chọn (RadioButton) Tương tự như đối tượng ô đánh dấu nhưng đối tượng ô chọn thường đi chung với nhau thành một nhóm và mỗi một thời điểm chỉ có một ô chọn được chọn, không như ô đánh dấu, mỗi một thời điểm có nhiều ô đánh dấu được đánh dấu. Chúng ta có thể tưởng tượng như một nút rà đài trên máy thu thanh, mỗi lần chỉ bắt và nghe được một đài duy nhất trong số nhiều đài mà thôi. Ô chọn có kiểu dữ liệu là lớp TRadioButton. Thuộc tính thường sử dụng nhất của ô chọn là Checked, nếu Checked=true thì ô chọn được chọn ngược lại thì ô chọn không được chọn. Ví dụ sau cho thấy cách dùng các đối tượng ô chọn kết hợp với việc dùng đối tượng thuộc lớp TActionList để dùng cho sự OnClick. Đối tượng ActionList là đối tượng 60
  61. không trực quan, nó chứa các hành động cho phép sử dụng bởi các thành phần và đối tượng. Chương trình chúng ta có kết quả là thay đổi màu sắc cho nhãn đặt trên biểu mẫu. Mỗi lần chỉ được chọn một màu bằng cách sử dụng ô chọn. Hình 30-Kết quả chương trình Radio Chúng ta tiến hành các bước thiết kế chương trình trên như sau: Bước 1: Chúng ta thực hiện thiết kế Form như sau: Hình 31- Cửa sổ thiết kế chương trình Radio Bước 2- Nhấn đôi chuột trái lên đối tượng ActionList1 ( ), chúng ta sẽ nhận được cửa sổ thiết kế các đối tượng hành động (Action) như sau: 61
  62. Hình 32-Cửa sổ thiết kế ActionList Bước 3 - Nhấn nút màu vàng trên góc trái để thêm một hành động mới, đặt tên cho hành động này để đạt kết quả như hình minh hoạ sau: Hình 33-Thiết kế đối tượng actrdoclick - Bước 4: Gắn kết các đối tượng ô chọn với đối tượng actrdoclick thông qua thuộc tính Action. - Bước 5: Điều chỉnh các thuộc tính theo bảng liệt kê các đối tượng từ trên xuống dưới như sau (Chú ý, các thuộc tính Caption được liệt kê giá trị theo bảng mã VNI, bởi C++ Builder 2006 trở về trước vẫn chưa hỗ trợ Unicode): Tên đối tượng Thuộc tính Giá trị ActionList1 Font->Name VNI-Times rdodo Font->Size 14 Caption Đỏ 62
  63. Font->Name VNI-Times rdoxanh Font->Size 14 Caption Xanh Font->Name VNI-Times rdovang Font->Size 14 Caption Đỏ Kết quả đạt được như sau: Hình 34-Thiết kế biểu mẫu cho chương trình radio - Bước 6: Viết mã lệnh cho sự kiện OnExcute theo hình minh hoạ và mã lệnh được liệt kê sau đây: Hình 35-Viết mã lệnh cho actrdoclick Mã lệnh: if (this->rdodo->Checked) this->lbldongchu->Font->Color = clRed; else if (this->rdovang->Checked) 63
  64. this->lbldongchu->Font->Color = clYellow; else this->lbldongchu->Font->Color = clBlue; Trong đoạn mã lệnh trên, chúng ta có sử dụng các hằng clRed (màu đỏ), clYellow (màu vàng), clBlue (màu xanh) và một từ khoá this, từ khoá này chỉ định rằng chúng ta đang chỉ định lớp hiện tại (tức là biểu mẫu đang thiết kế). Chú ý rằng trong đoạn mã lệnh trên chúng ta đã tinh lượt việc so sánh Sender với các đối tượng rdodo, rdoxanh và rdovangg giống như cách làm của chúng ta trong bài ô đánh dấu ở trên, bởi một lẽ dễ hiểu, chúng ta đã chủ ý viết đoạn mã lệnh trên chỉ để sử dụng cho ba đối tượng rdodo, rdoxanh, rdovang cũng như vào một thời điểm chỉ có thể chọn đúng một ô chọn mà thôi. - Bước 7: Nhấn phím F9 để chạy chương trình để đạt được kết quả như yêu cầu. 3.5.5. Ô văn bản Ô văn bản thuộc lớp TEdit, đây là thành phần nhập liệu đơn giản nhất dùng giao diện đồ hoạ. Chúng ta được phép nhập vào một chuỗi văn bản, chỉnh sửa, di chuyển con nháy để soạn thảo bằng các phím mũi tên. Đối tượng này chỉ cho phép nhập một dòng văn bản đơn. Thuộc tính thường sử dụng nhất của đối tượng ô văn bản là thuộc tính Text. Nó chứa đựng dòng văn bản hiển thị trên đối tượng cũng như văn bản người dùng nhập vào ô văn bản. Mỗi khi văn bản trên ô văn bản bị thay đổi, sự kiện OnChange sẽ được phát sinh. Ngoài ra, chúng ta còn có thể thay đổi màu nền, màu chữ và kiểu chữ. Chúng ta cũng có thể gán giá trị cho thuộc tính Enabled = false để cấm nhập văn bản vào ô văn bản, lúc này ô văn bản sẽ ở trạng thái chỉ đọc. Dưới đây là một ví dụ minh hoạ việc sử dụng các đối tượng ô văn bản, trong ví dụ này chúng ta sẽ sử dụng một phương thức dùng chung cho cả ba đối tượng ô nhập văn bản như cách làm của ví dụ ô đánh dấu ở trên. 64
  65. Hình 36-Kết quả chương trình edit Chú ý rằng, trong chương trình trên chúng ta có truy bắt lỗi một cách tự động. Nút nhấn có nhiệm vụ tính toán để ra được kết quả, còn ô đánh dấu nếu được đánh dấu, chúng ta sẽ truy bắt sự kiện OnChange để tính toán một cách tự động. Chúng ta bắt tay và thiết kế để đạt được chương trình trên theo các bước sau: Bước 1: Thiết kế để đạt được biểu mẫu sau (các chữ số dùng để đánh dấu, không phải thiết kế các chữ số): Hình 37-Cửa sổ thiết kế chương trình Edit Bảng sau liệt kê thuộc tính và đối tượng theo số đã đánh dấu trong hình: Số đánh dấu Đối tượng Thuộc tính Giá trị Name edtso1 1 Edit Font->Size 11 Font->Name VNI-Times Name edtpheptoan 2 Edit Font->Size 11 Font->Name VNI-Times Name edtso2 3 Edit Font->Size 11 Font->Name VNI-Times Name lblketqua 4 Label Font->Size 11 Font->Name VNI-Times 5 CheckBox Name chktudongtinhtoan Font->Size 11 65
  66. Font->Name VNI-Times Checked true Name lblloi 6 Label Font->Size 11 Font->Name VNI-Times Name btntinhtoan 7 Button Font->Size 11 Font->Name VNI-Times - Bước 2: Chúng ta viết mã lện cho sự kiện OnClick của nút nhấn btntinhtoan để đạt được đoạn mã lệnh sau: void __fastcall TForm1::btntinhtoanClick(TObject *Sender) { float so1,so2; float ketqua; this->lblloi->Caption = "Khong co loi"; this->lblketqua->Caption = ""; try { if (this->edtso1->Text.Trim()=="") so1=0; else so1=StrToFloat(this->edtso1->Text); if (this->edtso2->Text.Trim()=="") so2=0; else so2=StrToFloat(this->edtso2->Text); } catch (const Exception &E) { this->lblloi->Caption = "Class Error: " + E.ClassName() + "\n with error: " + E.Message ; return; } 66
  67. ketqua=0; try { if (this->edtpheptoan->Text.Trim()=="+") ketqua = so1+so2; else if (this->edtpheptoan->Text.Trim()=="-") ketqua=so1-so2; else if(this->edtpheptoan->Text.Trim()=="*") ketqua=so1*so2; else if (this->edtpheptoan->Text.Trim()=="/") if (so2==0) { this->lblloi->Caption = "Khong chia duoc. So chia bang 0"; return; } else ketqua=so1/so2; else { this->lblloi->Caption = "Phep toan bi sai" ; return; } this->lblketqua->Caption = "= " + FloatToStr(ketqua); } catch (const Exception &E) //truy bắt lỗi { this->lblloi->Caption = "Class Error: " + E.ClassName() + "\n with error: " + E.Message ; } } - Bước 3: Thêm phương thức editchange để gắn kết với sự kiện OnChange ba đối tượng edtso1, edtpheptoan, edtso2 nhằm thực hiện kiểm tra dữ liệu nhập vào và tính toán tự động: 67
  68. Hình 38-Thêm phương thức editchange Viết mã lệnh để đạt được đoạn mã lệnh sau: AnsiString text; TEdit *tam; this->lblloi->Caption = "Khong co loi"; tam = (TEdit *) Sender; text = tam->Text.Trim(); if (Sender==edtso1 || Sender==edtso2) { try { StrToFloat(text); //thu chuyen chuoi sang so } catch (const Exception &E) //truong truong hop bi loi { this->lblloi->Caption = "Class Error: " + AnsiString(E.ClassName()) + "\n with error: " + E.Message ; } else //truong hop la phep toan if (text!="+" && text!="-" && text!="*" && text!="/") this->lblloi->Caption = "Phep toan bi sai" ; if (!this->chktudongtinhtoan->Checked) return; //nếu không chọn tính tự động thì không tính toán this->btntinhtoanClick(Sender); //gọi sự kiện OnClick của Button 68
  69. Bước 4: Chọn Project/Build All Projects để biên dịch chương trình ra tập tin .EXE. Bước 5: Chạy chương trình bằng cửa sổ Explorer như minh hoạ sau: Hình 39-Thực thi chương trình Edit Lý do chính để chạy chương trình trong cửa sổ Explorer nhằm hiển thị truy bắt lỗi, nếu chúng ta chạy chương trình trong môi trường IDE của C++ Builder thì trình bắt lỗi sẽ hoạt động trước trình bắt lỗi của chúng ta, chẳng hạn, khi nhập edtso2 bằng b thì sẽ gặp bảng thông báo sau: Hình 40-Phát sinh lỗi do Debug Trong đoạn mã lệnh trên, chúng ta dùng cấu trúc truy bắt ngoại lệ (lỗi phát sinh) trong quá trình thực thi chương trình bằng cấu trúc: try { StrToFloat(text); //thu chuyen chuoi sang so } catch (const Exception &E) //truong truong hop bi loi { this->lblloi->Caption = "Class Error: " + AnsiString(E.ClassName()) + "\n with error: " + E.Message ; } Cấu trúc này nói lên rằng: Chúng ta đang thử chuyển dữ liệu từ chuỗi sang số, chuỗi được lưu trong biến text. Trong trường hợp không thành công (bị lỗi) sẽ gọi đoạn lệnh trong khối catch. Biến E là biến chứa lớp phát sinh ngoại lệ, với tên lớp Exception là tên lớp có cấp cao nhất trong cây kế thừa các ngoại lệ. Để bắt lỗi chính xác hơn, chúng ta phải biết mình đang thao tác với động tác gì và biết được lớp chính xác để truy bắt lỗi. Tham khảo 69
  70. thêm trong cửa sổ hướng dẫn của C++ Builder bằng cách gõ cụm từ khoá “exception classes, VCL,” (không có dấu nháy) vào ngăn Index trong cửa sổ hướng dẫn của C++ Builder . 3.5.6. Vùng văn bản Vùng văn bản (Memo) giải quyết hạn chế của đối tượng ô văn bản (Edit), bởi lẽ ô văn bản chỉ sử dụng một dòng để nhập văn bản trong khi đó Memo cho phép chúng ta nhập nhiều dòng văn bản. Các dòng văn bản trong vùng văn bản của C++ Builder được lưu trữ trong một thuộc tính tên Lines có kiểu TStrings. Các phương thức và thuộc tính của Lines được liệt kê trong bảng sau: Thuộc tính Ý nghĩa Lines->Add Thêm vào một dòng mới Lines->Count Số dòng trong vùng văn bản Lines->Clear Xoá hết tất cả các dòng đang có Lines->LoadFromFile Nạp các dòng văn bản từ tập tin Lines->SaveToFile Lưu các dòng văn bản vào tập tin Đối tượng vùng văn bản cũng cung cấp một thuộc tính Text, thuộc tính này chỉ có thê truy cập bằng mã lệnh. Thuộc tính Text chứa tất cả các dòng văn bản gộp lại, mỗi dòng các nhau bởi hai ký tự có mã 10 và 13 (ký tự về đầu dòng và xuống dòng). Ví dụ: Thực hiện chương trình đọc dòng văn bản từ tập tin ra vùng văn bản và ngược lại. Hình 41-Chương trình Memo Sự kiện thường sử dụng nhất của vùng văn bản là OnChange, sự kiện này xảy ra mỗi khi vùng văn bản bị sửa đổi hoặc được thêm dữ liệu vào. Chương trình trên, chúng ta dùng một đối tượng ô văn bản để nhập tên tập tin, hai đối tượng Button để đọc dữ liệu từ tập tin và lưu dữ liệu vào tập tin. 70
  71. Chúng ta thiết kế chương trình trên với hình minh hoạ và thuộc tính được liệt kê dưới đây: B1- Thiết kế biểu mẫu Hình 42-Thiết kế chương trình Memo Bảng liệt kê các đối tượng trên biểu mẫu từ trên xuống dưới; từ trái qua phải: Đối tượng Tên thuộc tính Giá trị Name Form1 Form Caption C++ Builder Editor Name Label1 Label Caption File name Font->Size 10 Name edtfilename Edit Text C:\Windows\Win.ini Font->Size 10 Name btnload Button Caption &Load Font->Size 10 Name btnsave Button Caption &Save Font->Size 10 Memo Name memeditor Font->Size 10 71
  72. Lines “” Anchors->akLeft true Anchors->akRight true Anchors->akTop true Anchors->akBotton true Scrollbars Both B2- Viết mã lệnh cho sự kiện OnClick của nút btnload như sau: void __fastcall TForm1::btnloadClick(TObject *Sender) { this->memeditor->Clear(); this->memeditor->Lines->LoadFromFile(this->edtfilename->Text); this->memeditor->Modified = false; //Đặt trạng thái bị chỉnh sửa là sai } B3- Viết mã lệnh cho sự OnClick của nút btnsave như sau: if (this->memeditor->Modified) this->memeditor->Lines->SaveToFile(this->edtfilename->Text ); B4- Nhấn F9 để thực thi chương trình. Chương trình trên được xây dựng với một vài thuộc tính mới. Chúng ta gặp thuộc tính Anchors, thuộc tính này gọi là neo. Đối tượng memeditor được neo vào bốn góc của biểu mẫu bằng cách điều chỉnh 4 thuộc tính Anchors->akLeft, Anchors->akRight, Anchors->akTop, Anchors->akBottom thành true. Thuộc tính ScrollBars sẽ cho phép chúng ta điều chỉnh và lựa chọn thanh cuộn sẽ hiển thị cùng đối tượng vùng văn bản. 3.5.7. Hộp danh sách Đối tượng danh sách chọn được C++ Builder thiết kế trong lớp TListBox. Đối tượng này cho phép chúng ta hiển thị một danh sách các phần tử nhằm cho phép người dùng chọn một hay nhiều phần tử từ danh sách. Các thuộc tính hay dùng của đối tượng danh sách được liệt kê trong bảng sau: Thuộc Ý nghĩa tính/phương thức Items Chứa danh sách các phần tử MultiSelect Cho phép hay không cho phép chọn một lúc nhiều phần tử Sorted Các phần tử được hiển thị có sắp xếp hay không 72