Đây là cuốn giáo trình lập trình C trên window form. Có nhiều ví dụ thực tế, giúp các bạn dễ học và thực hành. Nhất là các bạn sinh viên chuyên ngành lập trình, CNTT,... Đây là cuốn giáo trình lập trình C trên window form. Có nhiều ví dụ thực tế, giúp các bạn dễ học và thực hành. Nhất là các bạn sinh viên chuyên ngành lập trình, CNTT,...
Trang 1BÀI 1: XỬ LÝ NGOẠI LỆ 1.1 Phát sinh và bắt giữ ngoại lệ
Trong ngôn ngữ C#, chúng ta chỉ có thể phát sinh (throw) những đối tượng cáckiểu dữ liệu là System.Exception, hay những đối tượng được dẫn xuất từkiểu dữ liệu này
Namespace System của CLR chứa một số các kiểu dữ liệu xử lý ngoại lệ màchúng ta có thể sử dụng trong chương trình Những kiểu dữ liệu ngoại lệnày bao gồm ArgumentNull - Exception, InValidCastException, vàOverflowException , cũng như nhiều lớp khác nữa
throw new System.Exception();
Khi phát sinh ngoại lệ thì ngay tức khắc sẽ làm ngừng việc thực thi trong khiCLR sẽ tìm kiếm một trình xử lý ngoại lệ Nếu một trình xử lý ngoại lệ không đượctìm thấy trong phương thức hiện thời, thì CLR tiếp tục tìm trong phương thức gọi chođến khi nào tìm thấy
Nếu CLR trả về lớp Main() mà không tìm thấy bất cứ trình xử lý ngoại lệ nào,thì nó sẽ kết
Trang 2kiểu Test và sau đó gọi hàm Func1() Sau khi in thông điệp “Enter Func1”, hàm
Func1() này gọi hàm Func2() Hàm Func2() in ra thông điệp đầu tiên và phát sinh mộtngoại lệ kiểu System.Exception Việc thực thi sẽ ngưng ngay tức khắc, và CLR sẽ tìmkiếm trình xử lý ngoại lệ trong hàm Func2() Do không tìm thấy ở đây, CLR tiếp tụcvào stack lấy hàm đã gọi trước tức là Func1 và tìm kiếm trình xử lý ngoại lệ Một lầnnữa trong Func1 cũng không có đoạn xử lý ngoại lệ Và CLR trả về hàm Main Tạihàm Main cũng không có, nên CLR sẽ gọi trình mặc định xử lý ngoại lệ, việc này đơngiản là xuất ra một thông điệp lỗi
Câu lệnh catch
Trong C#, một trình xử lý ngoại lệ hay một đoạn chương trình xử lý các ngoại
lệ được gọi là một khối catch và được tạo ra với từ khóa catch.
Trong ví dụ sau, câu lệnh throw được thực thi bên trong khối try, và một khối catch được sử dụng để công bố rằng một lỗi đã được xử lý.
Trang 3{Console.WriteLine(“Enter Main ”);
Test t = new Test();
t.Func1();
Console.WriteLine(“Exit Main ”);
}public void Func1(){
Console.WriteLine(“Enter Func1 ”);
Func2();
Console.WriteLine(“Exit Func1 ”);
}public void Func2(){
Console.WriteLine(“Enter Func2 ”);
try{Console.WriteLine(“Entering try block ”);
throw new System.Exception();
Console.WriteLine(“Exiting try block ”);
}Khi một ngoại lệ được phát sinh, việc thi hành ngay lập tức sẽ bị tạm dừng và
việc thi hành sẽ được chuyển qua khối lệnh catch Nó không bao giờ trả về luồng thực hiện ban đầu, tức là các lệnh sau khi phát ra ngoại lệ trong khối try không được thực
hiện Trong trường hợp này chúng ta sẽ không bao giờ nhận được thông báo “Exiting
try block ” Khối lệnh catch xử lý lỗi và sau đó chuyển việc thực thi chương trình
đến các lệnh tiếp sau khối catch Ở đây không có việc quay lại cuộc gọi hàm trước
trong stack Ngoại lệ bây giờ được xử lý, không có vấn đề gì xảy ra, và chương trìnhtiếp tục hoạt động bình thường Điều này trở nên rõ ràng hơn nếu chúng ta di chuyển
khối try/catch lên hàm Func1 như trong ví dụ minh họa
Trang 4Console.WriteLine(“Exit Main ”);
}public void Func1(){
Console.WriteLine(“Enter Func1 ”);
try{Console.WriteLine(“Entering try block ”);
Func2();
Console.WriteLine(“Exiting try block ”);
}catch{Console.WriteLine(“Exception caught and handled.”);
}
Console.WriteLine(“Exit Func1 ”);
}public void Func2(){
xử lý ngoại lệ, nhưng trong hàm này không có và CLR vào stack lấy hàm gọi trong
trường hợp này là Func1() Câu lệnh catch sẽ được gọi, và việc thực thi tiếp tục thực hiện bình thường sau câu lệnh catch.
Hãy chắc chắn rằng chúng ta đã hiểu rõ tại sao câu lệnh “Exiting try block” và
“Exit Func2” không được in ra Chúng ta có thể dùng cách cũ để kiểm tra việc này
bằng cách dùng chương trình debug cho chương trình chạy từng bước để tìm hiểu rõhơn
Tạo một khối catch xác định:
Ở đây ta chỉ dùng khối catch tổng quát, tức là với bất cứ ngoại lệ nào cũng được Tuy nhiên chúng ta có thể tạo ra khối catch xác định để xử lý chỉ một vài các
Trang 5ngoại lệ chứ không phải toàn bộ ngoại lệ, dựa trên kiểu của ngoại lệ phát sinh
Trong ví dụ này, phương thức DoDivide() sẽ không cho phép chúng ta chia chozero bởi một số khác, và cũng không cho phép chia số zero Nó sẽ phát sinh một đốitượng của Divide- ByzeroException nếu chúng ta thực hiện chia với zero Trong toánhọc việc lấy zero chia cho một số khác là được phép, nhưng trong ví dụ minh họa củachúng ta không cho phép thực hiện việc này, nếu thực hiện sẽ phát sinh ra một ngoại lệArithmeticException
Khi một ngoại lệ được phát sinh, CLR sẽ kiểm tra mỗi khối xử lý ngoại lệ theothứ tự và sẽ lấy khối đầu tiên thích hợp Khi chúng ta thực hiện với a=5 và b=7 thì kếtquả như sau:
Cuối cùng, giả sử chúng ta thay đổi giá trị của b là 0 Khi thực hiện điều này sẽdẫn đến ngoại lệ DivideByZeroException
!Ghi chú: Chúng ta phải cẩn thận thứ tự của câu lệnh catch, bởi
vì DivideByZero- Exception được dẫn xuất từ ArithmeticException Nếu chúng ta
đảo thứ tự của câu lệnh catch, thì ngoại lệ DivideByZeroException sẽ được phù hợp
với khối xử lý ngoại lệ Arith- meticException Và việc xử lý ngoại lệ sẽkhông bao giờ được giao cho khối xử lý DivideByZeroException Thật vậy,nếu thứ tự này được đảo, nó sẽ không cho phép bất cứ ngoại lệ nào được xử lý bởikhối xử lý ngoại lệ DivideByZeroException Trình biên dịch sẽ nhận ra rằngDivideByZeroException không được thực hiện bất cứ khi nào và nó sẽ thông báo mộtlỗi biên dịch
Chúng ta có thể phân phối câu lệnh try/ catch, bằng cách bắt giữ những ngoại
lệ xác định trong một hàm và nhiều ngoại lệ tổng quát trong nhiều hàm Mục đích củathực hiện này là đưa ra các thiết kế đúng Giả sử chúng ta có phương thức A, phươngthức này gọi một phương thức khác tên là phương thức B, đến lượt mình phương thức
B gọi phương thức C Và phương thức C tiếp tục gọi phương thức D, cuối cùngphương thức D gọi phương thức E Phương thức E ở mức độ sâu nhất trong chương
Trang 6phương thức E có thể phát sinh ra ngoại lệ, chúng ta có thể tạo ra khối try/catch để bắt
giữ những ngoại lệ này ở chỗ gần nơi phát sinh ra ngoại lệ nhất Chúng ta cũng có thểtạo ra nhiều khối xử lý ngoại lệ chung ở trong đoạn chương trình ở mức cao trongtrường hợp những ngoại lệ không đoán trước được
1.2 Những đối tượng ngoại lệ
Cho đến lúc này thì chúng ta có thể sử dụng tốt các ngoại lệ cũng như cách xử
lý khắc phục các ngoại lệ này Trong phần này chúng ta sẽ tiến hành việc tìm hiểu cácđối tượng được xây dựng cho việc xử lý ngoại lệ Đối tượng System.Exception cungcấp một số các phương thức và thuộc tính hữu dụng Thuộc tính Message cung cấpthông tin về ngoại lệ, như là lý do tại sao ngoại lệ được phát sinh Thuộc tính Message
là thuộc tính chỉ đọc, đoạn chương trình phát sinh ngoại lệ có thể thiết lập thuộc tínhMessage như là một đối mục cho bộ khởi dựng của ngoại lệ Thuộc tính HelpLinkcung cấp một liên kết để trợ giúp cho các tập tin liên quan đến các ngoại lệ Đây làthuộc tính chỉ đọc Thuộc tính StackTrace cũng là thuộc tính chỉ đọc và được thiết lậpbởi CLR Trong ví dụ 13.6 thuộc tính Exception.HelpLink được thiết lập và truy cập
để cung cấp thông tin cho người sử dụng về ngoại lệ DivideBy-ZeroException
Thuộc tính StackTrace của ngoại lệ được sử dụng để cung cấp thông tin stackcho câu lệnh lỗi Một thông tin stack cung cấp hàng loạt các cuộc gọi stack củaphương thức gọi mà dẫn đến những ngoại lệ được phát sinh
{Try{ Console.WriteLine(“ Open file here”);
Double a=12;
Double b=0;
Trang 7Console.WriteLine(“ {0}/{1} = {2}”,a,b,a/b);
}catch (System.DivideByZeroException e){
Console.WriteLine(“\nDivideByZeroException!Msg:
{0},e.Message”);
}catch {Console.WriteLine(“ ko xac dinh”);
}public double DoDivide(double a,double b){
if(b==0){
DivideByzeroException e = new DivideByZeroExceptin();
throw e;
}
If (a==0){
throw new ArithmeticException();
}Return a/b;
} }
Một số lớp ngoại lệ:
CÁC LỚP NGOẠI LỆ
MethodAccessException Lỗi truy cập, do truy cập đến thành viên hay phương
thức không được truy cậpArgumentException Lỗi tham số đối mục
ArgumentNullException Đối mục null, phương thức được truyền đối mục null
không được chấp nhậnarithmeticException Lỗi liên quan đến các phép toán
DivideByZeroException Lỗi chia 0
FormatException Định dạng không chính xác một đối mục nào đó
Trang 81.3 Phát sinh lại ngoại lệ
Giả sử chúng ta muốn khối catch thực hiện một vài hành động đúng nào đó rồi sau đó phát sinh lại ngoại lệ ra bên ngoài khối catch (trong một hàm gọi) Chúng ta
được phép phát sinh lại cùng một ngoại lệ hay phát sinh lại các ngoại lệ khác Nếuphát sinh ra ngoại lệ khác, chúng ta có thể phải nhúng ngoại lệ ban đầu vào bên trongngoại lệ mới để phương thức gọi có thể hiểu được lai lịch và nguồn gốc của ngoại lệ.Thuộc tính InnerException của ngoại lệ mới cho phép truy cập ngoại lệ ban đầu
Trang 9BÀI 2: VISUAL STUDIO.NET 2.1 Lập trình với Visual Studio NET
Microsoft Visual Studio NET là ngôn ngữ hướng thành phần (component) rấtmạnh C# đóng vai trò quan trọng trong kiến trúc NET Framework của Microsoft
Visual Studio.NET là môi trường lập trình cung cấp rất nhiều công cụ cần thiếtcho việc xây dựng các dự án lớn hoặc nhỏ
Thanh trình đơn (menu bar) cho phép truy cập đến các lệnh sẽ sử dụng trongmôi trường lập trình
Thanh công cụ (toolbar) nằm ngay bên dưới thanh trình đơn cung cấp các núttruy cập nhanh đến hầu hết các lệnh thường dùng
Khung cửa sổ soạn thảo (code pane) hiển thị nội dung các tập nguồn, đối với dự
án có nhiều tập tin, mỗi tập tin nguồn có thẻ của riêng nó với nhãn là tên tập tin nguồn
Để thao tác một tập tin nguồn chỉ việc bấm chọn lên thẻ của tập tin nguồn của dự án
Khung cửa sổ kết xuất (Output pane) hiển thị các thông điệp biên dịch (baogồm các cảnh báo và thông báo lỗi) khi tạo dựng (build) lệnh
Trước khi viết mã (coding) cần kiểm tra các tập tin trong khung cửa sổ SolutionExplorer, chúng được tạo ra bởi Visual Studio.NET khi tạo dựng dự án
Ví dụ khi tạo dự án có tên TextHello thì xuất hiện một số tập tin sau:
TextHello.shn: đây là tập tin giải pháp (solution file) cấp trên cùng, mỗiứng dụng có 1 tập tin loại này Mỗi tập tin giải pháp gồm một hay nhiềutập tin dự án Trong hệ thống tập tin, mỗi tập tin giải pháp có phần mở
rộng là shn, với phần tên hiển thị trong Solution Explorer thường dễ đọc.
TextHello.csproj: đây là tập tin dự án (project) của C# Mỗi tập tin dự ángồm một hay nhiều tập tin nguồn, các tập tin nguồn trong cùng một dự ánphải được viết cùng một ngôn ngữ Loại tập tin này được hiển thị trongSolution Explorer chỉ sử dụng tên của dự án, tuy nhiên nó được lưu trong
hệ thống tập tin với phần mở rộng csproj
Class1.cs: đây là 1 tập tin nguồn khác của C#, ta sẽ viết mã trong tập tinnày, Visual Studio.NET cũng tự động cung cấp một số mã lệnh (code) chotập tin này
AssemblyInfo.cs: đây là 1 tập tin nguồn khác của C#, dùng tập tin này đểthêm một số thuộc tính vào chương trình
Trang 10 App.ico: là tập tin icon được kết hợp với chương trình, tất cả các ứng dụngwindows có giao diện người dùng đều có icon, nó xuất hiện trên thanh tác
vụ (taskbar) khi chạy chương trình
Các ứng dụng của NET: được trình bày thông qua hình sau:
Trang 11Các thành phần của NET framework:
2.2 Thêm và điều chỉnh các điều khiển
Các thành phần và điều khiển của windows form:
Trang 12Ví dụ:
2.3 Thay đổi kích thước các Form:
Kênh điều khiển kích thước
Khung lưới này sẽ không xuất hiện trong solution
Nhấn giữ chuột phải, kéo và thả vào form
Trang 13BÀI 3: THỰC ĐƠN 3.1 Thực đơn chính
Thực đơn (Menu) là một thành phần quan trọng của cửa sổ, chúng chứa đựngcác chức năng chính của chương trình mà người dùng có thể thực hiện Thanhthực đơn chứa hầu hết tất cả chức năng chính của 1 chương trình, tổ chức theodạng phân cấp
Thực đơn là điều khiển gồm nhiều phần tử được tổ chức dưới dạng phân cấp.Thanh thực đơn nằm trên đỉnh cửa sổ (dưới thanh tiêu đề) Các phần tử thựcđơn (Menu Item) xuất hiện trên thanh thực đơn được gọi là Menu Item mứcđỉnh
Mỗi Menu Item mức đỉnh có thể chứa Menu Item cấp dưới (SubMenu) hoặcđược gắn trực tiếp với các bộ xử lý sự kiện (Event handler)
Khi một menu Item chứa các Menu Item cấp dưới thì thường gọi là PopupMenu Các Menu Item được gắn trực tiếp với bộ xử lý sự kiện được gọi làCommand Menu
1 Tạo thêm trình đơn và xử lý các sự kiện trình đơn
Microsoft Visual Studio NET cho phép thêm thực đơn và các mục thực đơnvào form theo 2 cách
- Có thể sử dụng IDE và trình soạn thảo thực đơn để tạo thực đơn
Trang 14- Viết mã lệnh để tạo đối tượng Main Menu, sau đó thêm đối tượng MenuItemvào nó
Tạo thực đơn
- Khởi động Visual Studio NET
- Mở dự án mới
- Hiển thị MemberForm trong cửa sổ Design View
- Trong hộp Toolbox, chọn điều khiển MainMenu
Thành phần điều khiển mặc định có tên mainMenu1 xuất hiện cuối form và 1thanh trình đơn chứa 1 nhãn Type Here được thêm vào form
- Bấm chọn nhãn Type Here trên thanh thực đơn, nhập vào &File rồi ấn Enter
- Khi nhập 1 giá trị mới, một nhãn Type Here thứ 2 xuất hiện bên phải củamục hiện thờim và nhãn Type Here thứ 3 xuất hiện bên dưới mục trình đơn File
Chú ý: Ký tự & phía trước một ký tự cung cấp 1 cách truy xuất nhanh tới mụctrình đơn đó khi người sử dụng ấn phím Alt và ký tự đi theo &
Trang 15Thiết lập các thuộc tính của mục trình đơn
1 Bấm chọn thành phần điều khiển mainMenu bên dưới form, trong cửa sổProperties thay đổi tên của nó thành mainMenu
2 Bấm phải chuột lên mục trình đơn File trên thanh trình đơn củaMemberForm, trên trình đơn vừa xuất hiện bấm chọn Edit Names
3 Bấm chọn mục menuItem1 trên thanh thực đơn, nhập fileItem rồi ấnEnter
Các phím truy xuất cho các mục trình đơn này chỉ có sẵn khi trình đơn thật sựđược hiển thị Các mục trình đơn được truy xuất nói chung cũng sẽ có các phím tắt màngười sử dụng có thể nhấn bất cứ lúc nào để gọi lệnh tương ứng
4 Chọn trình đơn Save Member trong trình đơn File trong MemberForm,chọn shortcut trong cửa sổ Properties Chọn CtrlS từ danh sách thả xuống
Chú ý: Mặc dù các giá trị cho các phím tắt có tên như CtrlS, AltF4,… khi chúngđược hiển thị trên trình đơn, chúng sẽ xuất hiện như sau: Ctrl + S và Alt+F4
5 Có 1 thuộc tính khác là ShowShortcut bên dưới thuộc tính Shortcut.Thuộc tính này quyết định phím tắt được hiển thị trên trình đơn hay không khi ứngdụng chạy Kiểm tra rằng thuộc tính này được thiết lập True
6 Thay đổi các phím tắt cho các mục trình đơn dùng các giá trị trong bảng sau.Phải đảm bảo rằng thuộc tính ShowShortcut cho mỗi mục trình đơn còn lại được thiết lậpTrue
Kiểm tra trình đơn
1 Từ trình đơn Debug, chọn Start (F5) để biên dịch và chạy ứng dụng
Trang 162 Khi form xuất hiện, bấm chọn File (Alt+F) khi đó trình đơn mới xuấthiện Ở đây các phím tắt của lệnh Print không được hiển thị sẵn.
3 Đóng form lại
Các thuộc tính của mục thực đơn khác
Các mục trình đơn có 1 số ít các thuộc tính khác Bảng dưới đây mô tả những thuộctính chung nhất
Name Thuộc tính này là tên của thực đơn
Checked Các mục thực đơn có thể hành động như các hộp kiểm và hiện
ra dấu kiểm khi chúng được bấm chọn Thiết lập thuộc tính nàythành True để hiện thị dấu kiểm, thiết lập False để che dấuDefaultItem Thuộc tính này chỉ ra mục thực đơn là mục mặc định hay
không, nếu thiết lập true thì khi người sử dụng nhấp đôi chuộtlên thực đơn cha lệnh tương ứng với mục này sẽ được thực thi.Các mục mặc định xuất hiện nét đậm khi chúng được hiển thịEnable Thuộc tính này chỉ ra mục trình đơn có sẵn dung hay không
Nếu không có sẵn dùng được nó sẽ bị mờ đi và người dùng sẽkhông thể chọn nó được
RadioCheck Thuộc tính này hoạt động liên kết với thuộc tính Checked Nếu
RadioCheck là true thì mục thực đơn xuất hiện với “radio dot”chứ không là dấu kiểm khi nó được chọn
Shortcut Thuộc tính này chỉ ra phím tắt người dùng có thể nhấn để thực
thi lệnh tương ứngShowShortcut Nếu thuộc tình là true, phím tắt được hiển thị trên thực đơn
cùng với dòng văn bản của mục trình đơnText Đây là dòng văn bản hiển thị trên trình đơn cho mục trình đơn
Có thể dùng ký tự & để chi ra phím truy xuấtVisible Thuộc tính này quyết định một mục có được hiển thị trên trình
đơn hay không Thường thì dùng thuộc tính Enable để cho thấyrằng một mục trình đơn có mặt nhưng không sẵn dùng
Các sự kiện trình đơn
Trang 17Có 5 sự kiện trình đơn khác nhau có thể xảy ra khi người sử dụng đặt được truyxuất tới một mục thực đơn
Click Sự kiện này xảy ra khi người sử dụng bấm lên mục trình đơnDrawItem Sự kiện này xảy ra khi mục trình đơn được vẽ lại
MeasureItem Sự kiện này xảy ra khi trình thực thi đang quyết định độ cao của
mục trình đơn Có thể sẽ không sử dụng sự kiện này thường xuấtPopup Sự kiện này xảy ra khi trình đơn được thực hiện, sử dụng sự kiện
này để điều chỉnh động các thuộc tính của mục trình đơn, tùytrường hợp và ngữ cảnh hiện thời
Select Sự kiện này xảy ra khi người dùng chọn mục trình đơn nhưng
chưa được bấm chọn
3.2 Các sự kiện popup và chia sẻ
Hầu hết các ứng dụng windows hiện đại đều có trình đơn popup, xuất hiện khinhấn phải chuột form hay thành phần điều khiển Những trình đơn này thường theongữ cảnh và chỉ hiển thị những lệnh nào có thể áp dụng cho form hay thành phần điềukhiển hiện thời đang được focus
Tạo trình đơn popup
Trình đơn popup thứ nhất được gắn vào 2 thành phần điều khiển Textbox có tên
là firstname và lastname và cho phép người dùng xóa các thành phần này Trình đơnthứ 2 được gắn vào form và chứa các lệnh để lưu thông tin của thành viên hiện thời vàxóa form Để thực hiện điều này cần dùng 1 trình đơn đang tồn tại và tạo 1 trình đơnmới
Tạo trình đơn popup firstname và lastname
1 Trong cửa sổ Design View đang hiển thị MemberForm, rẽ thành phần điềukhiển ContextMenu từ hộp công cụ và thả nó lên form Một đối tượngContextMenu là contextMenu1 xuất hiện cuối form
Trang 182 Chọn thành phần điều khiển contextMenu1, nhập vào textboxMenu trong hộpvăn bản (name) trong cửa sổ Properties rồi ấn Enter.
Khi chọn trình đơn popup(textboxMenu) có thể nhận thấy văn bản “ContextMenu” cũng xuất hiện trên thanh trình đơn của MemberForm Trình đơn không xuấthiện ở đó khi form chạy
3.3 Thực đơn ngữ cảnh
Thực đơn ngữ cảnh (ContextMenu) là loại thực đơn gắn với một điều khiển cụthể nào đó, ví dụ như bấm hay một hộp soạn thảo… Khi người dùng nhấn phải chuộtvào điều khiển có gắn thực đơn ngữ cảnh thì thực đơn ngữ cảnh của điều khiển đó sẽhiện ra và cho phép người dùng chọn công việc từ thực đơn
Trang 19Tương tự như thực đơn Menu, thực đơn ngữ cảnh gồm nhiều phần tử thực đơnđược tổ chức dưới dạng cây phân cấp Mỗi phần tử thực đơn có thể là CommandMenuItem hay Popup Menu Item Tuy nhiên thực đơn ngữ cảnh không nằm trên đỉnhcủa cửa sổ, nó gắn trực tiếp với một điều khiển nào đó và xuất hiện khi người dùngnhấn chuột phải lên đối tượng tương ứng.
Thực đơn ngữ cảnh riêng biệt là thực đơn ngữ cảnh gắn với 1 điều khiển cụ thể,các trạng thái của menu này chỉ dành riêng cho điều khiển chứa nó sử dụng
Ví dụ: khi chọn Menu “đậm” của nút nào đó thì nội dung của nó hiển thị dạng
in đậm đồng thời menu tương ứng cũng ở trạng thái Checked và ngược lại trạng tháichecked của mục “đậm” của menu ngữ cảnh thuộc nút bấm 1 không ảnh hưởng đếnthực đơn của nút bấm 2
Trang 20Bài tâp: thiết kế form như sau
Trang 21BÀI 4: THANH TRẠNG THÁI 4.1 Lớp statusbar
Thanh trạng thái là thanh nằm ngang dưới đáy cửa sổ hiển thị các thông tin vềtrạng thái hoạt động của ứng dụng Một thanh trạng thái có thể có nhiều mục trạng thái(Status Item) khác nhau, mỗi mục thể hiện một loại thông tin nào đó tới người dùng
Điều khiển statusstrip dùng để trình bày thông tin về điều khiển đangthực hiện trên form
Một số các thuộc tính của statusstrip
Dock: chọn vị trí định vị trên form của điều khiển statusstrip
TextDirection: chọn hình thức trình bày statusStrip theo 3 cách
Items: Collection nắm giữ danh sách điều khiển
Chú ý: statusstrip được xem như điều khiển chứa các điều khiển khác
4.2 Các bảng (panel) thanh trạng thái
4.2.1 Thanh trạng thái với các phần tử văn bản(ToolstripStatusLabel)
Điều khiển ToolstripStatusLabel trình bày chuỗi trên điều khiển StatusStrip Form trên trình bày thanh status với 3 điều khiển toolstripStatusLabel : Ready,user, Module trong đó điều khiển Ready có chèn biểu tượng Image
Trang 224.2.2 Thanh trạng thái với phần tử là thanh tiến trình (Progress Bar)
Nếu muốn trên thanh trạng thái thể hiện trạng thái thực hiện của một công việcnào đó, ta có thể đưa thanh tiến trình vào một phần tử trên thanh trạng thái
Ví dụ:
Thiết kế form gồm 1 listview, 1 button, toolstripprogressbar
Khi người sử dụng click vào nút show thì sẽ load các file trong thư mụcwindows\system32 trong ổ C và đưa ra tổng số file
Trang 23private void Form3_Load(object sender, EventArgs e)
// khai báo và khởi tạo đối tượng DirectoryInfo
DirectoryInfo dir = new DirectoryInfo(@"C:\WINDOWS\system32\"); ListViewItem item1;
// khai báo thuộc tính Maximum bằng số lượng tập tin
toolStripProgressBar1.Maximum = dir.GetFiles("*.*").Length;
// duyệt qua từng tập tin
foreach (FileInfo f in dir.GetFiles("*.*"))
{
item1 = new ListViewItem(f.Name );
item1.SubItems.Add( f.Length.ToString());
listView1.Items.Add(item1);
Trang 24// khai báo thuộc tính value ứng với tập tin thứ i toolStripProgressBar1.Value = i;
i++;
}
// gán tổng số lượng tập tin duyệt qua
toolStripStatusLabel1.Text = i.ToString()+" file(s)"; }
Trang 25BÀI 5: CÁC HỘP THOẠI
Có 2 kiểu hộp thoại: kiểu Modal (bắt buộc nhập liệu) và kiểu Modaless (khôngbắt buộc nhập liệu) Kiểu Modal yêu cầu người dùng phải hoàn tất thao tác nhập liệuhoặc những yêu cầu chọn lựa trước khi quay trở về dòng hoạt động chính của chươngtrình (ví dụ như các hộp thoại Options trong MS word) Hộp thoại kiểu Modaless cóthể được dùng để thực hiện thao tác nào đó nhưng vẫn cho phép người dùng tương tácvới phần còn lại của chương trình (ví dụ hộp thoại tìm kiếm Search Dialog)
Trong môi trường NET, hộp thoại là thành phần thiết yếu của Windows Form.Các điều khiển được đặt lên trên hộp thoại theo cùng cách mà người dùng để đặt trêncác cửa sổ form thông thường của ứng dụng – bằng công cụ trực quan hoặc bằng viếtcode
5.1 Hộp thoại thông điệp
Hộp thoại thông điệp được dùng với mục đích đơn giản hóa và tạo sự tương tácthống nhất cho người dùng sử dụng hệ điều hành windows Hộp thoại được hiển thịbằng cách gọi hàm ShowDialog() Tất cả các hộp thoại thông điệp đều ra đời và kếthừa từ lớp System.Windows.Forms.CommonDialog
Hộp thoại thường sử dụng nhất – FileDialog
Hộp thoại thường được sử dụng nhất trong các hộp thoại đó là hộp thoại mở,đọc và ghi file (file dialog) Windows Forms định nghĩa hai loại hộp thoại dạng file đó
là hộp thoại mở file (open file dialog) và hộp thoại lưu file (save file dialog) Để dùngcác hộp thoại này trong ứng dụng cần phải khai báo biến thành viên có kiểuOpenFileDialog hoặc SaveFileDialog trong lớp ứng dụng chính Và cũng như các hộpthoại cơ bản khác, 2 lớp này cũng bắt nguồn từ lớp System.Windows.Forms.Dialog.using System;
Trang 26OpenFileDialog dlg=new OpenFileDialog();
if(dlg.ShowDialog() == DialogResult.OK){
MessageBox.Show("You selected the file
"+dlg.FileName);
}}
void OnExit(Object sender, EventArgs e)
Hộp thoại chọn màu – ColorDialog
Chọn màu là công việc rất thường hay làm trong môi trường đồ họa nhưwindows Rất nhiều chương trình đã cố gắng viết riêng cho mình một bộ chọn màu vì
lý do tạo tính cách riêng và nổi bật cho chương trình Tuy nhiên để đơn giản ta sử dụnglớp ColorDialog Ngoài ưu điểm dễ dùng, hộp thoại chọn màu là hộp thoại chuẩn dễdùng và quen thuộc đối với hầu hết người dùng ứng dụng Windows
Trang 27Lớp ColorDialog trả về thông tin màu ở dạng đối tượng Color Thông tin nàybao gồm trị alpha (độ trong suốt), trị đỏ(red), xanh (green) và xanh(blue).
ColorDialog còn cung cấp một thuộc tính mang tên AllowFullOpen cho phéphiển thị nút nhấn tùy biến định nghĩa màu Nếu sử dụng thuộc tính FullOpen, hộp thoạichọn màu sẽ hiển thị ở chế độ phức tạp và đầy đủ nhất để định nghĩa giá trị màu cầnchọn
Trang 28// 0xAARRGGBB where AA is alpha, RR is red, // GG is green and BB is blue expressed as the // hexadecimal byte equivalent
dlg.CustomColors = new int[5]{0x00ff8040, 0x00c256fe,
0x00aa2005, 0x0004f002, 0x002194b5};
dlg.ShowDialog();
}
ColorStretcher()
{
// first a menu for the choices
MainMenu m=new MainMenu();
temp=new MenuItem("No custom");
temp.Click+=new EventHandler(OnNoCustom);
top.MenuItems.Add(temp);
temp=new MenuItem("With Colours");
temp.Click+=new EventHandler(OnWithColours);top.MenuItems.Add(temp);
Trang 29Để lấy về giá trị màu được chọn từ hộp thoại ColorDialog, ta chỉ cần đọc nộidung của thuộc tính Color Thiết lập giá trị cho thuộc tính này trước khi gọi phươngthức ShowDialog() sẽ áp đặt màu được chọn vào lúc hộp thoại hiển thị Điều này sẽthuận lợi cho việc thay đổi màu đã được thiết lập sẵn trong ứng dụng trước đó
Hộp thoại chọn font – FontDialog
Trong windows, chọn font chữ cho văn bản rất quan trọng và thường xuyênđược sử dụng trong rất nhiều chương trình Windows cho phép chọn tên font, cỡ chữ,kiểu chữ Lớp FontDialog một lần nữa giúp lập trình viên trong môi trường NET đơngiản hóa thao tác xử lý font
5.2 Hộp thoại Modal và Modaless
Hộp thoại được tạo ra theo cùng cách tạo form Lớp Form chứa một thuộc tínhmang tên Modal, nếu đặt thuộc tính này là True thì Form tạo ra sẽ là hộp thoại dạngmodal
Phương thức ShowDialog() của Form sẽ đặt giá trị cho thuộc tính này và chophép hiển thị form ở dạng modal
private Button ok,can;
public bool Modeless
{
set {
if(value){
ok.Click += new EventHandler(OnCloseModeless);
can.Click += new EventHandler(OnCloseModeless);
}}
}
Trang 30void OnCloseModeless(Object sender, EventArgs e){
ok = new Button();
ok.Text = "OK";
ok.DialogResult = DialogResult.OK;
ok.Location = new Point(20,10);
ok.Size = new Size(80,25);
this.Controls.Add(ok);
can = new Button();
can.Text = "Cancel";
can.DialogResult = DialogResult.OK;
can.Location = new Point(110,10);
can.Size = new Size(80,25);
Trang 31this.Size=new Size(400,100);
this.FormBorderStyle = FormBorderStyle.FixedDialog;
this.Text = "Dialog Mode Tester";
Button modal = new Button();
modal.Text = "New Modal dialog";
modal.Location = new Point(10,10);
modal.Size = new Size(180,25);
modal.Click += new EventHandler(OnModal);
this.Controls.Add(modal);
Button modeless = new Button();
modeless.Text = "New Modeless dialog";
modeless.Location = new Point(210,10);
modeless.Size = new Size(180,25);
modeless.Click += new EventHandler(OnModeless);this.Controls.Add(modeless);
Trang 32BÀI 6: FORM VÀ CÁC ĐỊNH DẠNG FORM
Form có 3 loại chính là Multiple Document Interface (MDI) còn gọi là MDIform (form cha) cho phép trình bày các form khác bên trong ParentForm, form connày gọi là ChildForm Những form mở ra không nằm trong ParentForm thì gọi làNorma Form
Ví dụ gán thuộc tính IsMdiContainer cho Form2:
private void button1_Click(object sender, EventArgs e)
{
Form f1 = new Form2();
//khai bao thuoc tinh IsMdiContainer
f1.IsMdiContainer = true;
// xuat Form2 len man hinh
Trang 33f1.Show();
}
Khi chạy chương trình, nếu click vào nút Form2 thì Form2 cũng sẽ xuất hiện là
1 MDI Form như hình sau:
Trong 1 project có thể có nhiều MDI Form, khi một form con kích hoạt, nếu làChildForm thì phải khai báo Parent Form của nó là MDI Form
Ta có thể thêm mới MDI từ Template có sẵn như trên
Trang 346.2 ChildForm
1 form con là form mà khi nạp lên sẽ nằm bên trong vùng làm việc của MDIForm Để form trở thành Child Form thì ta phải khai báo thuộc tính MdiParent ứng vớiMDI Form trong project
Ví dụ thêm mới form3 vào project, khai báo form3 là form con của form1:private void button2_Click(object sender, EventArgs e)
{
Form f2 = new Form3();
//khai báo MDI Form là Form hiện hành
f2.MdiParent = this;
f2.Show();
}
Chú ý: thuộc tính MdiParent không xuất hiện trong cửa sổ thuộc tính khi ở chế
độ thiết kế Và ta không thể sử dụng phương thức ShowDialog để mở cho form dạngChild Form vì kích thước và không gian làm việc của Child Form phụ thuộc vàokhông gian của MDI Form
6.3 Normal Form
1 form mở ra nếu không phải là MDI Form hay Child Form thì sẽ là NormalForm( Form thường) Để hiển thị Form dạng Normal ta cũng có thể sử dụng 2 phươngthức: Show() hay ShowDialog()
Sử dụng phương thức Show() thì form mở ra cho phép chuyển sang chế độ làmviệc trên những Form đã mở trước đó
Sử dụng phương thức ShowDialog() thì form mở ra dạng Modal, không chophép chuyển sang chế độ làm việc form đã mở trước đó trừ khi form này đóng lại
Ngoài ra, ta có thể tạo form bằng đoạn mã rồi nạp chúng lên màn hình :
private void button4_Click(object sender, EventArgs e)
{
Form frm = new Form();
frm.Text = "New Form";
frm.Show();
}
Trang 356.4 Thuộc tính của Form
Nhóm thuộc tính nhận dạng
Thuộc tính Name: Là thuộc tính dùng để nhận dạng duy nhất của đối tượngForm trong Project Mỗi form phải có tên hợp lệ trong thuộc tính Form, không
có 2 Form cùng tên trong 1 Project
Thuộc tính Text: Thuộc tính Text dùng để trình bày chuỗi trên thanh tiêu đề củaForm, ta có thể khai báo thuộc tính này trogn chế độ thiết kế hoặc trong khi thihành
Thuộc tính ShowIcon: Mỗi Form khi nạp lên màn hình đều có biểu tượng mặcđịnh góc trên bên trái Biểu tượng này tùy thuộc vào tập tin hình ảnh mà ta khaibáo trong thuộc tính Icon
Thuộc tính Opacity: cho phép làm trong suốt bề mặt của Form tuỳ thuộc vàogiá trị % khai báo trong thuộc tính này Ta có thể khai báo giá trị % trong khithiết kế hoặc trong lúc thi hành
private void Form1_Load(object sender, EventArgs e)
Thuộc tính BackColor: Dùng để định dạng màu nền của Form
Thuộc tính ForeColor: Dùng để định dạng màu mặc định cho chuỗi các Controltrên Form
Thuộc tính IsMdiContainer: Giá trị mặc định của thuộc tính IsMdiContainer làFalse tương đương với Normal Form Nếu là true sẽ là MDI Form
Thuộc tính chỉ thị:
2 thuộc tính chính của Form dùng để thực hiện chức năng chỉ thị với điều khiển
Button là AcceptButton và CancelButton
AcceptButton: Khi 1 button được AcceptButton thì khi nhấn Enter tự động nút
đó được thực hiện
Trang 36 CancelButton: Khi 1 button được CancelButton thì khi nhấn Esc tự động nút đóđược thực hiện.
6.5 Sự kiện của Form
Sự kiện FormClosed: Sự kiện này xảy ra khi đã đóng form Nếu ta đóng formthì nó sẽ đưa ra lý do tại sao đóng form
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
Trang 37 Sự kiện Load: xảy ra trước khi form hiển thị lần đầu tiên
private void Form1_Load(object sender, EventArgs e)
Sự kiện KeyPress: xảy ra khi 1 phím được nhấn
Sự kiện Resize: xảy ra khi kích thước của Form thay đổi
Chú ý: Nếu không muốn sử dụng sự kiện đang tồn tại thì R_click vào tên sựkiện trong cửa sổ Properties rồi chọn Reset
Trang 38BÀI 7: CÁC ĐỐI TƯỢNG 7.1 Sự thừa kế form
Khi có nhiều form có định dạng tương tự nhau, thay vì tạo Form dạng Template
ta có thể thiết kế Form và khai báo mã rồi khai báo kế thừa vào các form khác
Ví dụ, khai báo form để trình bày danh sách tên tập tin của thư mục chỉ địnhnào đó Mỗi khi cần trình bày danh sách mẩu tin, ta chỉ việc khai báo kế thừa từ Formnày và có thể thay đổi định dạng cho phù hợp
Đầu tiên thiết kế Form có tên frmInherit, thêm 3 điều khiển ListView, textbox
và button vào form:
Sau đó khai báo sự kiện click của nút btnShow:
private void btnShow_Click(object sender, EventArgs e) {
}
Trang 39Thay vì kế thừa từ Form, ta kế thừa từ frmInherit:
public partial class Form6 : frmInherit
Trang 40Khi thực thi chương trình, thì form6 xuất hiện, tại TextBox ta lựa chọn ổ D:\ thìdanh sách tập tin được trình bày như sau:
Các thuộc tính chung của các điều khiển trên Form:
BackColor Màu nền của điều khiển
ForeColor Màu chữ của chuỗi trình bày trên điều khiển
Text Chuỗi trình bày trên điều khiển
Visible Thuộc tính che dấu hay hiển thị điều khiển
Locked Khóa không cho di chuyển trên Form
Các sự kiện (event) thông thường của điều khiển trên Form:
Click Xảy ra khi người sử dụng nhấn chuột phải
MouseMove Xảy ra khi người sử dụng di chuyển chuột qua vùng làm việc
của điều khiển MouseUp Xảy ra khi người sử dụng nhấn chuột xuống vùng làm việc
của điều khiển rồi thả ra