Showing posts with label SoftDesign. Show all posts

Chú ý khi sử dụng ProgressBar

thuvienwinform - Khi sử dụng ProgressBar để hiển thị phần trăm công việc đã hoàn thành trong chương trình làm nó trở nên đẹp mắt hơn rất nhiều, nhưng kéo theo chương trình sẽ chạy chậm hơn rất nhiều nếu không sử dụng điều khiển này đúng cách!
Ví dụ: https://www.dropbox.com/s/nk8hnadpxo3r6n2/ThuVienWinform-ChuYKhiSuDungProgressBar.rar?dl=0
Trong tệp ví dụ này mình chạy vòng for 10000000 lần (for(int i = 1; i <= 10000000; i++) và dùng 1 ProgressBar để hiện thị xem vòng for chạy được bao nhiêu phần trăm rồi.

Trường hợp 1: ProgressBar.Maximum = 10000000; (cứ i tăng là cập nhật ProgressBar.Value - Cập nhật ProgressBar 10000000 lần).
Trường hợp 2: ProgressBar.Maximum = 100; (Tính toán cập nhật ProgressBar đúng 100 lần).
Với trường hợp 1 tốn 15s, trường hợp 2 chưa đến 1s. Vậy chứng tỏ rằng mỗi lần cập nhật ProgressBar.Value tốn rất rất nhiều thời gian, có lẽ vì liên quan đến đồ họa :3

Kết: Vị vậy khi sử dụng điều khiển này cần tính toán làm sao cho số lần cập nhật ProgressBar.Value không quá nhiều lần mà vẫn hiển thị được phần trăm công việc đang thực hiện

Đóng gói phần mềm - Đặt tất cả thư viện liên kết động (DLL) vào 1 thư mục

thuvienwinform - Đóng gói phần mềm - Đặt tất cả thư viện liên kết động (DLL) vào 1 thư mục

Đôi khi phần mềm của bạn sử dụng quá nhiều thư viện (*.dll), sau khi build rất khó tìm được Excute file (.exe) để chạy phần mềm. Vì vậy bạn muốn đặt tất cả *.dll ấy vào 1 folder nào đó để dễ nhìn hơn.

Sau đây mình sẽ hướng dẫn bạn làm việc đó chỉ trong 1 dòng Code. Tại phương thức Main trong file Program.cs bạn thêm dòng code sau :
 
AppDomain.CurrentDomain.AppendPrivatePath(AppDomain.CurrentDomain.BaseDirectory + @"\Library");

Trong đó "Library" chính là tên thư mục chứa tất cả *.dll của bạn AppDomain.CurrentDomain.BaseDirectory  xác định thư mục phần mềm của bạn.

Chúc 1 ngày làm viêc vui vẻ ^^!
7/30/2015
Đăng bởi :

Tạo mã kích hoạt cho phần mềm



thuvienwinform - Mình là mình kịch liệt phản đối việc những phần mềm đòi mã kích hoạt để tiếp tục sử dụng nhé! Biết chúng mày giỏi rồi lại còn đòi tiền, mịa nghĩ cũng cay. Nhưng làm ra được mấy cái (tạm gọi là phần mềm :v) thì cũng thấy mình phải nhận lại được cái gì đấy. Ví dụ như "Đã hết thời gian dùng thử. Vui lòng mua mã kích hoạt để tiếp tục sử dụng" || "hãy soạn tin nhắn theo cú pháp XXX 69 gừi 9669 để sử dụng phần mềm" || đơn giản chỉ là tăng lượt truy cập vào trang web để người ta biết đến mình :D "Truy cập ngay 69xxx96.com để nhận nhận mã VIP", bla bla...


Ảnh minh họa

Thường thì yêu cầu của những mã này là mỗi máy một mã kích hoạt riêng. Chả biết người ta làm thế nào nhưng từ ngày xửa ngày xưa, lúc mà người già không nhớ, trẻ con chưa biết, xưa lắm, thì máy tính ra đời và được gắn các mã số cố đĩnh như mã ổ cứng, card mạng,...thì đơn giản có thể dùng chính những mã này làm mã kích hoạt :)) 

if(MaNhapVao == MaOCung())
{
     ThongBao("Kích hoạt thành công!");
     //
}


Mạnh hơn thì viết ra các hàm mã hóa các mã này thành dạng khác

