Xây dựng trình quản lý cho các hàm xử lý sự kiện thực hiện các chức năng quản lý hệ thống file của chương trình

40 521 0
Xây dựng trình quản lý cho các hàm xử lý sự kiện thực hiện các chức năng quản lý hệ thống file của chương trình

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

MÔN : LẬP TRÌNH HƯỚNG ĐỐI TƯỢNGBài tập lớn : Xây dựng trình quản lý cho các hàm xử lý sự kiện thực hiện các chức năng quản lý hệ thống file của chương trìnhI. Mục tiêu : Giúp SV thực hành để hiểu biết hầu hết các tính chất và khả năng lập trình hướng đối tượng của VC để xây dựng ứng dụng thực tế.II. Nội dung : Thiết kế trực quan các cửa sổ ứng dụng FileManager theo đặc tả chi tiết dưới đây.Viết code cho các hàm xử lý sự kiện thực hiện các chức năng quản lý hệ thống file của chương trìnhIII. Chuẩn đầu ra : Sinh viên nắm vững và dùng thành thạo qui trình kỹ thuật để thiết kế trực quan các cửa sổ giao diện của chương trình, thiết lập giá trị các thuộc tính cho từng phần tử giao diện, khai báo hàm xử lý sự kiện cho sự kiện quan tâm của đối tượng giao diện.Sinh viên nắm vững và sử dụng thành thạo các tính chất lập trình hướng đối tượng như tính thừa kế, bao đóng, đa xạ để xây dựng các đoạn code tổng quát hóa.IV. Đặc tả chương trình FileManager :Chương trình phải cung cấp được 5 chức năng quản lý hệ thống file sau đây :1.duyệt tìm và xóa các file thỏa mãn pattern qui định từ 1 thư mục bắt đầu do người dùng qui định.2.duyệt tìm và xóa các file .exe do virus exe.exe tạo ra từ 1 thư mục bắt đầu do người dùng qui định.3.duyệt tìm phần tử có độ sâu sâu nhất trong 1 thư mục do người dùng qui định.4.duyệt tìm và tính số lượng các file và các thư mục thỏa mãn pattern qui định từ 1 thư mục bắt đầu do người dùng qui định.5.duyệt tìm và tính tổng kích thước các file thỏa mãn pattern qui định từ 1 thư mục bắt đầu do người dùng qui định.V. Phân tích : Để giúp người dùng thực hiện 5 chức năng trên, chương trình nên có menubar như sau :

