CHƯƠNG III: XÂY DỰNG HỆ THỐNG
3.3. Xây dựng hệ thống
3.3.1. Các chương trình con và thủ tục được sử dụng trong phần mềm
Thủ tục khởi tạo kết nối với cơ sở dữ liệu:
OleDbConnection Cnn = new OleDbConnection();
public void KetNoi() {
try {
if (Cnn.State == ConnectionState.Closed || Cnn.State ==
ConnectionState.Broken) {
Cnn.ConnectionString =
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Application.StartupPath + @"\..\..\tailieu.mdb";
Cnn.Open();
}
} catch {
MessageBox.Show("Kết nối không thành công ");
} }
Lệnh OleDbConnection Cnn = new OleDbConnection(); tạo biến mới biến Cnn có chức năng tạo mới liên kết với cơ sở dữ liệu. Biến Cnn đƣợc sử dụng ở các lệnh kết nối dữ liệu.
Thủ tục Ketnoi() sử dụng biến Cnn để kết nối với cơ sở dữ liệu tailieu.mdb thông qua kiểu kết nối Microsoft.Jet.OLEDB.4.0.
Thủ tục lấy bộ bản ghi dữ liệu thuộc cơ sở dữ liệu.
public DataSet GetDataSet(string TenBang) {
DataSet ds = new DataSet();
string strSQL = "Select * From " + TenBang;
da = new OleDbDataAdapter(strSQL, Cnn);
CmdBD = new OleDbCommandBuilder(da);
da.Fill(ds, TenBang);
return ds;
}
Thủ tục GetDataSet(string TenBang) có một đối số là tên bảng, biến nội bộ là ds kiểu dữ liệu bộ bản ghi. Sau khi thực hiện, thủ tục sẻ trả giá trị về cho biến ds để sữ dụng cho các lệnh khác.
Thủ tục này có thể thay đổi bằng cách thêm các biến hoặc thêm điều kiện thực hiện câu lênh SQL để nhận kết quả phù hợp với yêu cầu.
Sau khi thực hiện thủ tục này, ta có thể cập nhật dữ liệu cho bảng trong cơ sở dữ liệu hoặc bảng tạm thời làm nguồn cho các Datagrid thông qua lệnh da.Update(tên bảng);
Các lệnh thực hiện cập nhật dữ liệu nhập ở các textbox vào cơ sở dữ liệu:
DataRow DongMoi;
DongMoi = tblTl.NewRow();
DongMoi["MaTl"] = txtMaTl.Text;
DongMoi["TenTl"] = txtTenTl.Text;
DongMoi["MotaTl"] = txtMotaTl.Text;
DongMoi["MaloaiTl"] = cboloaiTl.SelectedValue.ToString();
tblTl.Rows.Add(DongMoi);
daTl.Update(tblTl);
dsTl = dl.GetDataSet(ref daTl, ref cmdBD_Tl, "TAILIEU");
tblTl = dsTl.Tables["TAILIEU"];
dgridTailieu1.DataSource = tblTl;
dgridTailieu1.Refresh();
Đoạn lệnh này thực hiện tạo biến dongmoi có kiểu dòng dữ liệu (hay bản ghi dữ liệu) có các thuộc tính tương ứng với bảng tblTl. Các lệnh gán nhập giá trị cho các thuộc tính trong bản ghi. Lệnh tblTl.Rows.Add(DongMoi); thực hiện thêm bản ghi mới cho bảng tblTl.
Lệnh tạo mới thư mục, tạo mới file tài liệu, mở file tài liệu:
- Lệnh Directory.CreateDirectory(Đường dẫn); thực hiện tạo mới thƣ mục.
- Các lệnh sau thực hiện mở cửa sổ chọn file có sẳn và copy file đó vào file trong thƣ mục chỉ định.
OpenFileDialog open1 = new OpenFileDialog();
open1.Filter = "Doc files|*.doc";
var ress = open1.ShowDialog();
if (ress == System.Windows.Forms.DialogResult.OK) {
File.Copy(open1.FileName, Đường dẫn file trong thư mục chỉ định);
MessageBox.Show("Đã thêm được tài liệu mới! :)");
}
else return;
- Lệnh sau thực hiện mở file tài liệu đã có để xem:
System.Diagnostics.Process.Start(Đường dẫn đến file muốn mở);
Hàm tạo mới bản văn phục vụ các công cụ rèn luyện kỹ năng:
public const int NGUON_AZ09 = 0;
public const int NGUON_AZ = 1;
public const int NGUON_CHON = 2;
public const int NGUON_FILE = 3;
public bool ngauNhien = true;
public int chonNguon = NGUON_AZ;
private string banvan = "";
private string nguon = "";
private string nAZ = "abcdefghijklmnopqrstuvwxyz";
private string n09 = "0987654321";
private string filenguon = "nguon.txt";
public string taoBanVan() {
try {
// Tạo nguồn switch (chonNguon) {
case NGUON_AZ09:
nguon = nAZ + n09;
break;
case NGUON_AZ:
nguon = nAZ;
break;
}
// Tạo bản văn
if (chonNguon != NGUON_FILE) {
System.Random rnd = new System.Random();
banvan = "";
int soTu = 10 + rnd.Next(10);
int nLen = nguon.Length;
for (int i = 0; i < soTu; i++) {
int soChu = 3 + rnd.Next(3);
for (int j = 0; j < soChu; j++) {
char Chu = nguon[rnd.Next(nLen)];
banvan += Chu;
}
banvan += " ";
} }
else // tao ban van tu file nguon {
StreamReader sr = new StreamReader(filenguon);
StringCollection sc = new StringCollection();
string line = "";
while ((line = sr.ReadLine()) != null) sc.Add(line);
Random rnd = new Random();
banvan = sc[rnd.Next(sc.Count)];
sr.Close();
} }
catch (Exception ex) {
banvan = "khong tao duoc ban van ngau nhien that xin loi";
}
return banvan;
}
public void setNguon(string s)
{
nguon = s;
} }
Trong hàm này ta có bốn phần chính:
- Khởi tạo các biến và giá trị cho các biến để làm nguồn cho việc tạo bản văn.
- Tạo nguồn: lựa chọn kiểu nguồn và chọn phần tử của nguồn.
- Tạo bản văn ngẫu nhiên: khởi tạo biến số lƣợng từ và số lƣợng kí tự trong từ bằng hàm ramdom(). Tạo bản văn bằng cách lấy ngẫu nhiên kí tự trong biến nguồn và ghép vào xâu banvan.
- Lấy nguồn từ file nguồn: khởi tạo biến sr để đọc dòng kí tự từ file nguồn.
Bản văn sau khi tạo đƣợc sẻ trả về cho hàm.
Thủ tục tạo mã morse của bản văn và tạo file âm thanh tương ứng với bản văn:
public string path = "";
private string teS = "te.mp3";
private string ticS = "tic.mp3";
private string banvanS = "banvan.mp3";
private string batdauS = "batdau.mp3";
private string ketthucS = "ketthuc.mp3";
private string ngungS = "ngung.mp3";
private Mp3Player player = new Mp3Player();
/// <summary>
/// Chuyển bản văn bình thường sang morse lưu vào file banvanS /// </summary>
/// <param name="s"></param>
public void createMorse(string s) {
morse(s2m(s.ToLower()));
}
/// <summary>
/// Hàm chuyển từ văn bản morse sang âm thanh lưu vào file banvan.mp3 /// </summary>
/// <param name="mo">Chuỗi morse</param>
/// <example>-.-. ..-/ -- ---</example>
public void morse(string mo) {
try {
player.Close();
Mp3Reader wr1 = new Mp3Reader(File.OpenRead(path + "\\" + teS));
IntPtr format = wr1.ReadFormat();
byte[] te = wr1.ReadData();
wr1.Close();
Mp3Reader wr2 = new Mp3Reader(File.OpenRead(path + "\\" + ticS));
byte[] tic = wr2.ReadData();
wr2.Close();
Mp3Reader wr3 = new Mp3Reader(File.OpenRead(path + "\\" + ngungS));
byte[] ngung = wr3.ReadData();
wr3.Close();
Mp3Reader wr4 = new Mp3Reader(File.OpenRead(path + "\\" + batdauS));
byte[] batdau = wr4.ReadData();
wr4.Close();
Mp3Reader wr5 = new Mp3Reader(File.OpenRead(path + "\\" + ketthucS));
byte[] ketthuc = wr5.ReadData();
wr5.Close();
Mp3Writer ww = new Mp3Writer(File.Create(banvanS));
ww.WriteData(batdau);
for (int i = 0; i < mo.Length; i++) {
if (mo[i] == '-') ww.WriteData(te);
if (mo[i] == '.') ww.WriteData(tic);
if (mo[i] == ' ') ww.WriteData(ngung);
if (mo[i] == '/') ww.WriteData(ngung);
}
ww.WriteData(ngung);
ww.WriteData(ngung);
ww.WriteData(ketthuc);
ww.Close();
}
catch (Exception ex) {
MessageBox.Show("Có lỗi khi truy xuất thư viện cấp độ.", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
} }
/// <summary>
/// Hàm chuyển chuỗi văn bản s sang bản văn morse /// </summary>
/// <param name="s">Chuỗi cần chuyển</param>
/// <returns>Bản văn mã hóa sang morse</returns>
public string s2m(string s) {
string m = "";
for (int i = 0; i < s.Length; i++) {
if (s[i] != ' ') m += (c2m(s[i]) + " ");
else m += "/ ";
}
return m;
}
/// <summary>
/// Hàm chuyển 1 kí tự sang morse /// </summary>
/// <param name="c">Kí tự cần chuyển</param>
/// <returns>Mã morse của kí tự c</returns>
public string c2m(char c) {
string m = "";
switch (c) {
case 'a': m = ".-"; break;
case 'b': m = "-..."; break;
case 'c': m = "-.-."; break;
case 'd': m = "-.."; break;
case 'e': m = "."; break;
case 'f': m = "..-."; break;
case 'g': m = "--."; break;
case 'h': m = "...."; break;
case 'i': m = ".."; break;
case 'j': m = ".---"; break;
case 'k': m = "-.-"; break;
case 'l': m = ".-.."; break;
case 'm': m = "--"; break;
case 'n': m = "-."; break;
case 'o': m = "---"; break;
case 'p': m = ".--."; break;
case 'q': m = "--.-"; break;
case 'r': m = ".-."; break;
case 's': m = "..."; break;
case 't': m = "-"; break;
case 'u': m = "..-"; break;
case 'v': m = "...-"; break;
case 'w': m = ".--"; break;
case 'x': m = "-..-"; break;
case 'y': m = "-.--"; break;
case 'z': m = "--.."; break;
case '0': m = "---"; break;
case '1': m = ".----"; break;
case '2': m = "..---"; break;
case '3': m = "...--"; break;
case '4': m = "....-"; break;
case '5': m = "..."; break;
case '6': m = "-...."; break;
case '7': m = "--..."; break;
case '8': m = "---.."; break;
case '9': m = "----."; break;
}
return m;
}
public void play() {
try {
player.Close();
player.Open(banvanS);
player.Play(false);
}
catch (Exception ex) {
MessageBox.Show("Có lỗi khi đọc âm thanh.", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
} }
public void stop() {
player.Close();
}
Thủ tục này gồm các phần chính sau:
- Khởi tạo các biến chuổi lưu tên các file âm thanh trong thư mục nguồn.
- Hàm chuyển mã từ kí tự sang mã morse tương ứng của kí tự đó. Hàm này sử dụng lệnh switch để lựa chọn kí tự và mã morse tương ứng, sau đó trả mã
morse về cho biến m để làm cơ sở cho hàm chuyển toàn bộ bản văn sang mã morse.
- Hàm tạo mã morse của bản văn sử dụng xâu m là mã morse của kí tự. Hàm này duyệt từ đầu đến cuối bản văn và lần lƣợt thêm mã morse vào xâu m.
- Hàm chuyển từ chuổi mã morse sang file âm thanh sử dụng các lệnh trong thƣ viện Alvas để ghép các file âm thanh có sẳn vào file banvan.mp3. Lệnh
File.OpenRead(đường dẫn file âm thanh) dùng để đọc file âm thanh ở đường dẫn. Lệnh WriteData() ghép file âm thanh vào file âm thanh hiện tại để tạo ra file âm thanh banvan.mp3.
Thủ tục play và stop thực hiện phát và dừng file âm thanh:
public void play() {
try {
player.Close();
player.Open(banvanS);
player.Play(false);
}
catch (Exception ex) {
MessageBox.Show("Có lỗi khi đọc âm thanh.", "Lỗi", MessageBoxButtons.OK, MessageBoxIcon.Error);
} }
public void stop() {
player.Close();
}
Các thủ tục để lấy hình ảnh tương ứng với kí tự và phát hình ảnh đó lên khung nhìn:
_viewimg = new viewimg[28];
int y = 0, x = 0;
for (int i = 0; i < 28; i++) {
char d = (char)(65 + i);
_viewimg[i] = new viewimg();
_viewimg[i].word = d;
_viewimg[i].i = x;
_viewimg[i].j = y;
x++;
if (x == 8) {
x = 0;
y++;
} }
Khối lệnh trên thực hiện việc tạo danh sách tọa độ của các kí tự lên hình ảnh ABC.gif chứa toàn bộ hình ảnh của các hình ảnh đại diện cho kí tự trong mã Semaphore. Vì hình ảnh nguồn gồm 8 cột và 4 dòng nên khi biến i bằng 8 thì thực hiện xuống dòng mới để tạo danh sách tọa độ.
Sau khi thực hiện vòng lặp For, mảng _viewing[] sẻ chứa danh sách các kí tự và tọa độ của kí tự đó trên hình ảnh nguồn.
Khối lệnh sau thực hiện lấy hình ảnh tương ứng với kí tự:
void layhinhanh(char kytu) {
bool flash = false;
kytu = char.Parse(kytu.ToString().ToUpper());
for (int i = 0; i < _viewimg.Length; i++) {
if (_viewimg[i].word == kytu) {
Rectangle rec = new Rectangle(284 * _viewimg[i].i, 324 * _viewimg[i].j, 284, 324);
pcimage.Image = cropImage(rec);
flash = true;
} }
if (!flash) {
Rectangle reca = new Rectangle(284 * _viewimg[26].i, 324 * _viewimg[26].j, 284, 324);
pcimage.Image = cropImage(reca);
} }
Thủ tục này thực hiện việc nhận kí tự từ đối số, sau đó duyệt qua toàn bộ tọa độ hình ảnh được tạo trước đó, nếu tọa độ nào có kí tự tương ứng với kí tự từ đối số thì thực hiện tạo biến rec
Rectangle rec = new Rectangle(284 * _viewimg[i].i, 324 * _viewimg[i].j, 284, 324);
để lấy khung hình phục vụ cho việc chọn hình ảnh tương ứng với tọa độ từ hình ảnh nguồn, sau đó thực hiện việc lấy hình ảnh và đƣa lên khung hình trên giao diện chương trình thông qua lệnh
pcimage.Image = cropImage(rec);
việc lấy khung hình được thực hiện qua lệnh sau:
private Image cropImage(Rectangle cropArea) {
Image imgsrc = Image.FromFile("ABC.gif");
Bitmap bmpImage = new Bitmap(imgsrc);
Bitmap bmpCrop = bmpImage.Clone(cropArea, bmpImage.PixelFormat);
return (Image)(bmpCrop);
}
Để thực hiện việc đƣa hình ảnh lên khung hình liên tục theo thứ tự các kí tự trong bản văn, ta sử dụng đối tƣợng Timer. Đối tƣợng này cho phép ta khởi tạo các hành động trong một lƣợt thực hiện, hành động ở đây chính là việc lấy hình ảnh và in lên khung hình. Sau đó sử dụng thủ tục Timer_tick để lặp việc thực hiện các hành động theo một thời gian trể được định sẳn. Thời gian trể của đối tượng timer được lưu trong thuộc tính timer.Interval. Giá trị của thuộc tính này đƣợc chọn khi ta chọn cấp độ phát bản văn. Khối lệnh sử dụng đối tƣợng Timer nhƣ sau:
tim = new Timer();
tim.Tick += new EventHandler(tim_Tick);
void tim_Tick(object sender, EventArgs e) {
if (dodaichuoi == dodaichuoihientai) {
layhinhanh(' ');
tim.Stop();
button2.Enabled = true;
return;
} {
layhinhanh(str[dodaichuoihientai]);
dodaichuoihientai++;
} }