if(MaNhapVao == MaHoa(MaOCung()))
{
     ThongBao("Kích hoạt thành công!");
     //
}

Hoặc các hàm sinh mã theo thời gian: mã có tác dụng trong 69 phút chẳng hạn...

Khá là nhiều cách. Nhưng làm sau mà mỗi lần cài đều phải có một mã kích hoạt riêng mới hay :))

Hay hiện nay có một số phần mềm cần kết nối mạng để kích hoạt thì sẽ so sánh mã nhập vào với mã trên máy chủ cung cấp xem có đúng không, nếu đúng phần mềm sẽ được kích hoạt và xóa mã đó đi. Cách này sẽ có thể thực hiện đồng bộ hóa với máy chủ thông qua tài khoản người dùng => sau khi cài lại chỉ cần đăng nhập sẽ sử dụng được.

Chém vậy thui chứ nếu làm dự án lớn thì cái này có cả một đội chuyên nghiên cứu vấn đề này, đồng tiền bát gạo mà. Nhưng trên đây là những cách khá là đơn giản và cũng khá là hiệu quả cho những chương trình nho nhỏ.

Xin mời để lại ý tưởng cũng như ý kiến về vấn đề này ở phần bình luận.
3/20/2015
Đăng bởi :

Các yêu cầu đóng gói phần mềm (có hoặc không có cơ sở dữ liệu)

thuvienwinform - Sau khi hoàn thành phần mềm thì công việc cuối cùng là đóng gói và triển khai cài đặt trên các máy tính để tiến hành sử dụng. Thế mà sau khi cài đặt chương trình không hoạt động mới đau chứ! Nguyên nhân chắc hẳn chưa đảm bảo các yêu cầu khi đóng gói để cài đặt trên máy khác, vậy cần những yêu cầu gì? Cần làm những gì để thỏa mãn các yêu cầu đó? Hãy cùng thuvienwinform giải quyết trong bài viết này.


Yêu cầu 1: Máy được cài phải đảm bảo các nền tảng cho chương trình hoạt động
Các nền tảng ở đây là phiên bản .NET dùng để viết phần mềm, ngoải ra còn các nền tảng thường được sử dụng như MS SQL (LocalDB, MS SQL Server,...), MS Office (nếu dụng CSDL Acess), DirectX, Microsoft Visual C++,...Máy cài muốn chạy được phần mềm thì phải được cài các nền tảng mà phần mềm sử dụng.

Để xem project được viết trên nền tảng .NET nào chọn Project -> [Tên project] Properties... (dòng cuối)

Cách 1

Cách 2

Ấn Applicaiton sẽ thấy phiên bản .NET của project (mục Target framwork)

Chú ý: Win XP không cài được phiên bản .NET 4.5 nên nếu muốn chạy trên win xp thì chọn .NET Framework 4 hoặc .NET Framework 4 Client Profile

Đường dẫn tải các phiên bản .NET: https://www.dropbox.com/s/h65eiyu449eh2rp/LinkTai.txt?dl=0

Để cài các nền tảng một cách tự động có thể sử dụng phần mềm đóng gói Advance Instaler (nếu cần hướng dẫn sử dụng các bạn bình luận phía dưới nha...vì trên mạng cũng nhiều bài hướng dẫn phần mềm này) nhưng khi thêm các trình cài các nền tảng này vào thì tệp cài đặt cũng sẽ rất nặng!

Yêu cầu 2: Đảm bảo đủ các thư viện cho chương trình hoạt động
Để đảm bảo một chương trình .NET hoạt động thì cần cung cấp đủ cho nó các thư viện. Cụ thể ở đây là các tệp .dll. Vậy làm sao để biết chương trình chúng ta cần những thư viện nào?

Rất đơn giản xem trong Refences:

Trong tab Solution 
mở thư mục References ra -> chọn các thư viện cần thiết -> Properties -> đặt copy local = true

Nếu bạn không xác định được là cần copy những thư viện nào thì CHỌN TẤT cho an toàn (dù sẽ làm chương trình nặng hơn đôi chút =]])


Sau khi Build thì các thư viện sẽ được copy vào Bin

Yêu cầu 3: Nếu sử dụng đến CSDL thì cần tạo chuỗi kết nối đúng đến CSDL
Vấn đề sẽ xuất hiện khi bạn cài trên máy khác -> làm đường dẫn đến tệp CSDL bị thay đổi so với trên máy code -> cần điểu chỉnh lại để kết nối đến được với tệp CSDL.