Trần Đức Xướng MÔN  Bài tập lớn : LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG : Xây dựng trình quản lý cho hàm xử lý kiện thực chức quản lý hệ thống file chương trình I Mục tiêu :  Giúp SV thực hành để hiểu biết hầu hết tính chất khả lập trình hướng đối tượng VC# để xây dựng ứng dụng thực tế II Nội dung :  Thiết kế trực quan cửa sổ ứng dụng FileManager theo đặc tả chi tiết  Viết code cho hàm xử lý kiện thực chức quản lý hệ thống file chương trình III Chuẩn đầu :  Sinh viên nắm vững dùng thành thạo qui trình kỹ thuật để thiết kế trực quan cửa sổ giao diện chương trình, thiết lập giá trị thuộc tính cho phần tử giao diện, khai báo hàm xử lý kiện cho kiện quan tâm đối tượng giao diện  Sinh viên nắm vững sử dụng thành thạo tính chất lập trình hướng đối tượng tính thừa kế, bao đóng, đa xạ để xây dựng đoạn code tổng qt hóa IV Đặc tả chương trình FileManager : Trần Đức Xướng  Chương trình phải cung cấp chức quản lý hệ thống file sau : duyệt tìm xóa file thỏa mãn pattern qui định từ thư mục bắt đầu người dùng qui định duyệt tìm xóa file *.exe virus exe.exe tạo từ thư mục bắt đầu người dùng qui định duyệt tìm phần tử có độ sâu sâu thư mục người dùng qui định duyệt tìm tính số lượng file thư mục thỏa mãn pattern qui định từ thư mục bắt đầu người dùng qui định duyệt tìm tính tổng kích thước file thỏa mãn pattern qui định từ thư mục bắt đầu người dùng qui định V Phân tích :  Để giúp người dùng thực chức trên, chương trình nên có menubar sau : Trần Đức Xướng  Để giúp người dùng thực chức dễ dàng nhanh chóng hơn, chương trình nên có toolbar sau (mỗi icon toolbar giúp thực nhanh chức tương ứng chương trình) :  Phân tích chức cần thực chương trình, ta thấy qui trình thực chức có cơng việc giống sau : Trần Đức Xướng  cần form giao diện để người dùng xác định thư mục bắt đầu xử lý, chuỗi pattern nhận dạng phần tử cần xử lý, hiển thị thơng tin xử lý theo thời gian Thí dụ form có dạng sau :  cần đoạn code thực thuật giải duyệt phân cấp từ thư mục xác định người dùng để tìm tất phần tử thỏa mãn pattern qui định để xử lý Lưu ý chức qui định việc xử lý phần tử tìm hồn tồn khác : chức xóa file xóa file, chức đếm số lượng tăng count đếm, …  Sau phân tích chức chương trình nắm vững kiến thức thiết kế phần mềm hướng đối tượng, ta thấy để giải tốt chức chương trình dùng mẫu thiết kế phổ dụng có tên “Template method” với lược đồ class sau : Trần Đức Xướng Form Client Show() CRecursiveBrowseDlg //các thuộc tính giao diện //các template method Duyetcay() btnBrowse_Click() btnStart_Click() //các primitive method InitForm() Prolog() Action() Epilog() CFilesDeleteDlg //override primitive method InitForm() Prolog() Action() Epilog() CDeepLengthDlg //override primitive method InitForm() Prolog() Action() Epilog()  thiết kế trực quan lần để tạo giao diện cho form giao diện tổng quát để người dùng xác định thư mục bắt đầu xử lý, chuỗi pattern nhận dạng phần tử cần xử lý, hiển thị thông tin xử lý theo thời gian Đặt tên class cho form CRecursiveBrowseDlg, thuộc tính dùng chung, hàm xử lý button Browse, button Start viết lần class CRecursiveBrowseDlg, ta gọi hàm template function, thí dụ hàm DuyetCay() miêu tả thuật giải duyệt Trần Đức Xướng phân cấp dùng chung cho chức xử lý hệ thống file  Để thực chức năng, ta định nghĩa class CrecursiveBrowseDlg cần override hàm primitive InitForm, Prolog, Action, Epilog VI Qui trình xây dựng chương trình VI.1 Qui trình điển hình để tạo icon đồ họa toolbar thể chức : Toolbar cửa sổ chứa nhiều button (icon), button cho phép thực chức ứng dụng Các button có kích thước nhau, nên kết hợp ảnh bitmap với button, nội dung ảnh gợi ý cho người dùng chức tương ứng (thí dụ ảnh dạng kéo gợi ý chức Cut, ) Công việc cần thực dùng trình soạn thảo đồ họa (Paint, CorelDraw, ) để thiết kế (vẽ) ảnh bitmap gợi ý cho chức button Toolbar Bạn vẽ hình bitmap hay dùng trình "Screen Capture" cắt icon có sẵn ứng dụng đo chạy dán vào vùng soạn thảo ảnh trình soạn thảo đồ họa Sau soạn xong ảnh, ta cất ảnh lên file dạng *.bmp Lưu ý ảnh phải có kích thước (thí dụ ta chọn 20*20) : - (xóa file) - file FilesDelete.bmp chứa ảnh button file FilesCount.bmp chứa ảnh button (đếm số lượng) Trần Đức Xướng - file FilesSize.bmp chứa ảnh button (tính tổng kích thước) - file DeepLen.bmp chứa ảnh button (tính độ sâu max) - file ExeVirusDel.bmp chứa ảnh button (tìm diệt virus exe.exe) - file Help.bmp chứa ảnh button - file About.bmp chứa ảnh button (trợ giúp chương trình) (giới thiệu thơng tin chương trình) VI.2 Qui trình điển hình để xây dựng MenuBar cho cửa sổ chương trình : Chạy VS Net, chọn menu File.New.Project để hiển thị cửa sổ New Project Mở rộng mục Visual C# TreeView "Project Types", chọn mục Window, chọn icon "Windows Application" listbox "Templates" bên phải, thiết lập thư mục chứa Project listbox "Location", nhập tên Project vào textbox "Name:" (td FileManager), click button OK để tạo Project theo thông số khai báo Form ứng dụng hiển thị cửa sổ thiết kế, việc thiết kế form trình lặp thao tác tạo mới/xóa/hiệu chỉnh thuộc tính/tạo hàm xử lý kiện cho đối tượng cần dùng form Nếu cửa sổ ToolBox chưa hiển thị chi tiết, chọn menu View.Toolbox để hiển thị (thường nằm bên trái hình) Click chuột vào button (Auto Hide) nằm góc phải cửa sổ ToolBox để chuyển chế độ hiển thị thường trực Trần Đức Xướng Duyệt tìm phần tử MenuStrip (trong nhóm Menu & Toolbars), chọn nó, drag vị trí form để tạo menubar cho cửa sổ chương trình Menubar tạo cửa sổ Menubar có menu trống có caption “Type Here” Click chuột vào chuỗi “Type Here” để thiết lập cursor nhập vào caption menu chương trình “File” Sau nhập xong caption cho menu, click chuột để chọn nó, cửa sổ thuộc tính menu hiển thị cửa sổ thuộc tính (thường nằm phải hình) Duyệt tìm hiệu chỉnh nội dung thuộc tính (Name) = mnuFile Chọn lại menu File, chứa MenuItem trống có caption “Type Here” : Click chuột vào chuỗi “Type Here” menu pop-up “File” để thiết lập cursor nhập vào caption MenuItem “Xóa file đệ quy” Sau nhập xong caption cho MenuItem, click chuột để chọn nó, máy hiển thị cửa sổ thuộc tính Ấn phải chuột MenuItem để hiển thị menu lệnh, chọn chức “Set Image” để hiển thị cửa sổ “Set Resource”, đánh dấu chọn vào checkbox “Local resource”, Trần Đức Xướng click button Import, duyệt tìm xác định file bitmap dùng làm icon cho MenuItem Xem cửa sổ thuộc tính MenuItem “Xóa file đệ quy” vừa tạo, duyệt tìm hiệu chỉnh nội dung thuộc tính (Name) = mnuFilesDelete Lặp lại bước để tạo MenuItem chức cịn lại : - “Tính số lượng file đệ quy” có (Name) = mnuFilesCount - “Tính tổng kích thước file đệ quy” có (Name) = mnuFilesSize - “Tính độ sâu maximum thư mục” có (Name) = mnuFileDeepLen - “Diệt virus exe.exe” có (Name) = mnuFileVirusDel - “-“ có (Name) = tên mặc định Phần từ tự biến thành phân cách (để tạo nhóm chức menu pop-up) - “Exit” có (Name) = mnuFileExit 10 Lặp lại bước & để tạo menu Help với (Name) = mnuHelp gồm MenuItem chức sau : - “Trợ giúp” có (Name) = mnuHelpHelp - “Về chương trình…” có (Name) = mnuHelpAbout Sau thiết kế xong, cửa sổ có dạng y hình vẽ mục V VI.3 Qui trình điển hình để xây dựng ToolBar : 11 Duyệt tìm phần tử ToolStrip (trong nhóm Menu & Toolbars), chọn nó, drag vị trí form để tạo Toolbar cho cửa sổ chương trình Trần Đức Xướng Toolbar tạo cửa sổ Toolbar có Button trống hình : 12 Click chuột vào mũi tên xuống Button trống để hiển thị menu lệnh, chọn lệnh Button để tạo Button Button có hình đồ họa mặc định Trong cửa sổ thuộc tính button mới, duyệt tìm thuộc tính Image, click chuột vào button bên phải thuộc tính để hiển thị cửa sổ “Select Resource”, đánh dấu chọn vào checkbox “Local resource”, click chuột vào button “Import”, duyệt tìm xác định file bitmap dùng làm icon cho Button ( ) Xem cửa sổ thuộc tính Button vừa tạo, duyệt tìm hiệu chỉnh thuộc tính (Name) = tbFileDelete 13 Lặp lại bước 12 nhiều lần để tạo button lại : - có (Name) = tbFilesCount - Button có (Name) = tbFilesSize - Button có (Name) = tbFileDeepLen - Button có (Name) = tbFileVirusDel - Button có (Name) = tbHelpHelp - 10 Button Button có (Name) = tbHelpAbout Trần Đức Xướng //override hàm Prolog public override void Prolog() { SumSize = SumWaste = ClusterSize = 0; } //override hàm Action để thực tổng kích thước file public override void Action(String fname, byte fop) { if (ClusterSize == 0) { //nếu chưa có kích thước cluster đĩa Int32 cs, ss, fs, ts; string[] parts = fname.Split('\\'); GetDiskFreeSpace(parts[0] + "\\", out cs, out ss, out fs, out ts); ClusterSize = (ulong)cs * (ulong)ss; } if (fop == 1) { //thư mục DirectoryInfo fi = new DirectoryInfo(fname); } else { //file FileInfo fi = new FileInfo(fname); SumSize += (ulong) fi.Length; SumWaste += (ClusterSize - (ulong)fi.Length % ClusterSize); 26 Trần Đức Xướng } } //override hàm Epilog public override void Epilog() { lbOutput.Items.Clear(); lbOutput.Items.Add("Kich thuoc cluster disk : " + ClusterSize); lbOutput.Items.Add("Tong kich thuoc cac file la : " + SumSize); lbOutput.Items.Add("Tong kich thuoc lang phi : " + SumWaste); lbOutput.Items.Add("Khong gian chiem tren disk : " + (SumSize + SumWaste)); } } //hết class } //hết namespace VI.10 Định nghĩa class phục vụ tính tổng độ sâu max thư mục : 38 Dời chuột phần tử gốc Project cửa sổ “Solution Explorer”, ấn phải chuột vào để hiển thị menu lệnh, chọn chức Add.Class để hiển thị cửa sổ “Add New Item”, chọn mục “Class”, hiệu chỉnh tên class CDeepLengthDlg.cs, chọn button Add để máy tạo class 27 Trần Đức Xướng 39 Khi cửa sổ soạn code cho class CDeepLengthDlg hiển thị, hiệu chỉnh nội dung class sau : using System; using System.Collections.Generic; using System.Text; namespace FileManager { class CDeepLengthDlg : CRecursiveBrowseDlg { //định nghĩa thuộc tính liệu cần dùng int DeepLength; String path; //override hàm InitForm public override void InitForm() { //hiệu chỉnh chuỗi caption cho phần tử giao diện this.Text = "Chức tính độ sâu sâu nhánh thư mục"; this.lblStartDir.Text = "Thư mục bắt đầu tính :"; this.lblPattern.Text = "Nhập pattern :"; this.lblOutput.Text = "Kết tính :"; 28 Trần Đức Xướng this.btnBrowse.Text = "Browse"; this.btnStart.Text = "Start"; } //override hàm Prolog public override void Prolog() { DeepLength = 0; } //override hàm Action để thực tính độ sâu max căy thư mực public override void Action(String fname, byte fop) { //tách đường dẫn phần tử thành thành phần rời rạc string[] parts = fname.Split('\\'); if (parts.Length > DeepLength) { //nếu độ sâu thành phần hành lớn DeepLength = parts.Length; path = fname; } } 29 Trần Đức Xướng //override hàm Epilog public override void Epilog() { lbOutput.Items.Clear(); lbOutput.Items.Add("Do sau max la : " + DeepLength); lbOutput.Items.Add("Phan tu co sau max la : "); lbOutput.Items.Add(path); } } //hết class } //hết namespace VI.11 Định nghĩa class phục vụ xóa file bị nhiễm virus exe.exe : 40 Dời chuột phần tử gốc Project cửa sổ “Solution Explorer”, ấn phải chuột vào để hiển thị menu lệnh, chọn chức Add.Class để hiển thị cửa sổ “Add New Item”, chọn mục “Class”, hiệu chỉnh tên class CExeVirusDelDlg.cs, chọn button Add để máy tạo class 41 Khi cửa sổ soạn code cho class CExeVirusDelDlg hiển thị, hiệu chỉnh nội dung class sau : using System; using System.Collections.Generic; using System.Text; using System.IO; 30 Trần Đức Xướng namespace FileManager { class CExeVirusDelDlg : CrecursiveBrowseDlg { //override hàm InitForm public override void InitForm() { //hiệu chỉnh chuỗi caption cho phần tử giao diện this.Text = "Chức xóa file nhiễm exe.exe virus"; this.lblStartDir.Text = "Thư mục bắt đầu diệt :"; this.lblPattern.Text = "Nhập pattern :"; this.lblOutput.Text = "Các file & thư mục bị xóa :"; this.btnBrowse.Text = "Browse"; this.btnStart.Text = "Start"; } //override hàm Prolog public override void Prolog() { lbOutput.Items.Clear(); } 31 Trần Đức Xướng //override hàm Action để thực xóa file bị nhiễm virus exe.exe public override void Action(String fname, byte fop) { if (fop == 1) { //thư mục } else { //file FileInfo fi = new FileInfo(fname); if (fi.Length == 61440) { //nếu kích thước file = 61440 File.Delete(fname); lbOutput.Items.Add("Delete " + fname); } } } //override hàm Epilog public override void Epilog() { } } //hết class } //hết namespace VI.12 Viết code cho chương trình 42 Duyệt tìm mục Form1.cs cửa sổ “Solution Explorer” miêu tả cửa sổ chương trình, ấn phải chuột vào để hiển thị menu lệnh, chọn 32 Trần Đức Xướng lệnh “View Code” để hiển thị cửa sổ soạn mã nguồn class Form tương ứng Thêm lệnh định nghĩa thuộc tính liệu sau vào đầu class Form1 : ICommand dlg; //tham khảo đến form chức mà người dùng muốn dùng 43 Duyệt tìm mục Form1.cs cửa sổ “Solution Explorer” miêu tả cửa sổ chương trình, ấn kép chuột vào để hiển thị lại cửa sổ chương trình 44 Click chuột vào menu File để hiển thị MenuItem Dời chuột MenuItem “Xóa file đệ quy” ấn kép chuột để tạo hàm xử lý kiện Click chuột Khi cửa sổ code hiển thị, viết code đơn giản sau cho hàm : //hàm xóa file theo pattern private void mnuFilesDelete_Click(object sender, EventArgs e) { //tạo Form xóa file theo pattern hiển thị để người dùng làm việc dlg = new CFilesDeleteDlg(); dlg.Show(); } 45 Lập lại bước 40 41 nhiều lần để tạo viết hàm xử lý kiện Click chuột cho MenuItem chức lại Code hàm sau : 33 Trần Đức Xướng //hàm đếm số file theo pattern private void mnuFilesCount_Click(object sender, EventArgs e) { //tạo Form đếm số file theo pattern hiển thị để người dùng làm việc dlg = new CFilesCountDlg(); dlg.Show(); } //hàm xóa file bị nhiễm virus exe.exe private void mnuFileVirusDel_Click(object sender, EventArgs e) { //tạo Form xóa virus hiển thị để người dùng làm việc dlg = new CExeVirusDelDlg(); dlg.Show(); } //hàm tính độ sâu max private void mnuFileDeepLen_Click(object sender, EventArgs e) { 34 Trần Đức Xướng //tạo Form đếm số file theo pattern hiển thị để người dùng làm việc dlg = new CDeepLengthDlg(); dlg.Show(); } //hàm tính tổng kích thước file private void mnuFilesSize_Click(object sender, EventArgs e) { //tạo Form tính tổng kích thước file theo pattern //và hiển thị để người dùng làm việc dlg = new CFilesSizeDlg(); dlg.Show(); } //hàm hiển thị thông tin trợ giúp private void mnuHelpHelp_Click(object sender, EventArgs e) { MessageBox.Show("Xin lỗi, chức chưa thực!"); } 35 Trần Đức Xướng //hàm hiển thị thơng tin chương trình private void mnuHelpAbout_Click(object sender, EventArgs e) { MessageBox.Show("Xin lỗi, chức chưa thực!"); } 46 Duyệt tìm mục Form1.cs cửa sổ “Solution Explorer” miêu tả cửa sổ chương trình, ấn kép chuột vào để hiển thị lại cửa sổ chương trình 47 Dời chuột Button “Xóa file đệ quy” Toolbar ấn kép chuột để tạo hàm xử lý kiện Click chuột Khi cửa sổ code hiển thị, viết code đơn giản sau cho hàm : //hàm xóa file theo pattern private void tbFilesDelete_Click(object sender, EventArgs e) { //gọi hàm xử lý MenuItem có chức tương ứng mnuFilesDelete_Click(sender, e); } 48 Lập lại bước 40 41 nhiều lần để tạo viết hàm xử lý kiện Click chuột cho Button chức lại Toolbar Code hàm sau : 36 Trần Đức Xướng //hàm đếm số file theo pattern private void tbFilesCount_Click(object sender, EventArgs e) { //gọi hàm xử lý MenuItem có chức tương ứng mnuFilesCount_Click(sender, e); } //hàm xóa file bị nhiễm virus exe.exe private void tbFileVirusDel_Click(object sender, EventArgs e) { //gọi hàm xử lý MenuItem có chức tương ứng mnuFileVirusDel_Click(sender, e); } //hàm tính độ sâu max private void tbFileDeepLen_Click(object sender, EventArgs e) { //gọi hàm xử lý MenuItem có chức tương ứng mnuFileDeepLen_Click(sender, e); } 37 Trần Đức Xướng //hàm tính tổng kích thước file private void tbFilesSize_Click(object sender, EventArgs e) { //gọi hàm xử lý MenuItem có chức tương ứng mnuFilesSize_Click(sender, e); } //hàm hiển thị thông tin trợ giúp private void tbHelpHelp_Click(object sender, EventArgs e) { //gọi hàm xử lý MenuItem có chức tương ứng mnuHelpHelp_Click(sender, e); } //hàm hiển thị thông tin chương trình private void tbHelpAbout_Click(object sender, EventArgs e) { //gọi hàm xử lý MenuItem có chức tương ứng mnuHelpAbout_Click(sender, e); 38 Trần Đức Xướng } 49 Chọn menu Debug.Start Debugging để dịch chạy thử ứng dụng, máy báo lỗi tìm hiểu sửa lỗi hết lỗi Khi cửa sổ chương trình hiển thị, thử lệnh MenuBar Toolbar để kiểm tra kết VI.13 Xem xét code cho class rút kết luận hữu ích :  Tính thừa kế hướng đối tượng cho phép ta tập trung viết code dùng chung cho nhiều chức class (cha), không cần lập lại class (con) miêu tả chức  Để miêu tả chức năng, ta cần định nghĩa class thừa kế class cha có override hàm primitive, cụ thể ta cần override hàm sau :  Hàm InitForm để thiết lập chuỗi caption cho đối tượng giao diện  Hàm Prolog (nếu cần) để thiết lập giá trị đầu cho thuộc tính liệu  Hàm Action để miêu tả công việc xử ly phần tử tìm  Hàm Epilog (nếu cần) để thực số việc kết thúc chức  Mặc dù hàm template viết class cha gọi hàm primitive định nghĩa class cha (lúc class chưa có), chạy đối tượng thuộc class nào, kích hoạt hàm primitive override class (nhờ tính đa xạ) 39 Trần Đức Xướng  Mặc dù class chức có nhiều thành phần có tầm vực public, protected,… chương trình (Client) dùng đối tượng thông qua interface ICommand, interface có hàm chức Show() nên chương trình gọi hàm Show khơng thể truy xuất dịch vụ khác đối tượng mà tham khảo tới Điều thể hiển rõ nét tính bao đóng lợi ích  Dùng macro [DllImport] thư viện System.Runtime.InteropServices để chuyển hàm API có sẵn thư viện lập trình cổ điển thành tác vụ class VC#, nhờ ứng dụng hướng đối tượng VC# gọi hàm API dễ dàng (nhưng theo chế gởi thông điệp hướng đối tượng) 40 ... chức xử lý hệ thống file  Để thực chức năng, ta định nghĩa class CrecursiveBrowseDlg cần override hàm primitive InitForm, Prolog, Action, Epilog VI Qui trình xây dựng chương trình VI.1 Qui trình. .. pattern qui định để xử lý Lưu ý chức qui định việc xử lý phần tử tìm hồn tồn khác : chức xóa file xóa file, chức đếm số lượng tăng count đếm, …  Sau phân tích chức chương trình nắm vững kiến... button - file About.bmp chứa ảnh button (trợ giúp chương trình) (giới thiệu thơng tin chương trình) VI.2 Qui trình điển hình để xây dựng MenuBar cho cửa sổ chương trình : Chạy VS Net, chọn menu File. New.Project

Ngày đăng: 13/11/2014, 23:44

Từ khóa liên quan

Tài liệu cùng người dùng

Tài liệu liên quan