Giáo trình Lập trình ứng dụng WPF - Trình độ: Trung cấp - Trường Cao đẳng kỹ thuật công nghệ

docx 168 trang Gia Huy 16/05/2022 2690
Bạn đang xem 20 trang mẫu của tài liệu "Giáo trình Lập trình ứng dụng WPF - Trình độ: Trung cấp - Trường Cao đẳng kỹ thuật cô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:

  • docxgiao_trinh_lap_trinh_ung_dung_wpf_trinh_do_trung_cap_truong.docx

Nội dung text: Giáo trình Lập trình ứng dụng WPF - Trình độ: Trung cấp - Trường Cao đẳng kỹ thuật công nghệ

  1. BM/QT10/P.ĐTSV/04/04 Ban hành lần: 3 UBND TỈNH BÀ RỊA – VŨNG TÀU TRƯỜNG CAO ĐẲNG KỸ THUẬT CÔNG NGHỆ GIÁO TRÌNH MÔ ĐUN: LẬP TRÌNH ỨNG DỤNG WPF NGHỀ: CÔNG NGHỆ THÔNG TIN TRÌNH ĐỘ: TRUNG CẤP (Ban hành kèm theo Quyết định số: /QĐ-CĐKTCN ngày .tháng .năm của Hiệu trưởng Trường Cao đẳng Kỹ thuật Công nghệ BR – VT) BÀ RỊA-VŨNG TÀU, NĂM 2020.
  2. TUYÊN BỐ BẢN QUYỀN Nhằm đáp ứng nhu cầu học tập và nghiên cứu cho giảng viên và sinh viên nghề Công nghệ Thông tin trong trường Cao đẳng Kỹ thuật Công nghệ Bà Rịa – Vũng Tàu, chúng tôi đã thực hiện biên soạn tài liệu Lập trình ứng dụng WPF này. Tài liệu được biên soạn thuộc loại giáo trình phục vụ giảng dạy và học tập, lưu hành nội bộ trong Nhà trường 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 mang tính 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.
  3. LỜI GIỚI THIỆU Giáo trình Lập trình ứng dụng WPF được biên soạn dựa trên khung chương trình đào tạo Cao đẳng nghề Công nghệ Thông tin đã được Trường Cao đẳng Kỹ thuật Công nghê Bà Rịa – Vũng Tàu phê duyệt. Bên cạnh đó nhằm giúp cho người học các kiến thức và kỹ năng cần thiết để thiết kế và lập trình được các ứng dụng nhỏ trong cuộc sống hằng ngày . Tác giả đã nghiên cứu một số tài liệu, trang web liên quan kết hợp với kinh nghiệm làm việc, giảng dạy thực tế để biên soạn giáo trình này. Trong giáo trình này bao gồm các bài sau: Bài 1: Tổng quan về WPF Bài 2: Bố trí giao diện Bài 3: Sử dụng các điều khiển cơ bản Bài 4: Tạo hộp chọn font chữ Bài 5: Tạo hộp chọn hình ảnh Bài 6: Sử dụng Expander Bài 7: Tạo hộp soạn thảo văn bản Bài 8: Tạo menu Bài 9: Tạo ToolBar Bài 10: Tạo ContextMenu Bài 11: Tạo StatusBar Bài 12: Sử dụng Style Bài 13: Sử dụng Template Bài 14: Truy xuất cơ sở dữ liệu 1
  4. Với tiêu chí trình bày cô động, dễ hiểu áp dụng thực tế, kèm theo chi tiết các bước hướng dẫn thực hành cụ thể giúp cho người học dễ tiếp thu các kiến thức cần thiết và hình thành được kỹ năng thực hành và rèn luyện thao tác. Trong quá trình biên soạn, chắc chắn giáo trình còn nhiều thiếu sót. Tác giả rất mong nhận được ý kiến đóng góp của quý thầy/cô và các em sinh viên để tiếp tục hoàn thiện hơn. Xin chân thành cảm ơn quý đồng nghiệp, bạn bè đã có những ý kiến đóng góp trong quá trình xây dựng giáo trình này. Bà Rịa – Vũng Tàu, ngày tháng năm 2020 Tham gia biên soạn 1. Trần Thị Thanh Hương – Chủ biên 2
  5. MỤC LỤC LỜI GIỚI THIỆU 1 BÀI 1: GIỚI THIỆU TỔNG QUAN 10 1. Giới thiệu các ứng dụng thực tế 10 2. Khởi động, thoát chương trình 11 3. Sử dụng hệ thống trợ giúp 15 Câu hỏi ôn tập và bài tập 15 BÀI 2: CÁC THÀNH PHẦN CƠ BẢN 16 1. Hệ thống ký hiệu và từ khóa 16 2. Các kiểu dữ liệu cơ bản 17 3. Biến, hằng, biểu thức 19 4. Các phép toán 21 Câu hỏi ôn tập và bài tập 26 BÀI 3: SỬ DỤNG CÂU LỆNH NHẬP XUẤT CƠ BẢN, CẤU TRÚC ĐIỀU KHIỂN IF 28 1. Các câu lệnh nhập xuất cơ bản 28 2. Câu lệnh if else 32 Câu hỏi ôn tập và bài tập 36 BÀI 4: SỬ DỤNG CẤU TRÚC LỰA CHỌN SWITCH CASE, FOR, FOR EACH 37 1. Câu lệnh switch 37 2. Câu lệnh for 39 3. Câu lệnh for each 48 Câu hỏi ôn tập và bài tập 51 BÀI 5: SỬ DỤNG CẤU TRÚC LỰA VÒNG LẶP WHILE, DO WHILE 53 1. Sử dụng cấu trúc vòng lặp While 53 2. Sử dụng cấu trúc vòng lặp Do while 56 Câu hỏi ôn tập và bài tập 58 3
  6. BÀI 6: SỬ DỤNG CÂU LỆNH BREAK, CONTINUE, GOTO 59 1. Sử dụng câu lệnh break 59 2. Sử dụng câu lệnh continue 60 3. Sử dụng câu lệnh goto 61 Câu hỏi ôn tập và bài tập 63 BÀI 7: HÀM 64 1. Khái niệm 64 2. Quy tắc xây dựng hàm 64 3. Nguyên tắc hoạt động của hàm 65 4. Cách truyền tham số 67 5. Sử dụng hàm 68 Câu hỏi ôn tập và bài tập 71 BÀI 8: THIẾT KẾ LỚP ĐỐI TƯỢNG 72 1. Định nghĩa lớp đối tượng 72 2. Khai báo lớp đối tượng 73 Câu hỏi ôn tập và bài tập 76 BÀI 9 : ĐỊNH NGHĨA CÁC THUỘC TÍNH, PHƯƠNG THỨC HÀNH ĐỘNG CHO LỚP ĐỐI TƯỢNG 77 1. Định nghĩa các thuộc tính cho lớp đối tượng 77 2. Định nghĩa các phương thức hành động cho lớp đối tượng 79 Câu hỏi ôn tập và bài tập 82 BÀI 10: SỬ DỤNG FORM, MENUSTRIP 84 1. Form 84 2. Menustrip 95 Câu hỏi ôn tập và bài tập 98 BÀI 11: SỬ DỤNG LABEL, TEXTBOX, BUTTON 101 1. Label 101 2. TextBox 104 4
  7. 3. Button 107 Câu hỏi ôn tập và bài tập 109 BÀI 12: SỬ DỤNG CHECKBOX, RADIOBUTTON, GROUPBOX 112 1. Checkbox 112 2. RadioButton 114 3. GroupBox 117 Câu hỏi ôn tập và bài tập 121 BÀI 13: SỬ DỤNG COMBOBOX, LISTBOX 123 1. ComboBox 123 2. ListBox 125 Câu hỏi ôn tập và bài tập 128 BÀI 14: SỬ DỤNG DATETIMEPICKER, MONTHCALENDAR 129 1. DateTimePicker 129 2. MonthCalendar 130 Câu hỏi ôn tập và bài tập 132 BÀI 15: SỬ DỤNG LISTVIEW, TREEVIEW 133 1. ListView 133 2. TreeView 138 Câu hỏi ôn tập và bài tập 142 BÀI 16: SỬ DỤNG PICTUREBOX, TOOLTIP 144 1. PictureBox 144 2. ToolTip 145 Câu hỏi ôn tập và bài tập chưa làm 148 BÀI 17: SỬ DỤNG CHECKLISTBOX, NUMERICUPDOWN 149 1. CheckListBox 149 2. NumericUpDown 151 Câu hỏi ôn tập và bài tập 153 BÀI 18: SỬ DỤNG PANEL, SPLITCONTAINER, TABCONTROL 155 5
  8. 1. Panel 155 2. SplitContainer 156 3. TabControl 160 Câu hỏi ôn tập và bài tập 165 BÀI 19: TẠO KẾT NỐI, ĐÓNG KẾT NỐI CƠ SỞ DỮ LIỆU 167 1. Các kiểu dữ liệu kết nối 167 2. Tạo kết nối dữ liệu 170 3. Đóng kết nối cơ sở dữ liệu 175 Câu hỏi ôn tập và bài tập 176 BÀI 20: TRUY XUẤT CƠ SỞ DỮ LIỆU BẰNG DATASET 177 1. Định nghĩa Dataset. 177 2. Thao tác truy xuất dữ liệu với Dataset. 178 Câu hỏi ôn tập và bài tập 180 BÀI 21: HIỂN THỊ CƠ SỞ DỮ LIỆU BẰNG DATAGRIDVIEW 182 1. Ý nghĩa DataGridView 182 2. Các thiết lập thuộc tính 184 3. Truy xuất và hiển thị dữ liệu trên control DataGridView 185 Câu hỏi ôn tập và bài tập 188 BÀI 22: TRUY XUẤT CƠ SỞ DỮ LIỆU BẰNG BINDINGSOURCE 190 1. Ý nghĩa BindingSource 190 2. Cách thiết lập các thành phần 191 3. Truy xuất và hiển thị dữ liệu trên BindingSource 191 Câu hỏi ôn tập và bài tập 192 BÀI 23: HIỂN THỊ CƠ SỞ DỮ LIỆU BẰNG BINDINGNAVIGATOR 193 1. Ý nghĩa BindingNavigator 193 2. Cách thiết lập các thành phần 194 3. Truy xuất và hiển thị dữ liệu trên BindingNavigator 195 Câu hỏi ôn tập và bài tập 196 6
  9. BÀI 24: THAO TÁC VỚI CƠ SỞ DỮ LIỆU 197 1. Các kiểu dữ liệu, cập nhật cơ sở dữ liệu 197 2. Truy xuất và cập nhật dữ liệu 199 Câu hỏi ôn tập và bài tập 201 7
  10. GIÁO TRÌNH MÔ ĐUN Tên mô đun: Lập trình ứng dụng WPF Mã mô đun: MĐ 24 Vị trí, tính chất, ý nghĩa và vai trò của mô đun: - Vị trí của mô đun: được bố trí sau khi học xong các môn cơ sở và Lập trình Windows. - Tính chất của mô đun: là mô đun nghề tự chọn của trình độ Cao đẳng nghề Công nghệ Thông tin, cung cấp kiến thức và kỹ năng tạo ứng dụng WPF với giao diện chuyên nghiệp. - Ý nghĩa và vai trò của môn học/mô đun: Môn học giúp làm quen với ứng dụng WPF, thực hành được các giao diện lập trình ứng dụng nhỏ như: quản lý quán café, quản lý khách sạn, quản lý nhân viên, quản lý sinh viên . Mục tiêu của mô đun: - Về kiến thức: + Biết ưu điểm của XAML, WPF trong phát triển ứng dụng Windows + Biết quy trình tạo project WPF + Biết công dụng của các loại panel, control trong WPF + Trình bày công dụng của Menu, Toolbar, ContextMenu, StatusBar + Trình bày công dụng và quy trình sử dụng Style, Template + Biết quy truy xuất CSDL trong WPF - Về kỹ năng: + Tạo project WPF + Sử dụng hợp lý các loại panel, control trong thiết kế giao diện cho ứng dụng WPF + Tạo Menu, Toolbar, ContextMenu, StatusBar cho ứng dụng + Sử dụng Style và Control Template cho giao diện + Sử dụng Data Template hiển thị dữ liệu + Truy xuất CSDL trong WPF - Về năng lực tự chủ và trách nhiệm: + Lưu solution, project đúng đường dẫn 8
  11. + Tự phát triển ứng dụng với giao diện chuyên nghiệp + Tham gia phát triển ứng dụng quản lý cho các tổ chức, doanh nghiệp, công ty phần mềm + Rèn luyện và nâng cao kỹ năng lập trình theo công nghệ hiện đại + Vận dụng ngôn ngữ XAML trong việc tự học thiết kế giao diện cho các ứng dụng di động + Thực hiện các bài thực hành đảm bảo đúng trình tự, an toàn. Nội dung của mô đun: 9
  12. BÀI 1: GIỚI THIỆU TỔNG QUAN Mã bài: 20.1 Giới thiệu: Windows Presentation Foundation hay gọi tắt là WPF – là một nền tảng cho phép developer có thể tạo ra các ứng dụng trên nền .NET framework cho Windows nói chung. Cũng có thể gọi WPF là một GUI framework. Nó ra đời sau Winform và tốt hơn người tiền nhiệm về mọi mặt Mục tiêu: - Trình bày được khái và mục tiêu cơ bản của WPF - Trình bày được khái niệm và vai trò của XAML trong việc tạo môi trường làm việc chung giữa người thiết kế giao diện và người lập trình - Tạo được ứng dụng WPF đơn giản - Đảm bảo quy tắc thẻ mở, đóng - Lưu project, solution đúng đường dẫn Nội dung chính: 1. Khái niệm WPF WPF, viết tắt của Windows Presentation Foundation, là hệ thống API mới hỗ trợ việc xây dựng giao diện đồ hoạ trên nền Windows. Được xem như thế hệ kế tiếp của WinForms, WPF tăng cường khả năng lập trình giao diện của lập trình viên bằng cách cung cấp các API cho phép tận dụng những lợi thế về đa phương tiện hiện đại. Là một bộ phận của .NET Framework 3.0, WPF sẵn có trong Windows Vista và Windows Server 2008. Đồng thời, WPF cũng có thể hoạt động trên nền Windows XP Service Pack 2 hoặc mới hơn, và cả Windows Server 2003. WPF được xây dựng nhằm vào ba mục tiêu cơ bản: ▪ Cung cấp một nền tảng thống nhất để xây dựng giao diện người dùng; ▪ Cho phép người lập trình và người thiết kế giao diện làm việc cùng nhau một cách dễ dàng; ▪ Cung cấp một công nghệ chung để xây dựng giao diện người dùng trên cả Windows và trình duyệt Web. 10
  13. ▪ Trước khi WPF ra đời, việc tạo giao diện người dùng theo những yêu cầu mô tả ở ví dụ trên đòi hỏi sử dụng rất nhiều công nghệ khác nhau (xem Bảng 2.1). Để tạo form, các control và các tính năng kinh điển khác của một giao diện đồ họa Windows, thông thường lập trình viên sẽ chọn Windows Forms, một phần của .NET Framework. Nếu cần hiển thị văn bản, Windows Forms có một số tính năng hỗ trợ văn bản trực tiếp hoặc có thể sử dụng Adobe’s PDF để hiển thị văn bản có khuôn dạng cố định. Đối với hình ảnh và đồ họa 2 chiều, lập trình viên sẽ dùng GDI+, một mô hình lập trình riêng biệt có thể truy nhập qua Windows Forms. Để hiển thị video hay phát âm thanh, lập trình viên lại phải sử dụng Windows Media Player, và với đồ họa 3 chiều, anh ta lại phải dùng Direct3D, một thành phần chuẩn khác của Windows. Tóm lại, quá trình phát triển giao diện người dùng theo yêu cầu trở nên phức tạp, đòi hỏi lập trình viên quá nhiều kỹ năng công nghệ. Windows Windows WPF Forms/ Forms GDI+ Giao diện đồ họa (form và các X X control) On-screen văn X X bản Fixed-format X văn bản Hình ảnh X X Video và âm X thanh Đồ họa 2 chiều X X Đồ họa 3 chiều X Bảng 1.1. Thành phần giao diện theo yêu cầu và những công nghệ chuyên biệt cần thiết để tạo chúng. 11
  14. 2. Các thành phần của WPF Giống như các thành phần khác của .NET Framework, WPF tổ chức các chức năng theo một nhóm namespace cùng trực thuộc namespace System.Windows. Bất kể chức năng nào được sử dụng, cấu trúc cơ bản của mọi ứng dụng WPF đều gần như nhau. Là ứng dụng Windows độc lập hay là một XBAP, một ứng dụng WPF điển hình bao giờ cũng gồm một tập các trang XAML và phần code tương ứng được viết bằng C# hoặc Visual Basic, còn gọi là các file code-behind. Tất cả các ứng dụng đều kế thừa từ lớp chuẩn Application của WPF. Lớp này cung cấp những dịch vụ chung cho mọi ứng dụng, chẳng hạn như các biến lưu trữ trạng thái của ứng dụng, các phương thức chuẩn để kích hoạt hay kết thúc ứng dụng. Mặc dù WPF cung cấp một nền tảng thống nhất để tạo giao diện người dùng, những công nghệ mà WPF chứa đựng có thể phân chia thành những thành phần độc lập. Nhân của WPF là cơ chế tạo sinh đồ họa dựa trên vector và độc lập với độ phân giải nhằm tận dụng những lợi thế của phần cứng đồ họa hiện đại. WPF được mở rộng với các tập tính năng phát triển ứng dụng bao gồm XAML, các control, cơ chế móc nối dữ liệu, layout, đồ họa 2 chiều, ba chiều, hoạt họa, style, khuôn dạng mẫu, văn bản, media, text và in ấn. WPF nằm trong .NET Framework, nên ngoài ra, ứng dụng WPF có thể kết hợp các thành Mặc dù WPF cung cấp một nền tảng thống nhất để tạo giao diện người dùng, những công nghệ mà WPF chứa đựng có thể phân chia thành những thành phần độc lập. Nhân của WPF là cơ chế tạo sinh đồ họa dựa trên vector và độc lập với độ phân giải nhằm tận dụng những lợi thế của phần cứng đồ họa hiện đại. WPF được mở rộng với các tập tính năng phát triển ứng dụng bao gồm XAML, các control, cơ chế móc nối dữ liệu, layout, đồ họa 2 chiều, ba chiều, hoạt họa, style, khuôn dạng mẫu, văn bản, media, text và in ấn. WPF nằm trong .NET Framework, nên ngoài ra, ứng dụng WPF có thể kết hợp các thành phần khác có trong thư viện lớp của .NET Framework. 12
  15. Hình 1.1. Các thành phần cơ bản của WPF 3.1 Layout và Control Để sắp đặt các thành phần khác nhau trên giao diện, ứng dụng WPF sử dụng panel. Mỗi panel có thể chứa các thành phần con, bao gồm các control như nút bấm hay hộp thoại, hay bản than những panel khác. Những loại panel khác nhau cho phép sắp xếp thành phần con theo những cách khác nhau. Ví dụ, DockPanel cho phép các thành phần con có thể được đặt dọc theo cạnh của panel đó, trong khi Grid cho phép sắp đặt các thành phần con của nó trên một lưới tọa độ. Giống như bất kỳ một công nghệ giao diện người dùng nào, WPF cung cấp một số lượng lớn các control. Ngoài ra, người dùng có thể tùy ý định nghĩa các control theo ý mình. Các control chuẩn gồm Button, Label, TextBox, ListBox, Menu, Slider, hay phức tạp hơn có SpellCheck, PasswordBox Các sự kiện do người dùng tạo ra, như di chuyển chuột hay ấn phím, có thể được các control nắm bắt và xử lý. Trong khi các control và các thành phần giao diện khác có thể được đặc tả đầy đủ bằng XAML, các sự kiện bắt buộc phải được xử lý bằng mã trình. 3.2 Style và Template 13
  16. Giống như sử dụng Cascading Style Sheets (CSS) đối với HTML, việc định ra thuộc tính đồ họa cho các đối tượng giao diện một lần, rồi sau đó áp dụng lại cho các đối tượng khác cùng loại thường rất tiện lợi. WPF cũng cung cấp tính năng tương tự bằng việc sử dụng thành phần Style của XAML. Ví dụ, kiểu ButtonStyle có thể được định nghĩa như sau: Bất kỳ nút bấm nào sử dụng kiểu này sẽ có nền màu đỏ và sử dụng font chữ kích thước 16. Ví dụ: Một Style có thể được dẫn xuất từ một Style khác, thừa kế hoặc chồng lên những thuộc tính đã thiết lập. Mỗi style có thể định nghĩa các trigger cho phép tạo ra những hiệu ứng tương tác đặc biệt, chẳng hạn như khi lướt chuột qua nút bấm, nút bấm chuyển thành màu vàng. WPF cũng hỗ trợ sử dụng template. Mỗi template tương tự như một style, và ở hai dạng: - Template cho dữ liệu: sử dụng thành phần DataTemplate của XAML để thiết lập một nhóm thuộc tính hiển thị của dữ liệu như màu sắc, phương thức căn lề - Template cho control: sử dụng thành phần ControlTemplate của XAML để định ra diện mạo của một control. 3.3. Text Giao diện người dùng ít nhiều đều hiển thị chữ hay text. Đối với phần lớn mọi người, đọc text trên màn hình thường khó hơn đọc trên giấy in. Đó là do chất lượng hiển thị text trên màn hình kém hơn so với khi in ra giấy. WPF tập trung giải quyết vấn đề này, làm chất lượng text hiển thị trên màn hình tương đương trên giấy in. Cụ thể, WPF hỗ trợ các font chữ OpenType chuẩn, cho phép sử dụng các thư viện font đã có. WPF cũng hỗ trợ công nghệ font chữ mới ClearType, 14
  17. cho phép hiển thị các ký tự mịn hơn đối với mắt người, đặc biệt là trên màn hình tinh thể lỏng (LCD). Để nâng cao hơn nữa chất lượng hiển thị text, WPF cho phép một số công nghệ khác như chữ ghép, theo đó một nhóm ký tự được thay thế bằng một ảnh đơn nhất, tạo tâm lý thoải mái hơn khi đọc đối với người dùng. 3.4. Văn bản WPF hỗ trợ ba dạng văn bản: văn bản cố định (fixed), văn bản thích nghi (flow/adaptive) và văn bản XPS (XML Paper Specification). Kèm theo đó, WPF cũng cung cấp các dịch vụ để tạo, xem, quản lý, ghi chú, đóng gói và in ấn văn bản. Văn bản cố định trông không đổi bất kể chúng được hiển thị trên màn hình hay in ra máy in. Trong WPF, những văn bản dạng này được định nghĩa bằng phần tử FixedDocument trong XAML và được hiển thị bằng control DocumentViewer. Trong khi đó, văn bản thích nghi thường chỉ dùng để đọc trên màn hình, và có khả năng tự động thay đổi các thuộc tính hiển thị ảnh và text cho phù hợp với kích thước cửa số hay các yếu tố môi trường khác nhằm nâng cao chất lượng đọc cho người dùng. Văn bản thích nghi được định nghĩa bằng phần tử FlowDocument. Để hiển thị văn bản thích nghi, WPF sử dụng một số control khác nhau, chẳng hạn như FlowDocumentPageViewer, FlowDocumentScrollViewer, FlowDocumentReader Hình 1.2. Minh họa về văn bản thích nghi trong WPF. Văn bản XPS xây dựng trên cơ sở văn bản bất động của WPF. XPS là một định dạng mở theo đặc tả XML, có khả năng sử dụng trên nhiều nền tảng khác 15
  18. nhau, được thiết kế nhằm tạo thuận lợi cho việc xây dựng, chia sẻ, in ấn và lưu trữ văn bản. Cũng như văn bản cố định, văn bản XPS được hiển thị bằng DocumentViewer. Hình 1.3. Minh họa về văn bản XPS trong WPF. 3.5. Hình ảnh Trong WPF, hình ảnh được hiển thị nhờ control Image, ví dụ: Control Image có thể hiển thị hình ảnh lưu trữ dưới nhiều khuôn dạng khác nhau, bao gồm JPEG, BMP, TIFF, GIF và PNG. Nó cũng có thể hiển thị hình ảnh dạng Windows Media Photo mới được sử dụng trong Windows Vista. Bất kể ở khuôn dạng nào, WPF sử dụng Windows Imaging Component (WIC) để tạo ra hình ảnh. Cùng với các codec dùng cho các khuôn dạng ảnh kể trên, WIC cũng cung cấp một nền tảng chung để bổ sung codec khác. 3.6. Video và âm thanh Khi tốc độ của các bộ xử lý và truyền thông mạng ngày một nâng cao, video trở thành một phần tương tác lớn của người dùng với phần mềm. Người dùng cũng sử dụng nhiều thời gian để nghe nhạc và các dạng âm thanh khác trên máy tính. Do đó, WPF cung cấp tính năng hỗ trợ cả hai dạng media này thông qua phần tử MediaElement. Control này có thể chơi các định dạng video WMV, MPEG và AVI, và nhiều định dạng âm thanh khác nhau. Việc lập trình để chạy một đoạn video trở nên khá đơn giản, như trong ví dụ sau: 16
  19. 3.7. Đồ họa 2 chiều Trong 20 năm gần đây, việc tạo ra đồ họa hai chiều trên Windows dựa trên Graphics Device Interface (GDI) và phiên bản sau của nó GDI+. Các ứng dụng Windows Forms phải sử dụng chức năng này thông qua một namespace khác hoàn toàn, bởi bản thân Windows Forms không tích hợp đồ họa 2 chiều. Đối với đồ họa 3 chiều thì càng tồi hơn, Windows Forms phải dựa trên công nghệ hoàn toàn biệt lập là Direct3D. Với WPF, vấn đề trở nên đơn giản hơn nhiều. Cả đồ họa 2 chiều và 3 chiều đều có thể được tạo ra trực tiếp trong XAML hoặc trong code sử dụng thư viện WPF tương ứng. Đối với đồ họa 2 chiều, WPF định ra nhóm control của các khuôn hình (shapes) mà ứng dụng có thể sử dụng để tạo nên hình ảnh, gồm: • Line: vẽ đường thẳng qua 2 điểm. • Elllipse: vẽ ellipse. • Rectangle: vẽ chữ nhật. • Polygon: vẽ đa giác. • Polyline: vẽ đa giác mở. • Path: vẽ hình theo một đường bất kỳ. Mỗi khuôn hình đều có các thuộc tính phong phú cho phép hiển thị với nhiều tính chất khác nhau: màu nền, màu biên Một đặc điểm quan trọng trong WPF là: vì mọi thứ đều được xây dựng trên một nền chung, việc kết hợp các đặc tính và đối tượng khác nhau, chẳng hạn, lồng một ảnh vào một hình chữ nhật, trở nên đơn giản. Điểm thú vị nữa là các đối tượng hình học này còn có thể thu nhận các sự kiện từ phía người dùng như một control, chẳng hạn sự kiện nhắp chuột. Ngoài ra, WPF cũng cung cấp một nhóm chức năng hình học khác, gọi là geometries, để làm việc với đồ họa hai chiều, như LineGeometry, RectangleGeometry, EllipseGeometry, và PathGeometry. Dạng hình 17
  20. học này có nhiều thuộc tính và chức năng tương tự như các khuôn hình đã nêu trên. Điểm khác biệt quan trọng nhất là các geometries không được dùng để hiển thị, chúng được dùng chủ yếu để tính toán hình học, ví dụ như để định ra các vùng miền, theo dõi vị trí bấm chuột Thêm vào đó, WPF cung cấp lớp Transform cho phép thực hiện các biến đổi hình học như xoay, dịch chuyển, co giãn đối tượng đồ họa; hoặc cho phép thực hiện các hiệu ứng hoạt họa theo thời gian thông qua các lớp Animation và Timing. 3.8. Đồ họa 3 chiều WPF hỗ trợ đồ họa 3 chiều bằng việc gói các lời gọi API của Direct3D, và do vậy, việc sử dụng chúng trở nên thống nhất và đơn giản hơn đáng kể. Để hiển thị đồ họa ba chiều, ứng dụng WPF sử dụng control Viewport3D. Để tạo ra các cảnh ba chiều, lập trình viên mô tả một hay nhiều mô hình, sau đó, phân định cách thức các mô hình này được chiếu sáng hay hiển thị. Như thường lệ, điều này được thực hiện bằng XAML, bằng code hay trộn cả hai. Để mô tả mô hình, WPF cung cấp lớp GeometryModel3D để tạo ra hình dạng của mô hình. Khi mô hình đã được định hình, diện mạo bên ngoài của nó có thể được điều khiển bằng việc phủ lên các vật liệu (material). Chẳng hạn, lớp SpecularMaterial cho phép tạo bóng trên bề mặt mô hình. Bất kể được làm từ vật liệu gì, một mô hình có thể được chiếu sáng theo nhiều cách. Lớp DirectionalLight cho phép ánh sáng tới từ một hướng xác định, trong khi lớp AmbientLight tạo ra ánh sáng đồng đều trên mọi vật trong cảnh. Cuối cùng, để định ra cách nhìn cảnh, lập trình viên phải định ra một camera. Ví dụ, PerspectiveCamera cho phép phân định khoảng cách từ vị trí nhìn tới vật thể và kiểu nhìn phối cảnh (tuân theo luật gần xa). 18
  21. Hình 1. 4. Thiết lập đối tượng đồ họa ba chiều với WPF Xây dựng cảnh ba chiều trực tiếp bằng XAML hay mã trình đều không đơn giản. Do đó, chỉ nên dùng ứng dụng WPF để hiển thị cảnh ba chiều, việc xây dựng cảnh nên được thực hiện bằng những công cụ đồ họa chuyên biệt. 3.9. Kết nối dữ liệu Phần lớn các ứng dụng được tạo ra đều cung cấp cho người dùng phương tiện để xem và sửa đổi dữ liệu. Trong các ứng dụng WPF, việc lưu trữ và truy xuất dữ liệu đã được thực hiện bởi các công nghệ như Microsoft SQL Server và ADO.NET. Sau khi dữ liệu được truy xuất và tải vào các đối tượng quản lý dữ liệu trên ứng dụng, phần việc khó khăn của ứng dụng WPF mới bắt đầu. Về cơ bản, có hai công việc phải thực hiện: - Sao chép dữ liệu từ các đối tượng quản lý dữ liệu vào các control trên giao diện, qua đó, dữ liệu có thể được hiển thị hay sửa đổi. - Đảm bảo rằng những thay đổi trên dữ liệu từ các control được cập nhật trở lại các đối tượng quản lý dữ liệu Để đơn giản hóa quá trình phát triển ứng dụng, WPF cung cấp một cơ chế móc nối dữ liệu để thực hiện tự động những bước này. Phần nhân của cơ chế móc nối dữ liệu là lớp Binding mà nhiệm vụ của nó là liên kết control trên giao diện (đích) với đối tượng quản lý dữ liệu (nguồn). Mối quan hệ này được minh họa trong hình dưới đây: 19
  22. Hình 1.5. Quan hệ giữa đối tượng dữ liệu và đối tượng phụ thuộc Việc hỗ trợ móc nối dữ liệu được xây dựng ngay từ nhân của WPF. Tất cả các đối tượng đồ họa trong WPF đều kế thừa từ DependencyObject, chúng là các đối tượng phụ thuộc. Chức năng mà lớp cơ sở này hỗ trợ cho phép thực hiện hiệu ứng hoạt họa, tạo kiểu mẫu (styling) và móc nối dữ liệu. Các đối tượng này đều mang một thuộc tính đặc biệt gọi là DependencyProperty, thuộc tính phụ thuộc. Phần lớn các thuộc tính hay dùng như Text, Content, Width, Height, vân vân đều là các thuộc tính phụ thuộc. Tất cả các thuộc tính phụ thuộc đều có thể tạo hiệu ứng hoạt họa, tạo kiểu và kết nối dữ liệu. Cơ chế móc nối dữ liệu trong WPF còn cung cấp thêm những tính năng như xác thực tính hợp lệ, sắp xếp, lọc và phân nhóm dữ liệu. Thêm vào đó, tính năng móc nối dữ liệu cũng hỗ trợ sử dụng khuôn mẫu dữ liệu (data template) để tạo ra các đối tượng giao diện tùy biến có kết nối dữ liệu, khi các control chuẩn không phù hợp. Móc nối dữ liệu và khuôn dạng dữ liệu có thể được coi là tính năng mạnh nhất của WPF. 3. Tạo ứng dụng WPF đầu tiên 20
  23. Chọn loại ứng Chọn ngôn ngữ dụng lập trình Đặt tên và nơi lưu Màn hình thiết kết Quản lý Project Hộp điều khiển Cửa sổ thuộc Màn hình tính XAML Viết code cho đoạn chương trình trên, khi nhấp chọn vào nút Button, label sẽ hiển thị nội dung “Chào mừng các bạn đến với môn học Lập trình WPF”. 21
  24. Kết quả chương trình Câu hỏi ôn tập và bài tập 1. WPF là giao diện lập trình như thế nào? 2. Màn hình XAML dùng để làm gì? 3. Tiến hành cài đặt Visual Studio trên máy tính. 4. Tạo các ứng dụng project bằng lưu trữ trên máy tính gồm bài tập với tên: LTWPF1 thực hành ví dụ đã học trong bài. 22
  25. BÀI 2: BỐ TRÍ GIAO DIỆN Mã bài: 20.2 Giới thiệu: Bài này giới thiệu cách thức bố trí giao diện trong ứng dụng WPF. Phần đầu sẽ giới thiệu về các dạng panel, một sự đổi mới trong phương thức bố trí giao diện của ứng dụng WPF so với MFC, VB Forms hay ngay cả Windows Forms nhằm tăng tính linh hoạt. Sau đó, các dạng panel thông dụng cùng với đặc tính của chúng sẽ được trình bày thông qua các ví dụ đơn giản. Mục tiêu: - Trình bày được công dụng của các dạng Panel - Lựa chọn đúng loại Panel theo từng yêu cầu của giao diện - Xây dựng được giao diện bằng các dạng Panel - Xây dựng được giao diện bằng XAML - Tạo một Window/Page đơn giản - Đảm bảo an toàn cho người và thiết bị. Nội dung chính: 1. Giới thiệu chung Như đã giới thiệu trong bài mở đầu, WPF sử dụng các dạng panel khác nhau để bố trí các phần tử trên giao diện người dùng. Điều này xuất phát từ ý tưởng kết hợp công nghệ giao diện mạnh như Windows Forms, với các kỹ thuật sắp đặt (layout) của trình duyệt nhằm nâng cao tính linh hoạt trong việc bố trí các phần tử trên giao diện. Các công nghệ xây dựng giao diện như VB6 form, Access forms dựa trên nguyên tắc bố trí theo vị trí tuyệt đối. Nghĩa là, người lập trình phải xác định giá trị tọa độ góc trên bên trái của một control (so với với góc trên bên trái của một form) khi muốn đặt nó lên form. Điều này cho phép lập trình viên điều khiển vị trí của control khá dễ dàng, nhưng lại thường đòi hỏi một lượng lớn mã trình khi cần thay đổi kích thước form. Đây là phương pháp tiếp cận theo hướng áp đặt (imperative), trong đó máy tính được chỉ rõ phải làm những bước gì, khi nào và theo trình tự nào. Với cách thức bố trí này, các điều khiển như Label hay Panel 23
  26. không tự động kéo giãn để phù hợp với kích thước phần nội dung chứa trong nó. Và như vậy, nếu phần nội dung của một Label lớn hơn vùng có thể hiển thị của Label đó, thì nội dung này sẽ bị cắt đi hoặc bị che lấp. Trong khi đó, các phần tử giao diện Web trên trình duyệt được sắp xếp theo phương thức khai báo (declarative), trong đó, người lập trình chỉ đưa ra những thứ cần làm, còn máy tính sẽ giải quyết vấn đề làm như thế nào. Với phương thức này, giao diện trên trình duyệt không đòi hỏi mã trình để thay đổi kích thước các vùng chứa (containner). HTML cho phép ta định ra một chuỗi các vùng chứa, ví dụ như các phần tử , , và , để bố trí các phần tử UI khác trong đó một cách linh động bên phải hoặc bên trái một đối tượng; hay cũng có thể sắp xếp chúng theo vị trí tuyệt đối trên trang Web. Các phần tử như quan tâm tới kích thước bên trong nội dung của nó và sẽ tự động giãn ra để chứa đủ nội dung bên trong. Tuy nhiên, cả hai cách tiếp cận nêu trên đều khó có thể đạt được cách bố trí như ý, mặc dù cách bố trí trên trình duyệt có giảm lượng code xử lý. Hiện nay, Windows Forms đưa thêm những khái niệm như Docking (cập bến) hay Anchoring (buông neo), bổ sung một cách tiếp cận kiểu khai báo linh hoạt hơn để phát triển các ứng dụng trên máy trạm. WPF tiếp bước xu hướng này với việc bố trí giao diện dựa trên khái niệm về panel. Phần lớn các phần tử UI trong ứng dụng WPF chỉ có thể chứa duy nhất một phần tử con. Chẳng hạn, đoạn mã XAML sau sẽ mắc lỗi biên dịch sau: “The 'Button' object already has a child and cannot add 'CheckBox'. 'Button' can accept only one child." Nghĩa là, đối tượng nút bấm ‘Button’ đã chứa một phần tử con (cụ thể là đối tượng ‘TextBlock’) và do đó, không thể thêm vào một đối tượng ‘CheckBox’ hay ‘ComboBox’ nữa. Đoạn mã chương trình sau sẽ không được thực hiện vì không có các Panel để chưa đựng chúng. Có thể sử dụng nhiều Panel lồng nhau hoặc các Panel cùng cấp để chứa các điều khiển 24
  27. Đoạn chương trình XAML sau đây sẽ dược thực hiện bằng cách tạo các TextBlock, CheckBox, Combo trong Panel Kết quả chương trình 2. Sử dụng các Panel thông dụng Thay đổi Form được chạy đầu tiên trong màn hình làm việc của App.xaml 2.1. StackPanel 25
  28. StackPanel bố trí các phần tử con nằm trong nó bằng cách sắp xếp chúng theo thứ tự trước sau. Các phần tử sẽ xuất hiện theo thứ tự mà chúng được khai báo trong file XAML theo chiều dọc (ngầm định) hoặc theo chiều ngang. 2.1.1 Sắp xếp theo chiều dọc Đoạn mã XAML minh họa việc sắp xếp các phần tử UI trong một đối tượng Window bằng StackPanel theo chiều dọc: Kết quả chương trình: Trong trường hợp sắp xếp theo chiều dọc, nếu tổng chiều cao của các phần tử con lớn hơn chiều cao của form chứa, thì các phần tử nằm ngoài form sẽ không được nhìn thấy. 2.1.1. Sắp xếp theo chiều ngang Sau đây là đoạn mã XAML minh họa việc sử dụng StackPanel để sắp xếp các phần tử UI cùng ví dụ ở trên theo chiều ngang. Điểm khác biệt duy nhất ở 26
  29. đây là thiết lập thêm thuộc tính Orientation="Horizontal" của đối tượng StackPanel được sử dụng. Kết quả chương trình: Trong trường hợp sắp xếp theo chiều ngang, nếu tổng chiều rộng của các phần tử con lớn hơn chiều rộng của form chứa, thì các phần tử nằm ngoài form sẽ không được nhìn thấy. 2.2. WrapPanel WrapPanel cho phép sắp xếp các phần tử từ trái sang phải. Khi một dòng phần tử đã điền đầy khoảng không gian cho phép theo chiều ngang, WrapPanel sẽ cuốn phần tử tiếp theo xuống đầu dòng tiếp theo (tương tự như việc cuốn text). 27
  30. Dưới đây là một ví dụ đơn giản về việc sử dụng WrapPanel: Do chiều dài tổng cộng của 3 control lớn hơn chiều dài của Window, đồng thời, chiều dài của 2 control đầu (TextBlock và Button) nhỏ hơn chiều dài Window, WrapPanel sẽ xếp TextBlock cuối cùng xuống hàng dưới. Kết quả là: 2.3. DockPanel DockPanel cho phép các phần tử bám lên các cạnh của panel DockPanel bao chứa chúng, tương tự như khái niệm Docking trong Windows Forms. Nếu như có nhiều phần tử cùng bám về một cạnh, chúng sẽ tuân theo thứ tự mà chúng được khai báo trong file XAML. Sau đây là đoạn mã XAML minh họa việc sử dụng DockPanel: 28
  31. Phần tử Border cuối cùng sẽ điền vào phần không gian còn lại vì thuộc tính DockPanel.Dock không xác định. Kết quả là: 2.4. CanvasPanel Panel dạng Canvas sử dụng phương thức sắp xếp các phần tử UI theo vị trí tuyệt đối bằng cách đặt thuộc tính Top (đỉnh) và Left (bên trái) của chúng. Thêm vào đó, thay vì đặt thuộc tính Top, Left, ta có thể đặt thuộc tính Bottom (đáy), Right (bên phải). Nếu ta đặt đồng thời thuộc tính Left và Right, thuộc tính Right sẽ bị bỏ qua. Phần tử UI sẽ không thay đổi kích thước để thỏa mãn 2 thuộc tính trên cùng một lúc. Tương tự thuộc tính Top sẽ được ưu tiên hơn thuộc tính Bottom. Các phần tử được khai báo sớm hơn trong file XAML sẽ có thể bị che khuất phía dưới các phần tử được khai báo muộn hơn nếu vị trí của chúng xếp chồng lên nhau. Sau đây là một ví dụ minh họa việc sử dụng Canvas để sắp xếp các phần tử UI. 29
  32. Vị trí của phần tử TextBlock đầu tiên và phần tử Border được đặt theo thuộc tính Top, Left, trong khi đó, phần tử Button được sắp vị trí theo thuộc tính Bottom, Right. Border sẽ nằm chồng lên TextBlock đầu tiên vì có sự xếp chồng về vị trí của hai phần tử này. Thêm vào đó, TextBlock đầu được khai báo trước Border trong đoạn mã XAML. Kết quả là: 2.5. Grid Panel dạng Grid là dạng panel hết sức linh hoạt, và có thể sử dụng để đạt được gần như tất cả khả năng mà các dạng panel khác có thể làm được, mặc dù mức độ khó dễ không giống nhau. Grid cho phép ta phân định các dòng và cột theo dạng một lưới kẻ ô, và sau đó sẽ sắp đặt các phần tử UI vào các ô tùy ý. Grid sẽ tự động chia đều các dòng và cột (dựa trên kích thước của phần nội dung). Tuy nhiên, ta có thể sử dụng dấu sao (*) để phân định kích thước theo tỉ lệ hoặc phân định giá trị tuyệt đối về chiều cao hoặc chiều rộng cho hàng và cột. Ta có thể nhận biết sự khác biệt của 2 dạng phân định kích thước nêu trên bằng cách thay đổi kích thước của form chứa panel Grid. Thêm vào đó, thuộc tính 30
  33. ShowGridLines được đặt bằng True cho phép hiển thị các đường kẻ ô. Sau đây là một ví dụ minh họa về việc sử dụng Grid với hai dạng phân định: Câu hỏi ôn tập và bài tập 2. Tạo một project dưới dạng Console thực hiện khai báo các loại biến sau: Biến chieudai, chieurong, chuvi, dientich kiểu dữ liệu int 31
  34. Biến so1, so2, so3, min, max kiểu số thực (float) 2. Tạo một project dưới dạng Console thực hiện khai báo các loại hằng sau: Hằng số thực p = 3.14 Hằng số nguyên n = 100 phần tử mảng 32
  35. BÀI 3: SỬ DỤNG CÁC ĐIỀU KHIỂN CƠ BẢN Mã bài: 20.3 Giới thiệu: Trong lập trình giao diện người dùng, điều kiển (Control) là các nhân tố quan trọng cấu thành nên giao diện người dùng, cho phép họ giao tiếp với ứng dụng. Control có thể được hiểu một cách đơn giản là các phần tử trên một cửa sổ như các nhãn (Label), hộp soạn thảo (TextBox), nút bẩm (Button), hộp danh sách (ListBox, ComboBox), để hiển thị các thông tin tới người dùng và cho phép người dùng nhập thông tin cần thiết cho chương trình. Phần này giới thiệu cách tạo lập và sử dụng các Control cơ bản nhất của cửa sổ xây dựng bằng công nghệ WPF. Mục tiêu: - Trình bày được khái niệm về control - Trình bày các control cơ bản trong WPF - Dùng các control để xây dựng giao diện trong WPF - Đảm bảo an toàn cho người và thiết bị Nội dung chính: 1. Quy trình tạo điều khiển Điểm khác biệt cơ bản giữa mã lệnh tạo giao diện dựa trên WPF so với phương pháp cũ là ứng dụng WPF sử dụng các đặc tả XAML (ngoài việc sử dụng mã lệnh C# hay VB.Net) để định nghĩa giao diện, trong khi phương pháp cũ phải sử dụng trực tiếp mã lệnh của C# hay VB.Net để định nghĩa giao diện. Ví dụ, để xây dựng giao diện cửa sổ đơn giản như Hình 3.1 dưới đây. Hình 3.1. Ví dụ cơ bản về các điều khiển 33
  36. Có thể tạo giao diện bằng đoạn mã XAML So sánh với code bằng Lập trình Windows Forms với ngôn ngữ C# namespace Baitapcoban1 { partial class frmdangnhap { /// /// Required designer variable. /// private System.ComponentModel.IContainer components = null; /// /// Clean up any resources being used. /// /// true if managed resources should be disposed; otherwise, false. protected override void Dispose(bool disposing) { if (disposing && (components != null)) { components.Dispose(); } base.Dispose(disposing); } #region Windows Form Designer generated code /// /// Required method for Designer support - do not modify /// the contents of this method with the code editor. /// private void InitializeComponent() { this.label1 = new System.Windows.Forms.Label(); this.label2 = new System.Windows.Forms.Label(); this.textBox1 = new System.Windows.Forms.TextBox(); this.textBox2 = new System.Windows.Forms.TextBox(); this.button1 = new System.Windows.Forms.Button(); this.button2 = new System.Windows.Forms.Button(); this.SuspendLayout(); // // label1 // this.label1.AutoSize = true; 34
  37. this.label1.Location = new System.Drawing.Point(76, 70); this.label1.Name = "label1"; this.label1.Size = new System.Drawing.Size(45, 13); this.label1.TabIndex = 0; this.label1.Text = "Họ đệm"; // // label2 // this.label2.AutoSize = true; this.label2.Location = new System.Drawing.Point(76, 107); this.label2.Name = "label2"; this.label2.Size = new System.Drawing.Size(29, 13); this.label2.TabIndex = 1; this.label2.Text = "Tên:"; // // textBox1 // this.textBox1.Location = new System.Drawing.Point(164, 68); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(102, 20); this.textBox1.TabIndex = 2; // // textBox2 // this.textBox2.Location = new System.Drawing.Point(164, 104); this.textBox2.Name = "textBox2"; this.textBox2.Size = new System.Drawing.Size(102, 20); this.textBox2.TabIndex = 3; // // button1 // this.button1.Location = new System.Drawing.Point(84, 160); this.button1.Name = "button1"; this.button1.Size = new System.Drawing.Size(105, 32); this.button1.TabIndex = 4; this.button1.Text = "Xem thông tin"; this.button1.UseVisualStyleBackColor = true; // // button2 // this.button2.Location = new System.Drawing.Point(228, 160); this.button2.Name = "button2"; this.button2.Size = new System.Drawing.Size(62, 32); this.button2.TabIndex = 5; this.button2.Text = "Nhập lại"; this.button2.UseVisualStyleBackColor = true; // // frmdangnhap // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.ClientSize = new System.Drawing.Size(800, 450); this.Controls.Add(this.button2); this.Controls.Add(this.button1); this.Controls.Add(this.textBox2); this.Controls.Add(this.textBox1); this.Controls.Add(this.label2); this.Controls.Add(this.label1); this.Name = "frmdangnhap"; this.Text = "frmdangnhap"; this.ResumeLayout(false); this.PerformLayout(); } 35
  38. #endregion private System.Windows.Forms.Label label1; private System.Windows.Forms.Label label2; private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.TextBox textBox2; private System.Windows.Forms.Button button1; private System.Windows.Forms.Button button2; } } Như vậy, điều chúng ta cần là tìm hiểu các thẻ XAML để mô tả các Control cần thiết. Tuy nhiên bạn không cần phải lo lắng nếu như chưa quen với các mã lệnh XAML (dựa trên XML) này vì bộ công cụ từ Visual Studio.Net 2008 đã hỗ trợ thiết kế giao diện trực quan và tự động sinh mã XAML tương ứng. 2. Tạo các điều khiển cơ bản 2.1. Label (Nhãn) Nhãn (Label) là các điều kiển để hiển thị các văn bãn tĩnh, thường được sử dụng để làm nhãn cho các control khác như Textbox, ListBox, ComboBox, . Điều khiển Label trên của sổ Toolbox Hình 3.2. Điều khiển Label 36
  39. Hình 3.3. Ví dụ về Label Label đuợc mô tả bằng đoạn mã XAML sau: Nhãn đuợc bắt đầu và kết thúc là , nội dung cũa nhãn là đoạn văn bản đặt giữa cặp thẻ này. Trong ví dụ này “Họ đệm:” là nội dung của nhãn. Bên trong thẻ có rất nhiều đặc tính để mô tả về thẻ, trong đó: - Height="30” : Độ cao của khung nhãn là 30px - HorizontalAlignment="Left" : Nhãn được căn trái trong cửa sổ - Margin="10,15,0,0" : có 4 giá trị là Left,Top,Right,Bottom - Name="label1" : Tên của nhãn là lablel1 - VerticalAlignment="Top" :Nhãn được căn theo đỉnh của cửa sổ. - Width="60": Chiều rộng của nhãn là 60px 37
  40. Đặt tên Label Thuộc tính Label Sự kiện Label Hình 3.4. Mô tả thuộc tính và sự kiện của Label Bảng 3.1. Bảng mô tả các sự kiện của Label Sự kiện Mô tả Thực hiện công việc nào đó khi một phím được nhấn KeyDown xuống KeyUp Thực hiện công việc nào đó khi một phím được nhả ra Loaded Khi nhãn được hiển thị lên Form LostFocus Khi con trỏ chuột thoát khỏi Label MouseEnter Chuột nằm trong vùng thấy được của Label MouseLeave Chuột ra khỏi vùng nhập liệu của Label MouseMove Chuột được di chuyển trên Label DataContextChanged Giá trị nội dung trong Label bị thay đổi 2.2. TextBox(Hộp soạn thảo) Hộp soạn thảo (TextBox) là control cho phép người dùng nhập dữ liệu dạng văn bản. Điều khiển Textbox trên của sổ Toolbox Hình 3.5. Điều khiển Textbox 38
  41. Ví dụ về điều khiển Textbox trên Form Hình 3.6. Ví dụ điều khiển Textbox Dưới đây là đoạn mã XAML của hộp soạn thảo Hộp soạn thảo được tạo nên bởi thẻ . Nếu muốn thiết lập sẵn nội dung mặc định cho hộp soạn thảo, ta đặt nội dung này vào giữa cặp thẻ Nội dung . Nếu không muốn đặt giá trị mặc định thì không cần thẻ đóng . Thẻ cũng có nhiều đặc tính, trong đó: - Margin="80,17,30,0": Cách lề trái 80, đỉnh cửa sổ 17, cạnh phải 30 - Name="textBox1": Tên của hộp soạn thảo là textBox1 - VerticalAlignment="Top": Căn theo đỉnh cửa sổ Đặc điểm của hộp soạn thảo với các đặc tính trên là khi người dùng co dãn, thay đổi kích thước cửa sổ, chiều rộng của hộp soạn thảo tự động co dãn theo. Các sự kiện thường được sử dụng khi dùng điều khiển TextBox 39
  42. Bảng 3.2. Bảng mô tả các sự kiện của Textbox Sự kiện Mô tả Thực hiện công việc nào đó khi một phím được nhấn KeyDown xuống KeyUp Thực hiện công việc nào đó khi một phím được nhả ra Loaded Khi Textbox được hiển thị lên Form LostFocus Khi con trỏ chuột thoát khỏi Textbox MouseDoubleClick Khi sự kiện nhấp đôi chuột trái MouseDown Khi nhấp trái chuột MouseEnter Chuột nằm trong vùng thấy được của Textbox MouseLeave Chuột ra khỏi vùng nhập liệu của Textbox MouseMove Chuột được di chuyển trên Textbox TextChanged Giá trị nội dung trong Textbox bị thay đổi 2.3. Button( Nút bấm) Nút bấm (Button) là loại điều khiển cho phép người dùng nhấn chuột để chọn lệnh, khi nhấn vào nút bấm, nó sẽ sinh ra sự kiện Click và sẽ chạy các lệnh gắn với sự kiện này. Điều khiển Button trên hộp Toolbox Hình 3.7. Điều khiển Button 40
  43. Hình 3.8. Minh họa về điều khiển Button Đoạn code phát sinh điều khiển Button trên XAML (chú ý lệnh mở và đóng thẻ) Nút bấm được bắt đầu bằng thẻ và kết thúc bằng thẻ . Nhãn của nút bấm được đặt trong cặp thẻ Nhãn nút bấm . Nút bấm có nhiều đặc tính, trong đó: - Height="35": Chiều cao nút bấm là 35 - Width="110": Chiều rộng là 110 - HorizontalAlignment="Left": Căn theo lề trái - VerticalAlignment="Bottom": Căn theo đáy cửa sổ - Margin="16,0,0,27": Cách lề trái 16, cách đáy 27 - Name="button1": Tên nút bấm là button1 Bảng 3.3. Bảng mô tả các sự kiện của Button Sự kiện Mô tả Click Nhấp chuột vào điều khiển Thực hiện công việc nào đó khi một phím được nhấn KeyDown xuống KeyUp Thực hiện công việc nào đó khi một phím được nhả ra Loaded Khi điều khiển được hiển thị lên Form LostFocus Khi con trỏ chuột thoát khỏi Button MouseDoubleClick Khi sự kiện nhấp đôi chuột trái MouseEnter Chuột nằm trong vùng thấy được của Button 41
  44. MouseLeave Chuột ra khỏi vùng nhập liệu của Button MouseMove Chuột được di chuyển trên Button Ví dụ về sự kiện Click với Button “Xem thông tin” ở trên Code được lập trình trong file .cs như sau: Kết quả chương trình khi nhấp vào nút “Xem thông tin” Hình 3.9. Kết quả chương trình khi chạy Form 42
  45. 2.4. RadioButton Radio Button: là hộp chọn theo nhóm, nghĩa là các hộp trong cùng một nhóm sẽ loại trừ nhau, tại một thời điểm người dùng chỉ được chọn một trong các mục. Vi dụ như hộp chọn giới tính, ta phải sử dụng radio vì tại một thời điểm chỉ cho phép chọn Nam hoặc Nữ Điều khiển RadioButton trên Toolbox Hình 3.10. Điều khiển Button Giao diện Button trên Form khi hiển thị Radiobutton Hình 3.11. Form hiển thị RadioButton Đoạn mã XAML khi tạo Radiobutton 43
  46. Radiobuttonđược tạo bởi thẻ và kết thúc bởi , giữa cặp thẻ này là nhãn của RadioButton Nhãn . Thẻ này có đặc tính IsChecked="True" hoặc IsChecked="False". Mục nào có thuộc tính này sẽ được tự động chọn khi cửa sổ bắt đầu hiển thị. Đối với Radio Button, vì là hộp chọn loại trừ, nếu trong một cửa sổ có nhiều nhóm Radio Button khác nhau thì các Radio Button của mỗi nhóm đuợc phân biệt bởi đặc tính GroupName="TenNhom". Ví dụ, trên cùng một cửa sổ có hai Radio Button chọn Giới tính (Nam; Nữ) và ba Radio Button khác chọn nghề nghiệp (Kinh doanh; Kỹ Thuật; Marketing) thì các Radio Button Nam, Nu phải có cùng GroupName với nhau, ba Radio Button Kinh doanh, Ky Thuat, Marketting phải có cùng GroupName và khác với GroupName của nhóm giới tính. Đoạn mã lệnh minh họa kiểm tra mục chọn RadioButton Kết quả chương trình 44
  47. Hình 3.12. Kết quả hiển thị khi chọn RadioButton Bảng 3.4. Bảng mô tả các sự kiện của RadioButton Sự kiện Mô tả Checked Khi RadioButton được đánh dấu chọn Click Khi sự kiện chuột được sử dụng Thực hiện công việc nào đó khi một phím được nhấn KeyDown xuống KeyUp Thực hiện công việc nào đó khi một phím được nhả ra Loaded Khi RadioButton được hiển thị lên Form LostFocus Khi con trỏ chuột thoát khỏi RadioButton MouseDoubleClick Khi sự kiện nhấp đôi chuột trái MouseDown Khi nhấp trái chuột MouseEnter Chuột nằm trong vùng thấy được của RadioButton MouseLeave Chuột ra khỏi vùng nhập liệu của RadioButton MouseMove Chuột được di chuyển trên RadioButton UnChecked Khi RadioButton được bỏ dấu chọn 2.5. CheckBox CheckBox: là hộp chọn mà người dùng có thể chọn một hoặc nhiều mục cùng một lúc. Vi dụ như mục chọn Ngoại ngữ, cho phép người dùng chọn đồng thời nhiều mục. 45
  48. Hình 3.13. Hiển thị điều khiển CheckBox Hiển thị CheckBox trên màn hình khi chạy chương trình CheckBox Hình 3.14. CheckBox khi chạy chương trình Đoạn code hiển thị CheckBox bằng câu lệnh XAML CheckBox được tạo bởi thẻ và kết thúc bởi , giữa cặp thẻ này là nhãn của CheckBox Nhãn . Thẻ có đặc tính IsChecked="True" hoặc IsChecked="False". Mục nào có thuộc tính này sẽ được tự động chọn khi cửa sổ bắt đầu hiển thị. Đoạn code sử dụng câu lệnh và điều khiển CheckBox 46
  49. Kết quả chương trình: Hình 3.15. Kết quả khi chạy chương trình Bảng 3.5. Bảng mô tả các sự kiện của CheckBox Sự kiện Mô tả Checked Khi CheckBox được đánh dấu chọn Click Khi sự kiện chuột được sử dụng Thực hiện công việc nào đó khi một phím được nhấn KeyDown xuống KeyUp Thực hiện công việc nào đó khi một phím được nhả ra 47
  50. Loaded Khi CheckBox được hiển thị lên Form LostFocus Khi con trỏ chuột thoát khỏi CheckBox MouseDoubleClick Khi sự kiện nhấp đôi chuột trái MouseDown Khi nhấp trái chuột MouseEnter Chuột nằm trong vùng thấy được của CheckBox MouseLeave Chuột ra khỏi vùng nhập liệu của CheckBox MouseMove Chuột được di chuyển trên CheckBox UnChecked Khi RadioButton được bỏ dấu chọn 2.6. ListBox Hộp danh sách (ListBox) và là điều khiển hiển thị một danh sách các mục theo từng dòng và cho phép người dùng chọn một hay nhiều phẩn tử của danh sách. Hình 3.16. Hiển thị của điều khiển ListBox Ví dụ về hộp danh sách chọn Quê quán: 48
  51. Hình 3.17. Hiển thị điều khiển ListBox trên Form Đoạn mã lệnh XAML để tạo ListBox ListBox được tạo bởi thẻ và kết thúc bằng thẻ đóng Mỗi phần tử của danh sách nằm trong cặp thẻ Nhãn lồng bên trong cặp thẻ trên. Đặc tính SelectedIndex="k" để yêu cầu tự động chọn phần thử thứ n trong danh sách khi mở cửa sổ. Phần tử đầu tiên của danh sách có giá trị là 0, phần tử cuối cùng là n-1. Nếu muốn khi mở cửa sổ không chọn phần tử nào thì đặt giá trị k bằng -1. Đoạn mã lệnh lấy mục chọn từ ListBox 49
  52. Kết quả khi chạy chương trình Bảng 3.6. Bảng mô tả các sự kiện của ListBox Sự kiện Mô tả Thực hiện công việc nào đó khi một phím được nhấn KeyDown xuống KeyUp Thực hiện công việc nào đó khi một phím được nhả ra Loaded Khi Textbox được hiển thị lên Form LostFocus Khi con trỏ chuột thoát khỏi Textbox MouseDoubleClick Khi sự kiện nhấp đôi chuột trái MouseDown Khi nhấp trái chuột MouseEnter Chuột nằm trong vùng thấy được của Textbox MouseLeave Chuột ra khỏi vùng nhập liệu của Textbox MouseMove Chuột được di chuyển trên Textbox TextChanged Giá trị nội dung trong Label bị thay đổi 2.7. ComboBox 50
  53. Bảng 3.2. Bảng mô tả các sự kiện của Textbox Sự kiện Mô tả Thực hiện công việc nào đó khi một phím được nhấn KeyDown xuống KeyUp Thực hiện công việc nào đó khi một phím được nhả ra Loaded Khi Textbox được hiển thị lên Form LostFocus Khi con trỏ chuột thoát khỏi Textbox MouseDoubleClick Khi sự kiện nhấp đôi chuột trái MouseDown Khi nhấp trái chuột MouseEnter Chuột nằm trong vùng thấy được của Textbox MouseLeave Chuột ra khỏi vùng nhập liệu của Textbox MouseMove Chuột được di chuyển trên Textbox TextChanged Giá trị nội dung trong Label bị thay đổi Câu hỏi ôn tập và bài tập 1. Viết chương trình cho phép người dùng nhập tên của mình và hiển thị câu: Môn học Lập trình Windows Form chào bạn + . 2. Viết chương trình nhập vào các thông tin: • Tên • Tuổi • Địa chỉ Xuất ra màn hình theo định dạng: Bạn tên , tuổi, ở 51
  54. BÀI 4: SỬ DỤNG CẤU TRÚC LỰA CHỌN SWITCH CASE, FOR, FOR EACH Mã bài: 20.4 Giới thiệu: Cũng giống như những ngôn ngữ khác các câu lệnh lặp và câu lệnh rẽ nhánh giúp chúng ta xử lý được các nhu cầu thực tế trong lập trình như việc chọn lựa nhiều giá trị tùy theo từng điều kiện khác nhau. Đồng thời, tiến hành lặp lại các công việc cụ thể nào đó trong một giới hạn lặp nhất đinh Mục tiêu: - Hiểu và biết sử dụng cấu trúc lệnh switch case. - Hiểu và biết sử dụng cấu trúc lệnh for, for each. - Vận dụng cấu trúc lệnh switch case để viết chương trình Console cơ bản - Vận dụng cấu trúc for, for each để viết chương trình Console cơ bản - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 3. Câu lệnh switch Khi có quá nhiều điều kiện để chọn thực hiện thì dùng câu lệnh if sẽ rất rối rắm và dài dòng, Các ngôn ngữ lập trình cấp cao đều cung cấp một dạng câu lệnh switch liệt kê các giá trị và chỉ thực hiện các giá trị thích hợp. C# cũng cung cấp câu lệnh nhảy switch có cú pháp sau: switch ( ) { case : ; break; case : ; break; . . . case : ; break; default: ; break; } 52
  55. Trong đó: • switch, case, default là từ khóa bắt buộc. • phải là biểu thức trả về kết quả kiểu: o Số nguyên (int, long, byte, . . .) o Ký tự hoặc chuỗi (char, string) Kiểu liệt kê • với i = 1 n là giá trị muốn so sánh với giá trị của . • với i = 1 n là câu lệnh muốn thực hiện khi tương ứng bằng với giá trị của . • là câu lệnh sẽ được thực hiện nếu giá trị không bằng với nào. Ý nghĩa: Duyệt lần lượt từ trên xuống dưới và kiểm tra xem giá trị của có bằng với đang xét hay không. Nếu bằng thì thực hiện tương ứng. Nếu không bằng tất cả các thì sẽ thực hiện . Cũng tương tự như câu lệnh if, biểu thức để so sánh được đặt sau từ khóa switch, tuy nhiên giá trị so sánh lại được đặt sau mỗi các từ khóa case. Giá trị sau từ khóa case là các giá trị hằng số nguyên như đã đề cập trong phần trước. Nếu một câu lệnh case được thích hợp tức là giá trị sau case bằng với giá trị của biểu thức sau switch thì các câu lệnh liên quan đến câu lệnh case này sẽ được thực thi. Tuy nhiên phải có một câu lệnh nhảy như break, goto để điều khiển nhảy qua các case khác.Vì nếu không có các lệnh nhảy này thì khi đó chương trình sẽ thực hiện tất cả các case theo sau. Để dễ hiểu hơn ta sẽ xem xét ví dụ dưới đây. Ví dụ: Nhập vào một số tự nhiên từ 0 6. Cài đặt màu mặc định cho các số thứ tự. Nhập vào một số bất kỳ in ra màu sắc đã chọn 53
  56. Kết quả thực hiện chương trình Hình 4.1. Kết quả chương trình lệnh switch case 2. Câu lệnh for Cú pháp: for ([Khởi tạo]; [Điều kiện lặp]; [Bước lặp lại]) { // Khối lệnh được lặp lại. Có thể bỏ trống } Trong đó: • Các phần [Khởi tạo]; [Điều kiện lặp]; [Bước lặp lại] hoàn toàn có thể để trống như ví dụ sau. • Mỗi đoạn [Khởi tạo]; hay [Điều kiện lặp]; hay [Bước lặp lại] là một câu lệnh riêng. Tiến trình: • Ban đầu trình biên dịch sẽ di vào phần khởi tạo chạy đoạn lệnh khởi tạo. 54
  57. • Tiếp theo kiểm tra điều kiện lặp. Rồi thực hiện khối code bên trong vòng lặp for. Khi đến ký hiệu } thì sẽ quay lên bước lặp lại. • Sau đó lại kiểm tra điều kiện lặp rồi tiếp tục thực hiện đoạn code trong khối lệnh. Đến khi điều kiện lặp không còn thõa mãn thì sẽ kết thúc vòng lặp for. • Trường hợp khác: • for (; ;) // lưu ý dấu ; •{ • // Khối lệnh được lặp lại. Có thể bỏ trống •} Trong đó: o Vòng lặp for này trở thành vòng lặp vô tận. o Lưu ý dấu ; vẫn phải có. Ý nghĩa và cách sử dụng các phần [Khởi tạo]; [Điều kiện lặp]; [Bước lặp lại]. Khởi tạo Khi bắt đầu vào đoạn code của vòng lặp for, đoạn lệnh này sẽ được chạy đầu tiên. Và chỉ được gọi duy nhất một lần trong vòng đời của vòng lặp for. Ví dụ: Tạo một lớp đối tượng mới có tên Class1 và lập trình như sau: Cách tạo Class: Hình 4.2. Màn hình để tạo mới một Class 55
  58. Lập trình đoạn code trong Class1 Cách gọi lớp Class1 trong Program.cs Ở trường hợp này i được gọi là biến đếm (thuật ngữ lập trình dùng cho một biến có tác dụng tăng giá trị lên mỗi lần lặp lại). Kết quả chương trình. Hình 4.3. Kết quả vòng lặp for khuyết 56
  59. Ví dụ: Chỉ có thể có duy nhất một câu lệnh khởi tạo trong vòng lặp (lưu ý dấu , và dấu ; ở hai ví dụ sau) for static void Main(string[] args) { int i; // lỗi vì chỉ được phép có duy nhất một dòng lệnh khởi tạo trong vòng lặp for for (i = 0, int j = 0; ; ) { Console.WriteLine(i); } Console.ReadKey(); } Hay: static void Main(string[] args) { int i; // lỗi vì chỉ được phép có duy nhất một dòng lệnh khởi tạo trong vòng lặp for for (i = 0; int j = 0; ; ) { Console.WriteLine(i); } Console.ReadKey(); } Điều kiện lặp Điều kiện lặp là một biểu thức logic với kết quả trả về bắt buộc là true hoặc false (có thể bỏ trống sẽ trả về kết quả là true). Điều kiện lặp là dòng lệnh thứ 2 vòng for sẽ chạy vào khi chạy lần đầu tiên (Khởi tạo chạy trước). Từ lần lặp thứ 2 của vòng for, Điều kiện lặp cũng là dòng lệnh thứ 2 được chạy (sau bước lặp lại). (Cứ nhớ là luôn đứng thứ 2) Khi câu điều kiện lặp không còn thỏa mãn (kết quả là false) thì vòng lặp for sẽ kết thúc. Static void Main(string[] args) { int i; // vòng lặp for này vẫn lặp vô tận vì không bao giờ thỏa mãn điều kiện dừng // i luôn == 0 // Điều kiện lặp luôn là true for (i = 0; i < 10;) { Console.WriteLine(i); } Console.ReadKey(); } 57
  60. Ta có thể thấy Điều kiện lặp của vòng lặp này luôn là true, nên vòng lặp sẽ lặp vô tận. Hình 4.4. Kết quả vòng lập for vô tận Để giải quyết vấn đề này và cho vòng lặp kết thúc khi thỏa mãn điều kiện lặp. Chúng ta thêm một đoạn code i++; ngay dưới đoạn code Console.WriteLine(i); static void Main(string[] args) { int i; for (i = 0; i < 10;) { Console.WriteLine(i); i++; } Console.ReadKey(); } Kết quả màn hình xuất ra các giá trị số nguyên từ 0 đến 9 (10 lần). Chứng tỏ vòng lặp đã kết thúc sau 10 lần lặp (không còn lặp vô tận). Lưu ý: Giá trị in ra từ 0 đến 9 chứ không phải đến 10. Vì Điều kiện lặp là i < 10 (10 == 10 nên câu điều kiện là false và kết thúc vòng lặp. Vẫn thỏa mãn lặp 10 lần). Sau mỗi lần lặp giá trị i lại tăng lên 1 đơn vị. Sau 11 lần thì giá trị i == 10, không còn thỏa mãn Điều kiện lặp nữa nên vòng lặp kết thúc. 58
  61. Xem bảng thử dưới đây để hiểu rõ về số lần lặp: Bảng 4.1. Mô tả số lần lặp của vòng lặp for Lần i i < 10 1 0 TRUE 2 1 TRUE 3 2 TRUE 4 3 TRUE 5 4 TRUE 6 5 TRUE 7 6 TRUE 8 7 TRUE 9 8 TRUE 10 9 TRUE 11 10 FALSE Hoàn toàn có thể để giá trị true hoặc false vào phần điều kiện lặp (bỏ trống mặc định là true). Hoặc một biểu thức logic phức tạp nhưng kết quả cuối cùng trả về là true hoặc false. Static void Main(string[] args) { int i; for (i = 0; (i % 3 == 0) && (i < 10);) { Console.WriteLine(i); i++; } Console.ReadKey(); } Hay static void Main(string[] args) { int i; for (i = 0; false;) { Console.WriteLine(i); i++; } Console.ReadKey(); 59
  62. } Hay static void Main(string[] args) { int i; for (i = 0; true;) { Console.WriteLine(i); i++; } Console.ReadKey(); } Bước lặp lại Như ví dụ trên ta thấy. Mỗi lần muốn tăng giá trị của i ta phải dùng môt đoạn lệnh i++ ; ở cuối khối lệnh. Vậy trường hợp bất cứ khi nào lặp lại ta cũng cần thực thi đoạn lệnh i++ ; thì sao? Để tiện hơn cho việc code. Chúng ta có một phần tiếp theo để tìm hiểu. Đó là bước lặp lại. Xét đoạn code sau: static void Main(string[] args) { int i; for (i = 0; i < 10;) { Console.WriteLine(i); i++; } Console.ReadKey(); } Kết quả chương trình Hình 4.5. Màn hình kết quả tăng biến i ngoài vòng lặp for Ta có thể viết gọn lại bằng cách đưa i++; vào phần bước lặp lại của khối for. 60
  63. Static void Main(string[] args) { int i; for (i = 0; i < 10; i++) { Console.WriteLine(i); } Console.ReadKey(); } Kết quả tương tự như bình thường Hình 4.6. Màn hình kết quả tăng biến i trong vòng lặp for Ví dụ. Một vòng lặp for tổng hợp static void Main(string[] args) { int n = 100; int j = 0; for (int i = 0; i * j < n; i++, j += 3,Console.WriteLine(“Kết quả For Loop {0}”, i)) { Console.WriteLine(“===”); Console.WriteLine(“i: {0} | j: {1} | i * j: {2}”, i, j, i * j); } Console.ReadKey(); } Kết quả chương trình: 61
  64. Hình 4.7. Màn hình kết quả vòng lặp for tổng hợp Cũng có thể vẽ một hình chữ nhật rỗng NxM với vòng lặp for: static void Main(string[] args) { int N = 10; int M = 20; char drawChar = ‘*’; char insideChar = ‘ ‘; // Vẽ từ trên xuống for (int i = 0; i < N; i++) { // Vẽ từ trái sang for (int j = 0; j < M; j++) { /* * Nếu đang ở tọa độ là cạnh trên hoặc dưới i % (N – 1) == 0 * hoặc đang ở cạnh trái hoặc phải (j % (M – 1) == 0) * mà không nằm ở cạnh trên hoặc dưới (i % (N – 1) != 0) * ((i % (N – 1) != 0) && (j % (M – 1) == 0)) * thì vẽ ra ký tự của hình chữ nhật * ngược lại vẽ ra ký tự không thuộc hình chữ nhật */ if (i % (N – 1) == 0 || ((i % (N – 1) != 0) && (j % (M – 1) == 0))) { Console.Write(drawChar); // lúc này là ký tự * } else { Console.Write(insideChar); // lúc này là ký tự rỗng ‘ ‘ } 62
  65. } //mỗi lần vẽ xong một hàng thì xuống dòng Console.WriteLine(); } Console.ReadKey(); } Kết quả chương trình Hình 4.8. Màn hình kết quả vòng lặp để vẽ hình vuông 3. Câu lệnh for each Cấu trúc lặp foreach cho phép chúng ta duyệt 1 mảng hoặc 1 tập hợp Một số đặc trưng của foreach: • foreach không duyệt mảng hoặc tập hợp thông qua chỉ số phần tử như cấu trúc lặp for. • foreach duyệt tuần tự các phần tử trong mảng hoặc tập hợp. • foreach chỉ dùng để duyệt mảng hoặc tập hợp ngoài ra không thể làm gì khác. Cú pháp foreach ( in ) { // Code xử lý } Trong đó: • Các từ khoá foreach, in là từ khoá bắt buộc. • là kiểu dữ liệu của các phần tử trong mảng hoặc tập hợp. • là tên 1 biến tạm đại diện cho phần tử đang xét khi duyệt mảng hoặc tập hợp. 63
  66. • là tên của mảng hoặc tập hợp cần duyệt. Nguyên tắc hoạt động Foreach cũng có nguyên tắc hoạt động tương tự như các cấu trúc lặp khác cụ thể như sau: •Ở vòng lặp đầu tiên sẽ gán giá trị của phần tử đầu tiên trong mảng vào biến tạm. • Thực hiện khối lệnh bên trong vòng lặp foreach. • Qua mỗi vòng lặp tiếp theo sẽ thực hiện kiểm tra xem đã duyệt hết mảng hoặc tập hợp chưa. Nếu chưa thì tiếp gán giá trị của phần tử hiện tại vào biến tạm và tiếp tục thực hiện khối lệnh bên trong. • Nếu đã duyệt qua hết các phần tử thì vòng lặp sẽ kết thúc. Qua nguyên tắc hoạt động trên ta có thể thấy: • Biến tạm trong vòng lặp foreach sẽ tương đương với phần tử i trong cách duyệt của vòng lặp for . • Qua mỗi bước lặp ta chỉ có thể thao tác với giá trị của phần tử đang xét mà không thể tương tác với các phần tử đứng trước nó hay đứng sau. • Bằng cách duyệt của foreach ta không thể thay đổi giá trị của các phần tử vì lúc này giá trị của nó đã được sao chép ra một 1 biến tạm và ta chỉ có thể thao tác với biến tạm. • Thậm chí việc thay đổi giá trị của biến tạm cũng không được phép. Nếu ta cố làm điều đó thì sẽ gặp lỗi sau: Ví dụ: Khởi tạo 1 mảng 1 chiều gồm các số nguyên, sau đó dùng lệnh foreach để tính tổng các phần tử 64
  67. Kết quả chương trình Hình 4.9. Màn hình kết quả vòng lặp foreach tính tổng phần tử mảng Ví dụ: Sử dụng vòng lặp foreach để in ra các mảng dữ liệu Kết quả khi chạy đoạn chương trình trên: Hình 4.10 Màn hình kết quả dùng vòng lặp foreach in ra giá trị mảng Ta có thể thấy cách duyệt foreach ngắn gọn hơn nhiều so với cách duyệt bằng vòng lặp for thông thường. So sánh for và foreach trong C# foreach mang trong mình một số ưu điểm như: • Câu lệnh ngắn gọn, sẽ sử dụng. • Rất có ích khi duyệt danh sách, tập hợp mà không thể truy xuất thông qua chỉ số phần tử. 65
  68. • Duyệt các danh sách, tập hợp có số phần tử không xác định hoặc số phần tử thay đổi liên tục. Mặc dù có nhiều ưu điểm nhưng không hẳn là foreach hơn hẵn for. Cùng điểm qua một vài tiêu chí giữa 2 vòng lặp. Bảng 4.2. So sánh tiêu chí của 2 vòng lặp for và foreach Tiêu chí for foreach Khả năng truy xuất Truy xuất ngẫu nhiên (có Truy xuất tuần tự (chỉ sử phần tử thể gọi bất kỳ phần tử nào dụng được giá trị phần tử trong mảng để sử dụng) đang xét) Thay đổi được giá trị Có Không của các phần tử Duyệt mảng, tập hợp Không Có khi không biết được số phần tử của mảng, tập hợp Hiệu suất (tốc độ xử Đối với mảng, danh sách Đối với mảng, danh sách lý) (*) hoặc tập hợp có khả năng hoặc tập hợp không có khả truy xuất ngẫu nhiên năng truy xuất ngẫu nhiên thì for sẽ chiếm ưu thế thì foreach chiếm ưu thế Câu hỏi ôn tập và bài tập 2. Áp dụng câu lệnh switch case để viết chương trình trên Console theo yêu cầu sau: khai báo biến kiểu int luachon. Nếu luachon = 1: Tính hình tam giác Nếu luachon = 2: Tính hình chữ nhật Nếu luachon = 3: Tính hình vuông 2. Áp dụng lệnh for hoặc lệnh foreach để thực hiện công việc sau: - Tính tổng các số từ 1 n với n là số nguyên được nhập vào từ bàn phím. 66
  69. - Tính tổng các số chẵn và số lẽ từ 1 n với n là số nguyên được nhập vào từ bàn phím. - Chương trình mảng nhập, xuất, sắp xếp mảng 1 chiều với n là số nguyên 67
  70. BÀI 5: SỬ DỤNG CẤU TRÚC LỰA VÒNG LẶP WHILE, DO WHILE Mã bài: 20.5 Giới thiệu: Trong C# vòng lặp while trong C# thực hiện lặp đi lặp lại một lệnh mục tiêu đến khi nào điều kiện đã cho còn là đúng, vòng lặp do while được sử dụng để lặp đi lặp lại một đoạn code nào đó. Nếu số lần lặp không cố định và bạn phải thực hiện vòng lặp ít nhất một lần, thì nên sử dụng vòng lặp do while. Mục tiêu: - Hiểu và biết sử dụng cấu trúc lệnh while - Hiểu và biết sử dụng cấu trúc lệnh do while. - Vận dụng cấu trúc lệnh while để viết chương trình Console cơ bản, đồ án. - Vận dụng cấu trúc do while để viết chương trình Console cơ bản, và đồ án. - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 3. Sử dụng cấu trúc vòng lặp While while ( ) { // khối lệnh lặp lại } • Điều kiện lặp là một biểu thức logic bắt buộc phải có với kết quả trả về bắt buộc là true hoặc false. • Từ khóa while biểu thị đây là một vòng lặp while. Các câu lệnh trong khối lệnh sẽ được lặp lại đến khi không còn thỏa mãn điều kiện lặp sẽ kết thúc vòng lặp while. • Tiến trình: o Đầu tiên trình biên dịch sẽ đi vào dòng while ( ). Kiểm tra điều kiện lặp có thỏa mãn hay không. Nếu kết quả là true thì sẽ đi vào bên trong thực hiện khối code. Khi gặp ký tự } sẽ quay lên kiểm tra điều kiện lặp và tiếp tục thực hiện khối code. Quá trình chỉ kết thúc khi điều kiện lặp là false. o Điều kiện lặp luôn bằng true thì vòng lặp while sẽ trở thành vòng lặp vô tận. o Điều kiện lặp luôn bằng false thì vòng lặp sẽ không được thực thi. 68
  71. Ví dụ 1: In ra dãy số từ 10 19 Kết quả chương trình: Hình 5.1. Kết quả thực hiện vòng lặp while in ra dãy số từ 10 19 Ví dụ 2: Dùng vòng lặp while để thực hiện vẽ một hình chữ nhật có chiều dài là 50 dấu “*” và chiều rộng là 20 dấu “*” liên tiếp nhau 69
  72. Kết quả chương trình Hình 5.1. Kết quả thực hiện vòng lặp while in hình chữ nhật dấu * 70
  73. 2. Sử dụng cấu trúc vòng lặp Do while Cú pháp do { // khối lệnh lặp lai } while ( ); Điều kiện lặp là một biểu thức logic bắt buộc phải có với kết quả trả về bắt buộc là true hoặc false. Từ khóa do while biểu thị đây là một vòng lặp do while. Các câu lệnh trong khối lệnh sẽ được lặp lại đến khi không còn thỏa mãn điều kiện lặp sẽ kết thúc vòng lặp do while. Tiến trình: Đầu tiên trình biên dịch sẽ đi vào dòng do và thực hiện khối lệnh bên trong. Sau đó khi gặp ký tự } sẽ kiểm tra điều kiện lặp có thỏa mãn hay không. Nếu kết quả là true thì sẽ quay lại ký tự { thực hiện khối code. Quá trình chỉ kết thúc khi điều kiện lặp là false. Điều kiện lặp luôn bằng true thì vòng lặp while sẽ trở thành vòng lặp vô tận. Điều kiện lặp luôn bằng false thì vòng lặp sẽ không được thực thi. Lưu ý: vòng lặp do while sẽ thực hiện câu lệnh trong khối code xong rồi mới kiểm tra điều kiện lặp. Cuối vòng lặp do while có dấu ; ở cuối. Ví dụ 1: Dùng vòng lặp do while để in ra dãy số từ 10 19 Đoạn code thực hiện chương trình 71
  74. Kết quả thực hiện chương trình: Hình 5.2. Kết quả thực hiện vòng lặp do while in ra dãy số từ 10 19 Ví dụ 2: In ra một ma trận số Đoạn code thực hiện chương trình 72
  75. Kết quả thực hiện chương trình: Hình 5.4. Kết quả thực hiện vòng lặp do while in ra ma trận Câu hỏi ôn tập và bài tập Áp dụng lệnh while, do while để thực hiện công việc sau: - Tính tổng các số từ 1 n với n là số nguyên được nhập vào từ bàn phím. - Tính tổng các số chẵn và số lẽ từ 1 n với n là số nguyên được nhập vào từ bàn phím. - Chương trình mảng nhập, xuất, sắp xếp mảng 1 chiều với n là số nguyên 73
  76. BÀI 6: SỬ DỤNG CÂU LỆNH BREAK, CONTINUE, GOTO Mã bài: 20.6 Giới thiệu: Các câu lệnh làm ngắt, tiếp tục ở vị trí bất kỳ, nhảy đến một vị trí bất kỳ. Các câu lệnh này tuy làm gãy bố cục chương trình nhưng giúp cho chương trình thực hiện được các yêu cầu trong một vài trường hợp cụ thể. Mục tiêu: - Hiểu và biết sử dụng các câu lệnh continue, goto, break. - Vận dụng các câu lệnh break, continue, goto để viết chương trình Console cơ bản, đồ án. - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 4. Sử dụng câu lệnh break Lệnh break trong C# có hai cách sử dụng: Khi lệnh break được sử dụng trong vòng lặp, vòng lặp ngay lập tức kết thúc và điều khiển chương trình bắt đầu lệnh tiếp theo sau vòng lặp. Nó có thể được sử dụng trong lệnh switch (sẽ được nhắc đến trong chương tới). Nếu bạn đang sử dụng các vòng lặp lồng nhau (ví dụ, một vòng lặp bên trong vòng lặp khác), lệnh break sẽ dừng thực thi một lệnh nào đó trong một vòng lặp và bắt đầu thực thi lệnh tiếp theo của đoạn code sau khối code đó. Cú pháp của lệnh break trong C# như sau: break; 74
  77. Ví dụ: Kết quả chương trình: Hình 6.1. Kết quả lệnh break 2. Sử dụng câu lệnh continue Lệnh continue trong C# làm việc hơi giống với lệnh break. Thay vì bắt buộc kết thúc, nó bắt buộc vòng lặp tiếp theo diễn ra, bỏ qua bất kỳ đoạn code nào ở giữa. Với vòng lặp for, lệnh continue làm cho bước kiểm tra điều kiện và phần increment của vòng lặp thực thi. Với while và do while, lệnh continue làm điều khiển chương trình chuyển tới các kiểm tra điều kiện. Cú pháp của lệnh continue trong C# như sau: continue; 75
  78. Ví dụ: Kết quả chương trình: Hình 6.2. Kết quả thực hiện lệnh continue 3. Sử dụng câu lệnh goto Lệnh nhảy goto là một lệnh nhảy đơn giản, cho phép chương trình nhảy vô điều kiện tới một vị trí trong chương trình thông qua tên nhãn. Tuy nhiên việc sử dụng lệnh goto thường làm mất đi tính cấu trúc thuật toán, việc lạm dụng sẽ dẫn đến một chương trình nguồn mà giới lập trình gọi là “mì ăn liền” rối như mớ bòng bong vậy. Hầu hết các người lập trình có kinh nghiệm đều tránh dùng lệnh goto. Sau đây là cách sử dụng lệnh nhảy goto: Cú pháp: goto ; • Trong đó label là một nhãn đích đến trong code. Nơi mà code sẽ tiếp tục được thực thi từ đó. Cấu trúc của một label: : 76
  79. • goto là từ khóa thông báo cho trình biên dịch biết sẽ đi đến nhãn ngay sau để tiếp tục thực thi code. Ví dụ Kết quả chương trình Hình 6.3. Kết quả thực hiện lệnh goto Ví dụ về vòng lặp vô tận: 77
  80. Kết quả chương trình Hình 6.4. Kết quả thực hiện vòng lặp vô tận Câu hỏi ôn tập và bài tập 1. Sử dụng câu lệnh break cho bài tập 5.1 2. Viết chương trình đặt một nhãn bất kỳ và thực hiện in ra câu lệnh “Chúc các bạn học tốt môn học”. 3. Từ bài tập 2 cho phép người dùng nhập vào tên học sinh và nhảy tới vị trí câu lệnh Chúc các bạn học tốt môn học”. 78
  81. BÀI 7: HÀM Mã bài: 20.7 Giới thiệu: Hàm là chương trình con được sử dụng thường xuyên trong toàn bộ quá trình lập trình. Việc viết và sử dụng hàm một cách hiệu quả giúp cho quá trình thực hiện các công việc lập trình nhanh chóng, tái sử dụng, kế thừa tốt hơn. Mục tiêu: - Hiểu được khái niệm và công dụng của hàm trong xây dựng chương trình. - Quy tắc xây dựng hàm, sử dụng hàm trong xây dựng chương trình. - Hiểu và sử dụng tham số, tham trị của hàm. - Vận dụng hàm, thủ tục để xây dụng chương trình đồ án khoa học và hiệu quả. - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 5. Khái niệm Khi mình muốn thực thi một đoạn code nào nó nhiều lần, thay vì phải copy đi copy lại đoạn code đó nhiều lần, dẫn đến chương trình chúng ta bị trùng lặp code rất nhiều, trong c# có function cho phép chúng ta thực thi đoạn code nào đó nhiều lần mà không cần phải copy lại code, mà chỉ cần gọi tên hàm. 2. Quy tắc xây dựng hàm Cú pháp: Tên hàm ( ) { // Thân hàm // Giá trị trả về; } Trong đó: Tên hàm: o Là tên gọi của hàm. o Tên có thể đặt tùy ý nhưng nên đặt tên theo quy tắc đặt tên để có sự đồng bộ ngầm định giữa các lập trình viên và dễ tìm, dễ nhớ (. 79
  82. o Hãy xem cách khởi tạo hàm giống khởi tạo một biến ở chỗ. Đều cần kiểu dữ liệu và tên. Có thể có các từ khóa. Tên để tái sử dụng hàm ở nơi mong muốn. Kiểu trả về: từ khóa void, hay mọi kiểu dữ liệu như int, long, bool, SinhVien Thân hàm: Nó là khối lệnh sẽ được thực thi khi hàm được gọi. Quyền truy cập: Nó được sử dụng để xác định khả năng truy cập hàm trong ứng dụng bao gồm các quyền sau: public, private, protected Tham số: Nó là một danh sách các tham số mà chúng ta truyền vào khi gọi hàm Lưu ý: o Mọi hàm đều phải có cặp ngoặc nhọn { } biểu thị là một khối lệnh. Mọi dòng code xử lý của hàm đều được viết bên trong cặp ngoặc nhọn { } này. o Không thể khai báo một hàm trong một hàm khác theo cách thông thường. Một hàm cơ bản hay thấy với cấu trúc bắt buộc phải có trong lập trình C# console hàm Main 3. Nguyên tắc hoạt động của hàm Hàm void là hàm có kiểu trả về là void. Chúng ta cùng xem qua khai báo hàm sau: void Demo() { // some code return; } Vì hàm void (hàm có kiểu trả về là void) thì không cần viết return; nên chúng ta có thể bỏ return; đi. Void Demo() { // some code } 80
  83. Một lưu ý về sau: do đang viết code trên nền console C#. Bắt buộc phải có hàm Main. Nhưng hàm Main lại có từ khóa static. Nên để trong hàm Main có thể sử dụng các hàm mà ta viết ra thì các hàm đó cũng phải có từ khóa static. Static void Main(string[] args) { // Gọi lại hàm để sử dụng Console.OutputEncoding = Encoding.UTF8; Demo(); Console.ReadKey(); } static void Demo() { Console.WriteLine(“Chào mừng đến với môn Lập trình Windows Forms”); } Kết quả vẫn xuất ra dòng chữ “Chào mừng đến với môn Lập trình Windows Forms” như được viết bên trong hàm Main. Nhưng thật sự nó đã được gọi từ hàm Demo. Khi sử dụng hàm ta sẽ gọi lại tên hàm kèm theo dấu () biểu thị đó là một hàm. Sau này nếu có parameter thì sẽ thêm giá trị vào bên trong dấu (). Chúng ta có thể gọi lại nhiều lần và có thể thấy code chúng ta viết rất rõ ràng và rất dễ tái sử dụng. static void Main(string[] args) { // Gọi lại hàm nhiều lần // dòng chữ Called from Demo! HowKteam.com cũng được in ra nhiều lần Console.OutputEncoding = Encoding.UTF8; Demo(); Demo(); Demo(); Demo(); Console.ReadKey(); } static void Demo() { Console.WriteLine(“Chào mừng đến với môn Lập trình Windows Forms”); } Nhiều dòng chữ “Chào mừng đến với môn Lập trình Windows Forms” được in ra màn hình. Hàm có kiểu trả về khác void Với hàm có kiểu trả về khác void. Trong thân hàm bắt buộc phải có dòng return ; Giá trị trả về phải có kiểu dữ liệu tương ứng với Kiểu dữ liệu trả về khi khai báo hàm. 81
  84. /// /// Hàm trả về giá trị số nguyên 5 thông qua tên hàm /// Lưu ý giá trị trả về phải cùng kiểu dữ liệu với kiểu trả về của hàm /// Ở đây là kiểu int /// /// static int ReturnANumber() { // bắt buộc phải có cấu trúc return trong thân hàm return 5; } Có thể sử dụng hàm này bình thường, và có thêm một lợi thế là có thể lấy giá trị trả về của hàm thông qua lời gọi tên hàm. Static void Main(string[] args) { Console.WriteLine(ReturnANumber()); Console.ReadKey(); } /// /// Hàm trả về giá trị số nguyên 5 thông qua tên hàm /// Lưu ý giá trị trả về phải cùng kiểu dữ liệu với kiểu trả về của hàm /// Ở đây là kiểu int /// /// static int ReturnANumber() { // bắt buộc phải có cấu trúc return trong thân hàm return 5; } Kết quả số 5 xuất hiện trên màn hình 4. Cách truyền tham số Hàm có tham số nhưng không có kiểu trả về 82
  85. Kết quả chương trình Hình 7.1. Kết quả hàm không trả về giá trị Hàm có tham số và có kiểu trả về Kết quả chương trình Hình 7.2. Kết quả hàm trả về giá trị 5. Sử dụng hàm Trong c# có 3 cách gọi hàm đó là gọi bằng giá trị (call by value), gọi bằng tham chiếu (call by Reference) và dùng tham số out. 6. Gọi bằng giá trị (call by value) Trong C#, gọi bằng giá trị tức là tham số truyền vào là bản sao của giá trị gốc, vì vậy dù cho bên trong thân hàm có thay đổi giá trị của tham số truyền vào thì sau khi kết thúc gọi hàm thì giá trị gốc vẫn không thay đổi. Ví dụ: 83
  86. Kết quả chương trình Hình 7.3. Kết quả gọi hàm bằng giá trị b. Gọi bằng tham chiếu (call by Reference) C # cung cấp một từ khóa ref để truyền đối số dưới dạng tham chiếu. Tức là tham số truyền vào bằng địa chỉ ô nhớ của biến gốc vì vậy bên trong thân hàm thay đổi giá trị tham số truyền vào thì giá trị gốc cũng thay đổi theo 84
  87. Hình 7.4. Kết quả gọi hàm bằng tham chiếu c.Tham số out Tham số out giống như kiểu tham chiếu, ngoại trừ việc nó không yêu cầu biến khởi tạo trước khi truyền. Ví dụ: Kết quả chương trình Hình 7.5. Kết quả gọi hàm bằng tham số out Như vậy mình chỉ cần phân biệt ref và out như sau: 85
  88. Bảng 7.1. Phân biệt giữ ref và out ref out Giá trị phải được khởi tạo trước Giá trị không được khởi tạo trước và bên trong thân hàm không đọc được nó cho đến khi nó được gán giá trị Bên trong thân hàm có thể đọc vào Hàm phải gán giá trị cho biến out trước thay đổi giá trị nó khi trả giá trị về Câu hỏi ôn tập và bài tập Thực hiện các bài tập từ bài 3 – bài 6 dưới dạng hàm 86
  89. BÀI 8: THIẾT KẾ LỚP ĐỐI TƯỢNG Mã bài: 20.8 Giới thiệu: Lớp đối tượng được dùng để lưu trữ danh sách những thuộc tính và phương thức của đối tượng phân biệt trong một dự án lập trình. Mục tiêu: - Lập danh sách các lớp đối tượng ứng với từng chương trình cụ thể. - Thiết kế các lớp đối tượng cho bài tập của nhóm. - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 7. Định nghĩa lớp đối tượng Lập trình hướng đối tượng (Object-oriented programming – OOP), là kỹ thuật lập trình mà điều cốt yếu cần trừu tượng hóa các vấn đề thành các đối tượng (đối tượng có dữ liệu và các ứng xử). Kỹ thuật OOP có 4 tính chất • Tính trừu tượng (abstraction) mô tả một cách tổng quát hóa mà không chi tiết thông tin (triển khai với interface, abstract) • Tính đóng gói (encapsulation) dữ liệu đối tượng cố gắng như nằm trong một hộp đen, các thành phần khác bên ngoài đối tượng không trực tiếp tác động đến dữ liệu • Tính đa hình (polymorphism) đối tượng ứng xử khác nhau tùy trường hợp cụ thể • Tính kế thừa (inheritance) đặc tính của lớp được kế thừa từ một lớp khác Trong lập trình hướng đối tượng, lớp (class) là một kiểu dữ liệu nó định nghĩa một tập hợp các biến (thuộc tính) và phương thức (gọi chúng là các member – thành viên lớp). Từ lớp đó sinh ra các đối tượng (object), các đối tượng này còn gọi là instance of a class (bản triển khai của class), mỗi đối tượng có giá trị dữ liệu cụ thể (lưu trong thành viên biến). Các phương thức (method) – định nghĩa các ứng xử của đối tượng – dựa theo dữ liệu của chúng. Một lớp là một nhóm đối tượng có các thuộc tính chung. Nó là một mẫu hoặc thiết kế từ đó các đối tượng được tạo ra. 87
  90. Một thực thể có trạng thái và hành vi được gọi là đối tượng. Ví dụ như máy pha cà phê, xe đạp, xe máy, cái quạt Một đối tượng có ba đặc điểm: • Trạng thái: Đại diện cho dữ liệu (giá trị) của một đối tượng. • Hành vi: Đại diện cho hành vi (chức năng) của một đối tượng như gửi tiền, rút tiền, • Danh tính: Danh tính của một đối tượng thường được cài đặt thông qua một ID duy nhất. ID này được ẩn đối với user bên ngoài. Tuy nhiên nó được sử dụng trong nội bộ máy ảo JVM để định danh từng đối tượng. Ví dụ: Bút chì là một đối tượng. Tên của nó là A, màu trắng, được gọi là trạng thái. Nó được sử dụng để viết, viết được gọi là hành vi. Đối tượng(Object) là một thể hiện của một lớp(Class). Lớp là một mẫu hoặc thiết kế từ đó các đối tượng được tạo ra. Vì vậy, đối tượng là các thể hiện (kết quả) của một lớp. Ví dụ: Một lớp mô tả chung về nhân viên, đặt tên là nhanvien, thì bên trong nó có thể định nghĩa các thành viên dữ liệu (biến) như: manv, tennv, ngaysinh, gioitinh Cũng có thể định nghĩa các thành viên hàm (phương thức) để mô tả ứng xử của nó như: khoitao(), them() Khi có định nghĩa lớp nhanvien, bạn có thể tạo ra đối tượng cụ thể của nó mà mỗi đối tượng có những dữ liệu khác nhau như Nhân viên A, Nhân viên B 2. Khai báo lớp đối tượng Để tạo được lớp đối tượng trong ngôn ngữ lập trình C# trên phần mềm ứng dụng lập trình Visual Studio chúng ta cần thực hiện các việc sau: 88
  91. Hình 8.1. Màn hình để chọn thêm một lớp mới vào Project Hình 8.2. Màn hình đặt tên cho lớp đối tượng Hình 8.3. Màn hình làm việc của cửa sổ lớp đối tượng được tạo 89
  92. Cú pháp, ví dụ khai báo lớp Khi giải quyết các vấn đề thực tiễn, các vấn đề cần giải quyết bạn cần tìm cách trừu tượng hóa nó thành vấn đề tổng quát, như nó có các đặc tính gì, ứng xử của nó ra sao Từ đó mới có thể định nghĩa ra lớp để hiện thực hóa vấn đề trừu tượng được. Cú pháp cơ bản như sau: class Class_Name { // khai báo các thành viên dữ liệu (thuộc tính – biến) // khai báo các thành viên hàm (phương thức) } Trong đó Access Modifiers có thể là các từ khóa sau: Bảng 8.1. Bảng mô tả các từ khóa định nghĩa lớp Từ khóa Giải thích Public Truy xuất mọi nơi Protected Truy xuất trong nội bộ lớp hoặc trong các lớp con Internal Truy xuất trong nội bộ chương trình (Assembly) Truy xuất nội trong chương trình (assembly) và trong protected internal các lớp con private (mặc định) Chỉ được truy xuất trong nội bộ lớp Ví dụ: Khai báo một lớp có tên là Box gồm các thuộc tính: chiều dài, chiều rộng, chiều cao. 90
  93. Khai báo và khởi tạo thành viên thuộc tính (biến) tương tự cách khai báo biến thông thường nhưng có sử dụng thêm Access Modifiers để quy định cấp độ truy cập. Câu hỏi ôn tập và bài tập 1. Tạo lớp đối tượng sinh viên bao gồm các thông tin: masv (mã sinh viên), tennv (tên sinh viên), ngaysinh (ngày sinh), diachi (địa chỉ) 2. Tạo lớp đối tượng đồng hồ bao gồm các thông tin: thoigian, gio, phut, giay. 3. Tạo lớp đối tượng sản phẩm bao gồm các thông tin: masp (mã sản phẩm), tensp (tên sản phẩm), gia (giá), ngaynhap (ngày nhập), ngayxuat (ngày xuất). 91
  94. BÀI 9 : ĐỊNH NGHĨA CÁC THUỘC TÍNH, PHƯƠNG THỨC HÀNH ĐỘNG CHO LỚP ĐỐI TƯỢNG Mã bài: 20.9 Giới thiệu: Việc xác định thuộc tính của lớp đối tượng cũng như chuẩn bị sẵn các phương thức hoạt động cho lớp đối tượng giúp cho việc sử dụng và lập trình dễ dàng hơn rất nhiều. Mục tiêu: - Định nghĩa được các thuộc tính cho lớp đối tượng. - Định nghĩa được các phương thức hành động cho lớp đối tượng - Vận dụng các thuộc tính, phương thức của lớp đối tượng trong đồ án - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 8. Định nghĩa các thuộc tính cho lớp đối tượng Ví dụ: - Định nghĩa lớp đối tượng Box gồm các thuộc tính chieudai, chieurong, chieucao. - Kiểu dữ liệu cho mỗi thuộc tính tùy theo mục đích sử dụng mà chọn kiểu dữ liệu. 92
  95. Sau khi khai báo được Lớp đối tượng cách thức sử dụng lớp đối tượng như sau Trong màn hình lập trình trên để khai báo và sử dụng lớp đối tượng Box trong chương trình Main ta sử dụng câu lệnh sau: Từ khóa this Từ khóa this dùng trong các phương thức của lớp, nó tham chiếu đến đối tượng hiện tại sinh ra từ lớp. Sử dụng this để tường minh, tránh sự không rõ ràng khi truy cập thuộc tính, phương thức hoặc để lấy đối tượng lớp làm tham số cho các thành phần khác Ví dụ, hàm setchieucao, có thể viết: public void setchieucao(int chieucao) { this.chieucao = chieucao ; } 93
  96. Nếu viết thiếu this thì là chieucao = chieucao , làm cho khó hiểu không biết là gán chieucao từ tham số hàm cho chieucao là dữ liệu của lớp. 2. Định nghĩa các phương thức hành động cho lớp đối tượng Phương thức khởi tạo – Constructor Phương thức khởi tạo là phương thức của lớp, nó được thi hành ngay khi đối tượng được tạo (bởi toán tử new), phương thức khởi tạo có tên trùng với tên của lớp, không có kiểu trả về. Ví dụ bổ sung thêm phương thức khởi tạo vào lớp Box ở trên: Nếu khai báo vào khởi tạo giống như ở trên chương trình sẽ báo lỗi vì khi tạo đối tượng Box mới cần gán các giá trị ban đầu cho đối tượng: chiều dài, chiều rộng, chiều cao. Lúc này có thể sử như sau: Kết quả tương tự như ví dụ trên, việc sử dụng hàm khởi tạo đảm bảo dữ liệu của đối tượng bắt buộc phải khởi tạo ngay khi đối tượng đó được tạo – tránh việc sử dụng đối tượng mà dữ liệu không chính xác. Phương thức Destructor trong C# Một destructor trong C#, là một hàm thành viên đặc biệt của một lớp, được thực thi bất cứ khi nào một đối tượng của lớp đó thoát ra khởi phạm vi. 94
  97. Một destructor có tên giống tên lớp với một dẫu ngã (~) ở trước và nó có thể: không trả về một giá trị hoặc không nhận bất kỳ tham số nào. Destructor trong C# có thể rất hữu ích để giải phóng tài nguyên bộ nhớ trước khi thoát khỏi chương trình. Destructor không thể bị kế thừa hoặc nạp chồng. Ví dụ sau minh họa khái niệm về destructor trong C#: Chương trình được viết trong Program.cs Kết quả thực hiện chương trình 95
  98. Hình 9.1. Kết quả gọi class Box và truyền tham số Quá tải (Overloading) phương thức Kỹ thuật quá tải phương thức (Method Overloading) là cách thức triển khai khái niệm tính đa hình của lập trình hướng đối tượng. Quá tải phương thức là các phương thức có cùng tên nhưng tham số khác nhau (hàm có thể trả về kiểu dữ liệu khác nhau) Tính đa hình (polymorphism) là cách ứng xử của đối tượng - ứng xử này là khác nhau tùy thuộc vào tình huống cụ thể. Public static void WriteLine(); public static void WriteLine(bool value); public static void WriteLine(decimal value); public static void WriteLine(int value); Điều này giúp cho bạn khi bạn gọi Console.Writeline(a), tùy thuộc vào kiểu dữ liệu của a mà một hàm WriteLine tương ứng được thi hành. Ví dụ: public class OverloadingExample { public static int Sum(int a, int b) { return a + b; } public static double Sum(double a, double b) { return a + b; } } Lớp trên có hàm Sum quá tải, tùy thuộc vào kiểu tham số mà hàm Sum cụ thể được gọi. double a = 1; double b = 2; var c = OverloadingExample.Sum(a, b); // c = 3 có kiểu double int a = 1; 96
  99. int b = 2; var c = OverloadingExample.Sum(a, b); // c = 3 nhưng có kiểu int Chú ý: Khai báo hai hàm cùng tên, giống nhau hoàn toàn về tham số chỉ khác kiểu trả về sẽ gây lỗi. Tính đóng gói lập trình hướng đối tượng Tính đóng gói mục đích hạn chế tối đa việc can thiệp trực tiếp vào dữ liệu, hoặc thi hành các tác vụ nội bổ của đối tượng. Nói cách khác, một đối tượng là hộp đen đối với các thành phần bên ngoài, nó chỉ cho phép bên ngoài tương tác với nó ở một số phương thức, thuộc tính, trường dữ liệu nhất định – hạn chế. C# triển khai tính đóng gói này chính là sử dụng các Access Modifiers: public private protected internal khi khai báo lớp, phương thức, thuộc tính, trường dữ liệu (biến). Ví dụ: class Student { private string Name; } Khi sử dụng var s = new Student(); s.Name = “ABC”; Biên dịch sẽ lỗi error CS0122: ‘Student.Name’ is inaccessible due to its protection level. Vì trường Name là private không thể truy cập bằng code bên ngoài lớp như trên. Nhưng nếu thay bằng public thì không lỗi. Khi lập trình cố gắng tối đa ẩn thông tin ra bên ngoài lớp càng nhiều càng tốt để đảm bảo tính đóng gói của kỹ thuật lập trình OOP, nó giúp cho code dễ bảo trì và giám sát lỗi. Câu hỏi ôn tập và bài tập 1. Lớp đối tượng sinh viên bao gồm các thông tin: masv (mã sinh viên), tennv (tên sinh viên), ngaysinh (ngày sinh), diachi (địa chỉ), diemtoan (điểm toán), diemvan (điểm văn). Viết các phương thức phù hợp cho lớp để gán thông tin, tính điểm trung bình. 2. Lớp đối tượng đồng hồ bao gồm các thông tin: thoigian, gio, phut, giay. Viết phương thức đổi ra giây của dữ liệu được nhập vào 97
  100. 3. Lớp đối tượng sản phẩm bao gồm các thông tin: masp (mã sản phẩm), tensp (tên sản phẩm), gia (giá), ngaynhap (ngày nhập), ngayxuat (ngày xuất). Viết phương thức kiểm tra dữ liệu nhập: ngày xuất phải sau ngày nhập. 98
  101. BÀI 10: SỬ DỤNG FORM, MENUSTRIP Mã bài: 20.10 Giới thiệu: Form và Menustrip là 2 đối tượng cơ bản và cần thiết khi lập trình ứng dụng bằng Windows Form. Bản thân Form được tạo đầu tiên khi chương trình được chạy, Menustrip là điều khiển có mặt ở hầu hết các chương trình ứng dụng thực tế. Mục tiêu: - Hiểu và vận dụng Form cho đồ án - Hiểu và vận dụng MenuStrip cho đồ án - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 9. Form Form : đối tượng cửa sổ của chương trình chứa các đối tượng khác Tạo mới một project Hình 10.1. Lựa chọn tạo mới 1 project 99
  102. Chọn ngôn ngữ Chọn ứng dựng Windows Forms Chọn nơi lưu Hình 10.2. Màn hình lựa chọn khi tạo mới project Quản lý dự án Form – biểu mẫu chính Các điều khiển Thuộc tích của điều khiển Hình 10.3. Màn hình quản lý các điều khiển trong Form 100
  103. Để ẩn/hiện các đối tượng trên màn hình làm việc vào View ToolBox/ Properties/ Hình 10.4. Lựa chọn hiển thị cho các cửa sổ con Danh mục các điều khiển Hình 10.5. Hiển thị các danh mục làm việc 101
  104. 10.Thuộc tính của Form Bảng 10.1. Bảng mô tả thuộc tính Form Thuộc tính Mô tả Name Đặt tên form Giá trị thuộc tính này nhận là tên của một button trên form. Khi đó thay vì nhấp chuột vào button AcceptButton để thực thi thì người dùng có thể ấn phím Enter trên bàn phím Backcolor Thiết lập màu nền của form BackgroundImage Thiết lập hình nền cho form Thiết lập việc hiển thị hình vừa thêm trong thuộc BackgroundImageLayout tính BackgroundImage sẽ hiển thị trên form ở dạng: bình thường (None), giữa (Center), Giá trị thuộc tính này nhận là tên của một button trên form. Khi đó thay vì nhấp chuột vào button CancelButton để thực thi thì người dùng có thể ấn phím Escape trên bàn phím Mang giá trị true hoặc false. Nếu thiết lập thuộc ControlBox tính là false thì sẽ loại bỏ các nút minimize và nút maximize trên form Thiết lập hình dạng con trỏ khi di chuyển Cusor con trỏ vào form Mang giá trị true hoặc false; Nếu thiết lập thuộc tính là false thì điều khiển trong Enable form sẽ không cho phép người dùng thao tác. Font Thiết lập văn bản hiển thị trên điều khiển Thiết lập màu mặc định cho chuỗi của các ForeColor điều khiển trên form Thiết lập đường viền của form và hành vi FormBorderStyle của form khi chạy chương trình Mang giá trị true hoặc false; Nếu thiết lập thuộc tính là true thì trên thanh titlebar sẽ hiện 1 nút có dấu ? (nút HelpButton này chỉ hiện khi hai thuộc tính MinimizeBox và MaximizeBox được thiết lập là false) 102
  105. Biểu tượng hiển thị bên trái trên thanh Icon titlebar của form Mang giá trị true hoặc false: nếu thiết lập KeyReview thuộc tính là true cho phép các sự kiện bàn phím của form có hiệu lực Khi thuộc tính StartPosition được thiết lập là Manual, Location thì thuộc tính Location có tác dụng thiết lập vị trí hiển thị của form trên màn hình Mang giá trị true hoặc false: nếu thiết lập thuộc tính MaximizeBox là false thì nút maximize form trên thanh titlebar sẽ mất đi Thiết lập kích thước lớn nhất của form MaximumSize (chiều rộng x chiều cao) Mang giá trị true hoặc false: nếu thiết lập thuộc tính MinimizeBox là false thì nút minimize form trên thanh titlebar sẽ mất đi Thiết lập kích thước nhỏ nhất của form MinimumSize (chiều rộng x chiều cao) Opacity Thiết lập độ trong suốt cho form Size Kích thước form StartPosition Vị trí hiển thị của form trên màn hình Chuỗi văn bản hiển thị trên titlebar của Text form Mang giá trị true hoặc false: nếu thiết lập thuộc tính Visible là true thì form sẽ được hiển thị trên màn hình, nếu là false sẽ không hiển thị trên màn hình Có 3 giá trị: Normal: hiển thị form bình thường; Minimized: khi chạy chương trình form sẽ bị thu nhỏ WindowState dưới thanh taskbar; Maximized: form hiển thị có kích thước đầy màn hình Mang giá trị True hoặc False. - Nếu là True: Form ở dạng MDI Form IsMDIContainer - Nếu là False: Form ở dạng bình thường Cài đặt giá trị là đối tượng MDI Form. Khi MdiParent thiết lập giá trị cho thuộc tính MdiParent thì form sẽ trở thành Child Form 103
  106. Bảng 10.2. Bảng mô tả các giá trị của FormStartPosition Giá trị Mô tả Nếu StartPosition mang giá trị Manual thì vị trí Manual form hiển thị sẽ là vị trí thiết lập tại thuộc tính Size. CenterScreen Form hiển giữa màn hình Form hiển thị tại vị trí mặc định với kích thước WindowsDefaultLocation form sẽ là kích thước form được thiết lập tại thuộc tính Size Form hiển thị tại vị trí mặc định với kích thước WindowsDefaultBounds form sẽ là kích thước mặc định CenterParent Form hiển thị ở vị trí giữa form cha Hiển thị Form1 ở vị trí giữa màn hình Form1.StartPosition = FormStartPosition.WindowsDefaultLocation; Lớp program mặc định để chạy chương trình Nhập tên Form để được chạy đầu tiên. Thay đổi từng form Hình 10.6. Màn hình lập trình để cài đặt Form chạy đầu tiên Dòng lệnh trên chỉ ra rằng form đầu tiên sẽ hiển thị là form1. Do đó, lập trình viên chỉ cần sữa lại mã lệnh chỉ định một form khác muốn hiển thị bằng cách thay tên form đó cho form1 Ví dụ 1 : Hiển thị form có tên Form2 trong dự án Application.Run(new Form2()); 104
  107. Ví dụ 2: Viết chương trình hiển thị form cho trong sự kiện Form_load(): Nhấn Ctrl + Shift + B để biên dịch mã nguồn và nhấn F5 để thực thi chương trình sẽ được Mdi Form và Child Form. Kết quả chương trình Hình 10.7. Kết quả chương trình form cha – con 105
  108. Ví dụ 3: Thiết kế Form có hình dạng Kết quả chương trình Hình 10.8. Kết quả chương trình form dạng hình ellipse b. Sự kiện của Form Sự kiện của form hay có thể gọi là các hành động liên quan đến form. Ứng dụng Windows Forms được hỗ trợ nhiều sự kiện và các đoạn mã tạo ra các sự kiện đều được sinh ra một cách tự động. Để sử dụng các sự kiện của form cần thực hiện các thao tác sau: Bước 1: Nhấp chuột trái vào form Bước 2: Trên cửa sổ Properties tương ứng, nhấp chuột trái vào biểu tượng để mở hộp thoại các sự kiện. Bước 3: Hộp thoại chứa nhiều sự kiện liên quan đến form như: đóng form, mở form, di chuyển chuột vào form. 106
  109. Hình 10.9. Danh sách các sự kiện của form 107
  110. Bảng 10.3. Bảng mô tả các sự kiện của form Sự kiện Mô tả Xảy ra khi thuộc tính Autosize của Form chuyển từ AutoSizeChanged True sang False hay ngược lại là False sang True BackColorChanged Xảy ra khi thuộc tính BackColor của Form thay đổi Xảy ra khi người dùng Click chuột vào vùng làm Click việc thuộc Form ControlAdded Xảy ra khi một điều khiển được Add vào Form ControlRemoved Xảy ra khi một điều khiển bị xóa khỏi Form CursorChanged Xảy ra khi thuộc tính Cursor của Form thay đổi Xảy ra khi người dùng DoubleClick vào vùng làm DoubleClick việc của Form FontChanged Xảy ra khi thuộc tính Font của Form có sự thay đổi Xảy ra khi thuộc tính ForeColor của Form có sự thay ForeColorChanged đổi Xảy ra khi Form đã đóng (Nhấn vào nút X màu đỏ FormClosed trên titlebar) Xảy ra khi Form đang đóng (2 sự kiện FormClosed FormClosing và FormClosing thường dùng trong lập trình CSDL: khi xảy ra sự kiện này thì đóng kết nối CSDL) Xảy ra khi người dùng nhấn một phím hay một tố KeyDown hợp phím KeyPress Xảy ra khi người dùng nhấn một phím KeyUp Xảy ra khi người dùng nhả một phím Xảy ra khi người dùng nhấn chuột (một trong 3 lựa MouseClick chọn: Trái, giữa, phải) Xảy ra khi người dùng nhấp đúp chuột vào một MouseDoubleClick vùng làm việc của Form (một trong 3 lựa chọn: Trái, giữa, phải) MouseDown Xảy ra khi người dùng nhấn chuột Xảy ra khi người dùng di chuyển vào các vùng làm MouseHover việc Form Xảy ra khi di chuyển chuột ra khỏi vùng làm việc MouseLeave của Form 108
  111. Xảy ra khi di chuyển chuột trên một vùng làm việc thuộc Form (nếu Form có chứa một điều khiển nào MouseMove đó, khi di chuyển chuột trên điều khiển này thì không xảy ra sự kiện MouseMove của Form) Xảy ra khi người dùng nhả nhấn chuột (có thể là MouseUp chuột trái, chuột phải, chuột giữa – chuột cuộn) Xảy ra khi di chuyển Form (có sự thay đổi vị trí Move của Form) Xảy ra khi thuộc tính FormBorderStyle của Form StyleChanged thay đổi TextChanged Xảy ra khi thuộc tính Text của Form thay đổi. Sự kiện FormClosed: Sự kiện này được gọi khi Form đã đóng Sự kiện FormClosing: Sự kiện này được gọi khi Form đang đóng Sự kiện KeyPress: Xảy ra khi ấn phím, nếu không chỉ rõ phím nào được nhấn thì khi nhấn bất cứ phím nào của sự kiện KeyPress của form đều xảy ra. Sự kiện KeyDown: 109
  112. Sự kiện MouseClick: Xảy ra khi nhấn một trong 3 nút: chuột trái, giữa hoặc chuột phải 2. Menustrip Điều khiển MenuStrip cho phép lập trình viên xây dựng hệ thống menu trên form. Menu có thể xây dựng ở dạng một cấp hoặc nhiều cấp. Ví dụ menu của Notepad như hình 10.10. MenuStrip cho phép xây dụng menu với các điều khiển:  ToolStripSeparator  ToolStripMenuItem (Menu con)  ToolStripCombobox (Combobox)  ToolStripTextbox (Textbox) Hình 10.10. Màn hình menu của Notepad 110
  113. MenuStrip được đặt trong nhóm Menus & Toolbars của cửa sổ Toolbox Hình 10.11. Hiển thị điều khiển MenuStrip trên ToolBox Một số thuộc tính thường dùng của MenuStrip: Bảng 10.4. Bảng mô tả các thuộc tính của MenuStrip Thuộc tính Mô tả TextDirection Chọn hình thức trình bày menu. - Hình thức Horizontal: TextDirection - Hình thức Vertical 90: - Hình thức Vertical 270: Thêm các menu con. Kiểu menu có thể chọn một trong 4 dạng: MenuItem, ComboBox, Separator, TextBox. Dạng MenuItem (menu con): Items Dạng Combobox: Dạng TextBox: Separator (Gạch phân cách): Mang giá trị Yes hoặc No. RightToLeft Nếu là Yes thì sẽ trình bày menu từ phải qua trái: Bảng 10.5. Bảng mô tả các thuộc tính thường dùng của MenuItem Thuộc tính Mô tả Mang giá trị True hoặc False. - Nếu là True: Hiện biểu tượng CheckBox bên cạnh chuỗi Checked Text Nếu là False: Không biểu tượng CheckBox Mang giá trị True hoặc False. - Nếu là True: Biểu tượng CheckBox sẽ xuất hiện bên CheckOnClick cạnh chuỗi Text của menu con khi người dùng nhấp chuột chọn. - Nếu là False: Thao tác nhấp chuột của người dùng sẽ 111
  114. không ảnh hưởng gì đến việc hiển thị hay không hiển thị của biểu tượng CheckBox Cho biết trạng thái của CheckBox trên menu con. Có 3 trạng thái: UnChecked, Checked, Indeteminate. CheckState Lưu ý: Trạng thái Indeterminate chỉ có hiệu lực khi thuộc tính Checked là True. Hình thức trình bày của menu con. Có 4 kiểu hiển thị: - None: Không hiển thị gì trên menu con - Text: Cho phép hiển thị chuỗi mô tả DisplayStyle - Image: Cho phép hiển thị hình hoặc biểu tượng bên cạnh Text. - ImageAndText: Cho phép hiển thị hình (biểu tượng) và chuỗi mô tả. Image Hình ảnh xuất hiện bên cạnh chuỗi Text Kiểu trình bày của hình trong thuộc tính Image. Có thể thiết lập một trong hai giá trị: ImageScaling - None: Hiển thị bình thường - SizeToFit: Hiển thị đúng kích cỡ của hình hoặc biểu tượng ShorcutKeys Tổ hợp phím tắt ứng với menu Mang giá trị True hoặc False: - Nếu là True: Cho phép hiễn thị giá trị trong thuộc tính ShowShortcutKeys ShortcutKeyDisplayString. - Nếu là False: giá trị trong thuộc tính ShortcutKeyDisplayString sẽ không hiển thị. Text Chuỗi ký tự hiển thị trên menu TooltipText Chuỗi ký tự hiển thị khi rê chuột vào menu Bảng 10.6. Bảng mô tả các sự kiện thường dùng của MenuItem Phát sinh khi trạng thái (CheckState) CheckedChange của CheckBox thay đổi Phát sinh khi người dùng nhấp chuột Click vào menu 112
  115. Menu con dạng Separator: Menu dạng này đơn thuần chỉ là một đường kẻ ngang giúp ngăn cách các menu với nhau, giúp hệ thống menu hiển thị một cách rõ ràng hơn. - Menu con dạng ComboBox: Các thuộc tính, phương thức và sự kiện giống với điều khiển ComboxBox. - Menu con dạng TextBox: Các thuộc tính, phương thức và sự kiện giống với điều khiển TextBox. Câu hỏi ôn tập và bài tập 1. Trong các dòng mã lệnh sau đây, mã lệnh nào cho phép tạo và hiển thị một đối tượng Windows Form mới có tên là Form1 a) Form1 frm = new Form1; frm.Show(); b) Form Form1 = new Form(); Form1.Show(); c) Form1 frm ; frm.Show(); d) Form frm; frm.Show(); e) Form Form1 = new Form(); Form1.ShowDialog(); 2. Trong các thuộc tính sau, thuộc tính nào dùng để thiết lập nội dung hiển thị trên thanh title bar và thuộc tính nào dùng để thiết lập màu nền của form. a) Thuộc tính Text và ForeColor b) Thuộc tính Display và BackColor c) Thuộc tính Text và BackColor private void Form1_Click(object sender, EventArgs e) { //Tạo đối tượng lớp Form 113
  116. Form Form2 = new Form();//Thiết lập tiêu đề trên titlebar của form Form2.Text = “Giao diện Form 2”; //Thiết lập vị trí hiển thị form Form2.StartPosition = FormStartPosition.CenterScreen; //Thiết lập màu nền cho form Form2.BackColor = Color.CadetBlue; //Kiểm tra giá trị trả về của phương thức ShowDialog() //nếu giá trị trả về là DialogResult.Cancel thì Form2 //đã đóng, tiến hành đóng Form1 bằng phương thức //Close() if (Form2.ShowDialog() == DialogResult.Cancel) { this.Close(); } } d) Thuộc tính Display và ForeColor 3. Các thuộc tính sau, thuộc tính nào cho phép thiết lập form trở thành MdiForm a) IsMdiContainer b) MdiParent c) MdiContainer d) ParentForm 4. Các thuộc tính sau, thuộc tính nào cho phép thiết lập form trở thành Child Form a) IsMdiContainer b) MdiParent c) MdiContainer d) ParentForm 5. Trong các sự kiện sau, sự kiện nào sẽ phát sinh khi form đã đóng a) FormClosed b) FormClosing c) ClosedForm 114
  117. d) ClosingForm e) Load f) Click 6. Xây dựng form có dạng hình tam giác như hình 2.21 Hình 10.12. Thiết kế form dạng tam giác 7. Thiết kế giao diện chương trình hiển thị thời gian như sau: Hình 10.12. Thiết kế form hiển thị MenuStrip Yêu cầu: Menu Chức năng: Chức mục Thoát dạng MenuItem. Khi người dùng nhấn chuột trái vào Thoát hoặc nhấn tổ hợp phím Ctrl + T sẽ thoát chương trình. Menu Nội dung hiển thị: Dạng ComboBox. ComboBox chứa hai mục chọn: Hiển thị thời gian: Giúp hiển thị giờ phút giây trên label lblHienThi Hiển thị ngày tháng: Giúp hiển thị ngày tháng năm trên label lblHienThi 115
  118. BÀI 11: SỬ DỤNG LABEL, TEXTBOX, BUTTON Mã bài: 20.11 Giới thiệu: Các điều khiển cơ bản để hiển thị văn bản (Label), cho phép nhập dữ liệu (Textbox) và sử dụng nút lệnh để thực hiện thao tác là không thể thiếu trong quá trình thiết kế một Form. Mục tiêu: - Hiểu và vận dụng Button cho đồ án - Hiểu và vận dụng Label cho đồ án - Hiểu và vận dụng TextBox cho đồ án - Rèn luyện tính cẩn thận, tự giác, sáng tạo, làm việc nhóm. Nội dung chính: 11.Label Label thường dùng hiển thị thông tin chỉ đọc và thường sử dụng kèm với các điều khiển khác để mô tả chức năng. Labelđược đặt trong nhóm Common Controls của cửa số Toolbox. Hình 11.1. Hiển thị điều khiển Label 116