Để đơn giản thay lại chuỗi kết nối là được:
Ví dụ với việc dử dụng LocalDB
ADO.NET:

string duongDan = System.IO.Directory.GetCurrentDirectory() + "\\tentep.mdf;";
string chuoiKetNoi = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=" + duongDan + "Integrated Security=True;Connect Timeout=30";
System.Data.SqlClient.SqlConnection conn = new System.Data.SqlClient.SqlConnection(chuoiKetNoi);


LINQ To SQL:

string duongDan = System.IO.Directory.GetCurrentDirectory() + "\\tentep.mdf;";
            string chuoiKetNoi = @"Data Source=(LocalDB)\v11.0;AttachDbFilename=" + duongDan + "Integrated Security=True;Connect Timeout=30";
            DataContext db = new DataContext(chuoiKetNoi);

Chú ý: @

Tạm kết: chắc hẳn 3 yêu cầu này chưa thể thỏa được mọi trường hợp nhưng là 3 yêu cầu cơ bản để một phần mềm chạy được trên một máy tính.

Hãy sống thật vui và đóng gói phần mềm thật nhiều các bạn nhé:))
3/19/2015
Đăng bởi :

Chỉnh sửa thông báo DevExpress (XtraMessageBox)

thuvienwinform - Mình rất là không thích những đoạn mà xen lấn tiếng anh, tiếng việt. Điển hình là các thông báo. Mặc định các nút đề là tiếng anh(OK, Yes, No, Cancel,...) chúng ta nên việt hóa toàn bộ. Vừa dễ dàng cho người sử dụng, vừa có được giao diện đẹp.



Công việc này khá đơn giản. Tạo 1 lớp (class) là xong!
Chú ý: cần thêm DevExpress.Data; và DevExpress.XtraEditors; (Add Reference)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DevExpress.XtraEditors.Controls;
using DevExpress.Utils.Localization;

namespace ThuVienWinform.ThongBaoDevExpress
{
    //https://documentation.devexpress.com/#WindowsForms/CustomDocument1866
    public class TuyChinhDevExpress : Localizer
    {
        public string Abort { set; get; }
        public string Cancel { set; get; }
        public string Ignore { set; get; }
        public string No { set; get; }
        public string Ok { set; get; }
        public string Retry { set; get; }
        public string Yes { set; get; }

        public TuyChinhDevExpress(string abort, string cancel, string ignore, string no, string ok, string retry, string yes)
        {
            this.Abort = abort;
            this.Cancel = cancel;
            this.Ignore = ignore;
            this.No = no;
            this.Ok = ok;
            this.Retry = retry;
            this.Yes = yes;
        }

        public override string GetLocalizedString(StringId id)
        {
            if (id == StringId.XtraMessageBoxAbortButtonText) return this.Abort;
            if (id == StringId.XtraMessageBoxCancelButtonText) return this.Cancel;
            if (id == StringId.XtraMessageBoxIgnoreButtonText) return this.Ignore;
            if (id == StringId.XtraMessageBoxNoButtonText) return this.No;
            if (id == StringId.XtraMessageBoxOkButtonText) return this.Ok;
            if (id == StringId.XtraMessageBoxRetryButtonText) return this.Retry;
            if (id == StringId.XtraMessageBoxYesButtonText) return this.Yes;
            return base.GetLocalizedString(id);
        }
    }
}

Sử dụng:
Khai báo đoạn này trong sự kiện nạp (Form_load), hay trong tệp Program.cs đều được:
Chú ý: using DevExpress.XtraEditors.Controls;

Localizer.Active = new TuyChinhDevExpress("&Hủy bỏ", "&Hủy", "&Chấp nhận", "&Xác nhận", "&Được", "&Thử lại", "&Được");

Vậy là xong rồi!
6/17/2014
Đăng bởi :

Thêm nút lên GridView của DevExpress bằng HyperLinkEdit

thuvienwinform - Với gridView của DevExpress, nếu không nói quá thì có thể hiển thị dữ liệu với mọi cách mà ta muốn. Nó hỗ trợ quá tuyệt vời! Nhưng thêm những thứ khác ngoài dữ liệu. Cụ thể như nút,  ô lựa chọn,...ta làm thế nào! Sau đây mình xin được giới thiệu cách thêm nút lên gridView của DevExpress. Cách là là thêm một cột HyperLinkEdit cho GridView sau đó hiển thị HyperLink đó bằng hình ảnh (nhìn giống nút)



