TH5: Tạo ứng dụng từ điển đơn giản
//
Trong hộp RichTextbox, các từ tiếng anh sẽ có màu xanh, còn các từ tiếng việt sẽ màu đen.
Bây giờ, bạn đã hiểu toàn bộ ý tưởng của dự án, hãy chuyển sang giai đoạn thiết kế giao diện. Các bạn hoàn thành theo các bước sau:
Mục đích:
xây dựng một ứng dụng từ điển đơn giản ví dụ từ điển Anh – Việt, Việt – Anh, v.v. sử dụng hệ quản trị cơ sở dữ liệu Access để quản lý dữ liệu.Hướng dẫn:
- Tạo giao diện
Trong hộp RichTextbox, các từ tiếng anh sẽ có màu xanh, còn các từ tiếng việt sẽ màu đen.
Bây giờ, bạn đã hiểu toàn bộ ý tưởng của dự án, hãy chuyển sang giai đoạn thiết kế giao diện. Các bạn hoàn thành theo các bước sau:
- Mở Visual Studio 2008 và tạo một Project bằng cách tới menu File > New và kích trên ..
- Hộp thoại New Project mở ra
- Trong hộp thoại New Project, dưới Project Types chọn Visual C#, và chọn Windows Form Application dưới Templates. Trong hộp Name đánh: FITADictionary
- Bạn kích vào nút Browse... để chọn nơi lưu trữ dự án của bạn
- Click OK. Bạn sẽ nhìn thấy một form mặc định tên là Form1
- Kích chuột phải trên form này và chọn Properties để hiển thị cửa sổ Properties của form.
- Trên cửa sổ Properties, thiết lập thuộc tính của form như sau:
- Text = FITA Dictionary
- Name = frmDic
- Backcolor = InactiveCaption
- FormBorderStyle = FixedDialog
- Mở thanh Toolbox ở bên trái của cửa sổ Visual Studio, kéo control ListBox tới form, thiết lập thuộc tính Name = lstTerms
- Kéo thả Textbox nằm phía trên của list box, thiết lập thuộc tính Name = txtSearch
- Rồi kéo và thả RichTextbox tới bên phải của list box, thiết lập thuộc tính:
- Name = rtbResult
- Forecolor = MenuHighlight
- ReadOnly = True ( không cho phép người dùng chỉnh sửa text trong RichTextbox)
- Để thêm được menu vào form, bạn cần kéo và thử MenuStrip từ Toolbox
- Đánh &File vào chỗ ô Type Here và trong hộp tiếp theo trong ô Type Here là &Help
- Đánh &Close vào ô Type Here dưới menu File và đánh menu &About... trong ô Type Here dưới menu Help
- Tạo CSDL
- Code
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Text.RegularExpressions;
using System.Data.OleDb;
namespace FITADictionary
{
public partial class frmDic : Form
{
public frmDic()
{
InitializeComponent();
}
private void frmDic_Load(object sender, EventArgs e)
{
}
}
}
- Bạn cần thêm câu lệnh usingData.OleDb; ở ngay phần đầu để sử dụng các thư viện kết nối CSDL theo kiểu OLEDB.
private OleDbConnection cn;//tạo đối tượng kết nối
private OleDbDataReader reader;//tạo đối tượng reader
private OleDbCommand com;//tạo đối tượng command
private DataSet rs;//tạo đối tượng dataset
private OleDbDataAdapter ad;//tạo đối tượng data adapter
Đoạn code này sẽ khai báo một biến cn của lớp OleDbConnection, biến reader của lớp OleDbReader, biến com của lớp OleDbCommand, biến rs của lớp DataSet và biến ad của lớp OleDbDataAdapter. Các biến này sẽ được sử dụng để tạo các đối tượng của các kiểu lớp này.
- Tạo một phương thức MyConnect() như đoạn code dưới đây:
private void MyConnect()
{
try
{
//kết nối tới CSDL
rs = new DataSet();
//Provider=Microsoft.Jet.OLEDB.4.0;Data Source="\\vmware-host\Shared Folders\Documents\Visual Studio 2008\Projects\FITADictionary\FITADictionary\bin\Debug\FITADic.accdb"
cn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Application.StartupPath + "\\FITADic.accdb;");
cn.Open();
ad = new OleDbDataAdapter("SELECT * FROM tblAVDic ORDER BY EnTerm", cn);
ad.Fill(rs, "tblAVDic");
com = new OleDbCommand("SELECT EnTerm FROM tblAVDic ORDER BY EnTerm", cn);
reader = com.ExecuteReader();
//xóa trắng listbox
lstTerms.Items.Clear();
//xóa trắng ô hiện kết quả
rtbResult.Text = "";
//nạp dữ liệu lên listbox
while (reader.Read())
{
lstTerms.Items.Add(reader[0].ToString());
}
}
catch (Exception ex) { }
txtSearch.Focus();
}
Giải thích code: đoạn code này bắt đầu bởi việc tạo một đối tượng DataSet để lưu trữ các bảng dữ liệu từ CSDL và một đối tượng Connection để kết nối tới tệp CSDL.
//kết nối tới CSDL
rs = new DataSet();
cn = new OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + Application.StartupPath + "\\FITADic.accdb;");
cn.Open();
Đối tượng Adapter được tạo để nhận dữ liệu từ bảng tblAVDic và dữ liệu được điền tới đối tượng rs của DataSet bằng việc dùng phương thức Fill() của Adapter:
ad = new OleDbDataAdapter("SELECT * FROM tblAVDic ORDER BY EnTerm", cn);
ad.Fill(rs, "tblAVDic");
Đối tượng com của Command cũng được tạo để nhận dữ liệu từ bảng dữ liệu và đặt vào trong list box.
com = new OleDbCommand("SELECT EnTerm FROM tblAVDic ORDER BY EnTerm", cn);
reader = com.ExecuteReader();
//xóa trắng listbox
lstTerms.Items.Clear();
//xóa trắng ô hiện kết quả
rtbResult.Text = "";
//nạp dữ liệu lên listbox
while (reader.Read())
{
lstTerms.Items.Add(reader[0].ToString());
}
Hộp search textbox sẽ được focus (con trỏ sẽ nhấp nháy ở đây) để kích hoạt trong hộp này.
txtSearch.Focus();
Đặt phương thức MyConnect() trong sự kiện form_load, list box lstTerms sẽ được nạp các từ tiếng anh:
private void frmDic_Load(object sender, EventArgs e)
{
MyConnect();
}
Chú ý: chúng ta dùng khối try ... catch để bắt bất kỳ lỗi nào có thể xảy ra. Bây giờ bạn đã gắn được dữ liệu vào listbox lstTerms khi form load. Bước tiếp theo là viết code C# để tạo một chức năng làm việc search của textbox.
Để ô search của textbox làm việc được bạn cần thêm code sau trong sự kiện TextChanged của Textbox:
private void txtSearch_TextChanged(object sender, EventArgs e)
{
int i;
DataRow dr;
try
{
for (i = 0; i <= lstTerms.Items.Count - 1; i++)
{
if (txtSearch.Text.Trim().ToUpper() == lstTerms.Items[i].ToString().ToUpper().Substring(0, txtSearch.TextLength))
{
//Chọn các item được so khớp với hộp search
lstTerms.SelectedIndex = i;
//hiển thị nghĩa của từ tìm thấy
dr = rs.Tables[0].Rows[i];
rtbResult.Clear();
rtbResult.Text = lstTerms.SelectedItem.ToString() + "\n" + dr[1].ToString().Trim();
HighLight();
break;
}
}
}
catch (Exception ex) { }
}
Khi người dùng đánh một từ vào trong textbox txtSearch, từ này sẽ được so sánh với các từ trong listbox. Nếu các từ được so khớp thì từ trong listbox sẽ được chọn và nghĩa của từ đó sẽ được hiển thị ở RichTexbox rtbResult. Thủ tục HightLight() sẽ được gọi để thay đổi màu của từ tiếng anh trong RichTextbox rtbResult. Thủ tục này sẽ được thảo luận trong bước tiếp theo.
Nếu người sử dụng chọn một từ trong list thay việc đánh vào hộp search, bạn cần viết một code trong sự kiện SelectedIndexChanged của listbox:
private void lstTerms_SelectedIndexChanged(object sender, EventArgs e)
{
DataRow dr;
dr = rs.Tables[0].Rows[lstTerms.SelectedIndex];
rtbResult.Clear(); //xóa kết quả
rtbResult.Text = lstTerms.SelectedItem.ToString() + "\n" + dr[1].ToString().Trim();
HighLight();
}
Chú ý: Đối tượng dr của DataRow thường được sử dụng để nhận dữ liệu của một hàng được chọn của bảng. Thay đổi màu của các từ tiếng anh và các ký tự dịch tiếng việt trong RichTextbox, bạn cần phương thức HighLight() như ở dưới:
private void HighLight()
{
try
{
//Màu cho các từ tiếng anh
Regex rex = new Regex(lstTerms.SelectedItem.ToString());
MatchCollection mc = rex.Matches(rtbResult.Text);
int StarCursorPosition = rtbResult.SelectionStart;
foreach (Match m in mc)
{
int starIndex = m.Index;
int StopIndex = m.Length;
rtbResult.Select(starIndex, StopIndex);
rtbResult.SelectionColor = Color.Blue;
rtbResult.SelectionStart = StarCursorPosition;
}
//Màu cho phân loại từ tiếng anh
char[] c = rtbResult.Text.ToString().ToCharArray();
//màu đỏ cho các loại từ v.,a., and n.
int i;
for (i = 1; i <= rtbResult.Text.ToString().Length - 2; i++)
{
if ((c[i] == '.' && c[i - 1] == 'v') || (c[i] == '.' && c[i - 1] == 'a') || (c[i] == '.' && c[i - 1] == 'n'))
{
rtbResult.SelectionStart = i - 1;
rtbResult.SelectionLength = 2;
rtbResult.SelectionColor = Color.Red;
}
}
//màu đỏ cho adj., adv.
for (i = 3; i <= rtbResult.Text.ToString().Length - 1; i++)
{
if ((c[i] == '.' && c[i - 1] == 'j' && c[i - 2] == 'd') || (c[i] == '.' && c[i - 1] == 'g' && c[i - 2] == 'i') || (c[i] == '.' && c[i - 1] == 'v' && c[i - 2] == 'd'))
{
rtbResult.SelectionStart = i - 3;
rtbResult.SelectionLength = 4;
rtbResult.SelectionColor = Color.Red;
}
}
}
catch (Exception ex) { }
}
Sử dụng code ở trên, các text tiếng anh như v., a., n., adj., adv. sẽ có màu đỏ và các từ tiếng việt sẽ có màu đen. Giữ text ở trong RichTextox là kiểu màu MenuHighlight.
Làm cho form thân thiện hơn, tức khi các form thay đổi kích thước thì các item trong form sẽ thay đổi theo kích thước của form. Bạn thực hiện code dưới đây trong sự kiện Resize của form:
private void frmDic_Resize(object sender, EventArgs e)
{
if (this.WindowState == FormWindowState.Maximized)
{
lstTerms.Height = this.Height;
txtSearch.Height = this.Height;
rtbResult.Width = this.Width;
}
}
Chú ý: nếu bạn thử thay thay đổi kích thước của form và đoạn code ở trên sẽ không hoạt động, và bạn cần phải thêm dòng code khác trong sự kiện form_load:
private void frmDic_Load(object sender, EventArgs e)
{
MyConnect();
this.Resize += new EventHandler(frmDic_Resize); //thêm code ở đây
}
Khi form load, nhiều đối tượng như: cn, rs, ad, com, và reader, là cũng được tạo trong chương trình cho sử dụng và các đối tượng này sẽ chiếm không gian bộ nhớ máy tính. Khi form đóng, các đối tượng này nên được giải phóng từ bộ nhớ:
private void frmDic_FormClosed(object sender, FormClosedEventArgs e)
{
cn.Close();
cn = null;
com = null;
reader = null;
ad = null;
rs = null;
}
Bạn cũng cần thêm dòng code:
this.FormClosed += new FormClosedEventHandler(frmDic_FormClosed);
tới sự kiện form load.
private void frmDic_Load(object sender, EventArgs e)
{
MyConnect();
this.Resize += new EventHandler(frmDic_Resize); //thêm code ở đây
this.FormClosed += new FormClosedEventHandler(frmDic_FormClosed);
}
Khi đóng chương trình, người sử dụng kích trên menu con Close của menu File. Công việc này có thể làm đơn giản bằng cách gắn code trong sự kiện Click của menu Close:
private void mnuFileClose_Click(object sender, EventArgs e)
{
Close();
}
Bây giờ các bạn chạy chương trình của bạn và thưởng thức thành quả của mình.
- Tải mã nguồn tại đây
- Những cải tiến
- Tham khảo các từ điển Lạc Việt, Oxford để cải tiến chức năng ứng dụng của mình
- Thêm các chức năng cho người sử dụng chỉnh sửa, thêm mới các từ mới vào từ điển
- Có thể cấu hình nhiều loại từ điển
- Có thể sử dụng lại nguồn từ điển đã có sẵn ví dụ http://www.gutenberg.org/ebooks/29765
- Một từ tiếng anh có thể có nhiều từ loại khác nhau ví dụ như danh từ, động từ, tính từ, v.v. và có thể thêm các chức năng từ đồng nghĩa, từ trái nghĩa ...
- Tích hợp chức năng phát âm sử dụng công cụ Microsoft Speech To Text, bạn có thể tham khảo: http://www.codeproject.com/Articles/380027/Csharp-Speech-to-Text, http://www.codeproject.com/Articles/483347/Speech-recognition-speech-to-text-text-to-speech-a, https://msdn.microsoft.com/en-us/library/hh378426%28v=office.14%29.aspx