CÁC BƯỚC THỰC HIỆN (3 BƯỚC)

Bước 1: Thêm 1 cột cho GridView

Ấn mũi tên chọn Add Column

Bước 2: Chỉnh Column Edit cho cột vừa thêm. Chọn New -> HyperLinkEdit
Ấn mũi tên của cột xong sủa giá tị của Column Edit thành HyperLinkEdit

Bước 3:  Đặt ảnh cho HyperLinkEdit

Ấn mũi tên chọn Run Designer

Columns -> chọn cột vừa thêm. Chú ý tên biến ở đây là repositoryItemHyperLinkEdit1

Kéo xuống đến thuộc tính Image Chọn hình ảnh cẩn hiển thị

Căn giữa cho ảnh (mục đích là che đi chữ của cột)


Bước 4: Viết mã cho sự kiện ấn (Click) cho nó. Chúng nó sẽ viết nó trong sự kiện Form_Load:
Cách 1:
private void frmQuanLiBaiSoan_Load(object sender, EventArgs e)
{
    repositoryItemHyperLinkEdit1.Click += repositoryItemHyperLinkEdit1_Click;//Gõ += xong ấn Tab
}

private void repositoryItemHyperLinkEdit1_Click(object sender, EventArgs e)
{
    //mã sự kiện
}

Cách 2:
private void frmQuanLiBaiSoan_Load(object sender, EventArgs e)
{
    repositoryItemHyperLinkEdit1.Click += (s1, e1) =>
        {
            //mã sự kiện
        };
}

Tham khảo thêm việc tùy chình GridView tại http://nvnhan2910.blogspot.com/2014/06/windowform-lam-viec-voi-gridview-grid.html

Xem thêm:

6/15/2014
Đăng bởi :
Nhãn :

Thêm thuộc tính, sự kiện cho các điểu khiển trong winform

thuvienwinform - Apply Attributes in Windows Forms Controls (áp dụng các thuộc tính vào các điều khiển trong winform) sẽ giúp chúng ta thêm những sự kiện, thuộc tính chúng ta cần vào các control này. Ví dụ như thêm tính năng chuẩn hóa cho textBox, hoặc giới hạn độ dài cho textBox. Rất tiện trong quá trình code và sau này, tức là dùng cho được nhiều sản phẩm. Chính vì sự hữu ích này, hôm nay mình xin được chia sẻ cách thêm thuộc tính và sự kiện cho các điều khiển trong winform.


Tải về project demo: https://www.dropbox.com/s/6ih1d0oephk97r2/thuvienwinform-ThemThuocTinhChoControl.rar (46KB)

Bài viết này sẽ giới thiệu việc thêm tính năng chuẩn hóa và giới hạn độ dài cho TextBox. Gồm 2 phần
- Phần I: Thêm thuộc tính, sự kiện cho 1 điều khiển dựa trên lớp kế thừa
- Phần II: Tạo 1 điều khiển chứa nhiều điều khiển (từ các điều khiển đã có)

Chú ý: nếu tải về mở ra lỗi thì ấn F5 cho nó chạy sẽ hết lỗi (Do nó chưa nạp các điều khiển tự tạo vào)
- Để đọc code dễ ấn chuột phải vào code -> Outlining -> Collapse to Definitions (Ctrl + M,O).
- Để xem code của cotrol không có Design: ấn F7 hoặc ấn vào Switch to code...

I. Thêm thuộc tính, sự kiện cho 1 điều khiển

1. Thêm thuộc tính


- Rất đơn giản thôi. Đầu tiên thêm 1 class với tên: MyTextBox

- Class này kế thừa của TextBox


- Sau đó ta thêm các thuộc tính cho MyTextBox như sau:

[Category("Thuộc tính xây dựng thêm")]
[Description("Chuẩn hóa văn bản nhập vào. Viết hoa kí tự sau dấu cách")]
[DefaultValue(true)]
public bool ChuanHoa
{
    get;
    set;
}

private DoDai _doDai;//Cái này phục vụ cho việc thêm sự kiện sau này
[Category("Thuộc tính xây dựng thêm")]
[Description("Định độ dài cho văn bản \nNgắn: 30 kí tự\nBình thường: 60 kí tự\nDài:255 kí tự")]
public DoDai ĐộDài
{
    get { return _doDai; }
    set{_doDai = value;}
}

Với DoDai là 1 enum

public enum DoDai
{
    Ngắn,
    BìnhThường,
    Dài,
    TốiĐa
}

Trở lại phần thiết kế ta đã có được như này


2. Xây dựng chức năng chuẩn hóa, giới hạn độ dài

a. Chuẩn hóa
- Chúng ta sẽ chuẩn hóa sau khi nhập chữ vào MyTextBox xong. Sử dụng sự kiện LostFocus và ấn nút Enter để thực hiện chuẩn hóa. this.Text = ChuanHoaXau(this.Text);

protected override void OnLostFocus(EventArgs e)
{
    base.OnLostFocus(e);
    ThucHienChuanHoa();
}

protected override void OnKeyDown(System.Windows.Forms.KeyEventArgs e)
{
    base.OnKeyDown(e);
    //Ấn enter
    if (e.KeyCode == System.Windows.Forms.Keys.Enter)
        ThucHienChuanHoa();
}

private void ThucHienChuanHoa()
{
    //Chuẩn hóa xâu trong textBox
    this.Text = ChuanHoaXau(this.Text);//Các hàm còn lại xem trong project demo nha
    //Đưa con trỏ nhấp nháy về cuối dòng
    this.Select(this.Text.Length, this.Text.Length);
}

Kết quả:


b. Giới hạn độ dài
- Để giới hạn độ dài ta sử dụng sự kiện TextChanged
protected override void OnTextChanged(EventArgs e)
{
    base.OnTextChanged(e);
    int doDaiToiDa = 0;
    switch (ĐộDài)
    {
        case DoDai.Ngắn         : doDaiToiDa = 30; break;
        case DoDai.BìnhThường   : doDaiToiDa = 60; break;
        case DoDai.Dài          : doDaiToiDa = 255; break;
        default: break;
    };
    if (ĐộDài != DoDai.TốiĐa)
        if (this.Text.Length > doDaiToiDa)
            ThietLapDoDai(doDaiToiDa);
}

/// <summary>
/// Thiết lập độ dài kí tự trong textBox
/// </summary>
/// <param name="ddtd">Độ dài tối đa cho phép</param>
private void ThietLapDoDai(int ddtd)
{
    //Dữ lại đoạn văn bản cho phép
    this.Text = this.Text.Substring(0, ddtd);
    //Đưa con trỏ nhấp nháy về cuối dòng
    this.Select(ddtd, ddtd);
}

- Cách này khá thủ công như có lẽ như vậy sẽ dễ hiểu hơn. Để tối ưu thì ta sửa luôn việc set get biến Text của TextBox. Chuẩn hóa luôn khi set get

3. Bắt sự kiện thay đổi giá trị ĐộDài

a. Sử dụng delegate EventHandler
- Tạo sự kiện
public event EventHandler ThayDoiDoDai;//Khai báo sự kiện

- Code cho sự kiện
protected virtual void OnThayDoiDoDai()
{
    EventHandler handler = this.ThayDoiDoDai;
    if (handler != null)
    {
        handler(this, EventArgs.Empty);
    }
}

- OK. Đã có sự kiện! Bây giờ đặt vào chỗ cần thực hiện sự kiện. Đó là khi giá trị ĐộDài thay đổi. Là lúc nào nhỉ?? Chính là lúc set get giá trị cho nó
public DoDai ĐộDài
{
    get { return _doDai; }
    set
    {
        _doDai = value;
        //Mỗi khi thay đổi giá trị -> set, get 1 lần => chính là sự kiện thay đổi giá trị
        OnThayDoiDoDai();
    }
}


b. Tạo lớp kế thừa của EventHandler để tạo thêm các giá trị cho sự kiện
- Ví như sự kiện CellClick của DataGridView có thể lấy giá trị hàng (e.RowIndex). Vậy làm như thế nào để thêm các thuộc tính cho sự kiện. Ta cần tạo 1 lớp kế thừa của thằng EventHandler như sau:
//Tạo class bằng file mới hoặc trong cùng class MyTextBox đều được. Xem thêm trong project demo
public class ThayDoiGiaTriDoDai : EventArgs
{
    public DoDai GiaTriDoDai { get; set; }
    public bool DuocChuanHoa { get; set; }
    public string ThongTinChoSuKien
    {
        get { return "Sự kiện thay đổi giá trị độ dài của MyTextBox"; }
    }
}

- Thêm sự kiện sử dụng lớp kế thừa này
[Category("Sự kiện Xây dựng thêm")]
[Description("Bắt sự kiện thay đổi độ dài. Dùng class kế thừa")]
public event EventHandler<ThayDoiGiaTriDoDai> ThayDoiDoDaiDungClass;//Khai báo sự kiện
/// <summary>
/// Code cho sự kiện
/// </summary>
/// <param name="s">Nạp giá trị đầu vào để hiển thị ra khi sử dụng sự kiện</param>
protected virtual void OnThayDoiDoDai(ThayDoiGiaTriDoDai s)
{
    EventHandler<ThayDoiGiaTriDoDai> handler = this.ThayDoiDoDaiDungClass;
    if (handler != null)
    {
        handler(this, s);
    }
}

- OK bây giờ sửa lại lúc set get là được
public DoDai ĐộDài
{
    get { return _doDai; }
    set
    {
        _doDai = value;
        //Mỗi khi thay đổi giá trị -> set, get 1 lần => chính là sự kiện thay đổi giá trị
        SuKien = new ThemThuocTinhChoControl.ThayDoiGiaTriDoDai();
        SuKien.GiaTriDoDai = this.ĐộDài;
        SuKien.DuocChuanHoa = this.ChuanHoa;
        OnThayDoiDoDai(SuKien);
    }
}

- Kết quả:



II. Tạo UserControl từ các control khác

- Trong thực tế có nhiều form ta có các kiểu bố trí giống nhau, có sự kết hợp của nhiều control giống nhau. Ví dụ như tập hợp các textBox để nhập thông tin họ tên ngày sinh,...thì ta chỉ cần tạo 1 lần vào sử dụng cho các form khác nhau. Để thực hiện việc này ta làm như sau:

- Tạo 1 UserControl

- Sau đó thì kéo các điều khiển khác vào

- Ok có thể nói là xong rùi nhưng ta muốn thêm các thuộc tính, sự kiện cho thằng này thì làm tương tự phần I là OK.
- Ví dụ thêm thuộc tính tự động Anchor:
public bool TuDongDanCachCacPhanTu
{
    get { return _tuDongDanCachCacPhanTu; }
    set 
    { 
        _tuDongDanCachCacPhanTu = value;
        if (_tuDongDanCachCacPhanTu)
        {
            this.Anchor = AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;//This ở đây là UserCOntrol
            this.myTextBox1.Anchor = AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
            this.myTextBox2.Anchor = AnchorStyles.Bottom | AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
        }
        else
        {
            this.Anchor = AnchorStyles.Top | AnchorStyles.Left;
            this.myTextBox1.Anchor = AnchorStyles.Top | AnchorStyles.Left;
            this.myTextBox2.Anchor = AnchorStyles.Top | AnchorStyles.Left;
        }
    }
}
- Sau khi đã thêm tạo được các file cs chỉ cần thêm vào các project khác là ok.

Nếu thấy hữu ích hãy để lại bình luận hoặc ấn G+. Cảm ơn các bạn đã đọc bài viết
4/25/2014
Đăng bởi :

[SOFTWARE DESIGN] Thiết kế phần mềm theo mô hình 3 lớp Layer

Hướng tới lập trình chuyên nghiệp (nói cho oai chứ mình gà lắm) - không chỉ về mặt code , thuật toán ... mà bạn cần phải thiết kế phần mềm sao cho dễ chỉnh sửa , cập nhật nhất (nhất là đối với code team và bạn đã định hướng phát triển phần mềm lâu dài)

Hôm nay mình xin giới thiệu một cách thiết kế khá phổ biết là "MÔ HÌNH 3 LỚP LAYER"

1. Giới thiệu tổng quan
Như tên của mô hình. Chúng ta sẽ thiết kế phần mềm theo 3 lớp sau :
- GUI Layer : chuyên xử lí về GUI (giao diện)
- Business Layer : chuyên xử lí về nghiệp vụ, thuật toán....
- Data Access Layer : đưa dữ liệu xuống cơ sở dữ liệu cũng như lấy dữ liệu từ cơ sở dữ liệu lên

Ngoài ra chúng ta dùng thêm 1 class là : Data Transfer Object (DTO) có chức năng là cầu nối giữa các Layer. (Ta cũng có thể dùng các parameter để truyền dữ liệu , tùy nhiên nhiều parameters quá thì nên dùng tên class này)

2. Các bước thiết kế phần mềm theo mô hình 3 lớp layer
Bây giờ chúng ta cùng nhau thiết kế một phần mềm đơn giản nhé ^^

Để đơn giản ở đây tôi không dùng hệ quản trị cơ sở dữ liệu mà ghi dữ liệu ra file "Data.txt"  (Coi như nó là DataBase đi :D -- File này sẽ chỉ ghi được 1 tài khoản thôi nhưng đây là ví dụ mà -- các bạn có thể áp dụng vào các hệ quản trị CSDL giống như vậy)

- Thiết kế một GUI như sau :
GUI có 2 textbox : txtTaiKhoan và txtMatKhau và một button : btnDangKi

- Tạo các Folder vào các class như hình dưới đây :
(GUI Layer : frmRegister.cs | Business Layer : XuLi.cs | Data Access Layer : VanChuyenDuLieu.cs
và DTO.cs)
- OK Tiến hành code nhé :

** DTO.cs (Nơi đây chỉ chứa các biến vận chuyển) :

namespace MOHINH3LOPLAYER
{
    public class DTO
    {
        private string _TaiKhoan;
        private string _MatKhau;
        public string TaiKhoan
        {
            set {_TaiKhoan = value;}
            get {return _TaiKhoan;}
        }
        public string MatKhau
        {
            set {_MatKhau = value;}
            get {return _MatKhau;}
        }
    }
}


**VanChuyenDuLieu.cs (Nơi đây chỉ có chức năng đọc/ghi dữ liệu xuống CSDL)
Ở phương thức GhiDuLieu tôi sẽ truyền vào đối tượng DTO
namespace MOHINH3LOPLAYER.Data_Access_Layer
{
    public class VanChuyenDuLieu
    {
        public static void GhiDuLieu(DTO doituong)
        {
            FileStream fs = new FileStream("Data.txt", FileMode.Create, FileAccess.ReadWrite, FileShare.None);
            StreamWriter sw = new StreamWriter(fs);
            sw.WriteLine(doituong.TaiKhoan);
            sw.WriteLine(doituong.MatKhau);
            sw.Flush();
            sw.Close();
        }
    }
}
** XuLi.cs (Nơi đây chỉ có chức năng xử lí thuật toán)

namespace MOHINH3LOPLAYER.Business_Layer
{
    public class XuLi
    {
        private static bool KiemTra(DTO doituong)
        {
            if (doituong.TaiKhoan != "" && doituong.MatKhau != "")
                return true;
            return false;
        }
        public static bool DangKi(DTO doituong)
        {
            if (!KiemTra(doituong))
                return false;
            MOHINH3LOPLAYER.Data_Access_Layer.VanChuyenDuLieu.GhiDuLieu(doituong);
            return true;
        }
    }
}

** Và cuối cùng là Xử lí nút "Đăng kí ở GUI" như sau :

private void btnDangKI_Click(object sender, EventArgs e)
        {
                         // Tạo đối tượng DTO
            DTO doituong = new DTO();
            doituong.TaiKhoan = this.txtTaiKhoan.Text;
            doituong.MatKhau = this.txtMatKhau.Text;

            if (MOHINH3LOPLAYER.Business_Layer.XuLi.DangKi(doituong))
            {
                MessageBox.Show("Đăng kí thành công");
            }
            else
            {
                MessageBox.Show("Đăng kí thất bại");
            }
        }

OK như vậy là xong ^^! Đơn giản đúng không :D

4/14/2014
Đăng bởi :

Nhận ngay 100$ cho VPS

Mua hàng ủng hộ page

Ủng hộ page

Nhãn

Code (45) Team Foundation Server (17) Database (14) News (14) product (13) toolbox (10) Linq (9) SoftDesign (8) XNA (6) API (5) Project (5) item (4)

- Bản quyền thuộc về Thư Viện WinForm - Giao diện: Metrominimalist - Thiết kế: Johanes Djogan -