SỐ 101
HỒ LÔ BIẾN

Giải pháp tạo và xử lý menu nội dung động trong chương trình e-CHÍP Từ điển
TRẦN ANH VŨ

I. Vấn đề:

Trong lập trình, nhiều khi lập trình viên gặp phải tình huống phải tạo menu (thực đơn) có các mục con (Menu Item) không cố định, thậm chí không thể biết trước được nội dung cũng như những tình huống cần xử lý đối với nội dung đó.

Lấy ví dụ, trong chương trình “e-CHÍP Từ điển”, bạn có nhu cầu tạo menu ngữ cảnh cho phép người dùng tra chéo từ trong các từ điển khác khi nhấp phải chuột vào từ đã chọn. Mới nghe qua tưởng thật đơn giản, nhưng vì đặc điểm cho phép người dùng tạo thêm, xóa từ điển nên số lượng và tên từ điển trong chương trình là các giá trị không thể biết trước, mà đã không biết trước thì lập trình viên không thể đưa vào mã nguồn khi lập trình được.

Vậy làm cách nào tạo được menu mà các mục con thay đổi theo những gì chương trình trên máy người dùng có, và quan trọng là làm cách nào để xử lý tình huống khi người dùng chọn một mục trong menu động ấy?

II. Cấu trúc dữ liệu:

1. Danh sách từ điển: danh sách này được lưu trong cột Ten_Tu_Dien của bảng tblThongTinTuDien, thuộc tập tin CSDL thongtin.mdb. Ta sẽ đưa mỗi hàng của cột Ten_Tu_Dien (tương ứng với tên của từ điển) thành các mục con của menu ngữ cảnh tra chéo.

Bảng tblThongTinTuDien:

STT

Ten_Tu_Dien

Ten_Tap_Tin_Tu_Dien

1

Từ điển Nhật – Việt

echipnhatviet.mdb

2

Từ điển Tin học

echiptinhoc.mdb

3

Từ điển Thuật ngữ tin học

echipthuatngutinhoc.mdb

2. Xử lý tình huống: khi người dùng nhấp chuột vào một mục trong menu ngữ cảnh tra chéo, chương trình phải xác định được người dùng đã nhấp chọn mục nào và đưa ra phương thức xử lý cho sự kiện đó, một sự kiện mà chỉ phát sinh trong lúc thực thi chương trình.

III. Giải pháp:

Minh họa bằng ngôn ngữ Visual Basic .NET và môi trường lập trình Visual Studio .NET 2003.

1. Tạo menu ngữ cảnh:

Trong trang Design, bạn chỉ cần tạo ra một ContextMenu (Name: menuTraCheo), rồi nhấp kép vào biểu tượng menuTraCheo trong vùng các điều khiển không hiển thị để chuyển sang trang Code. Tại đây, bạn sẽ đứng trong thủ tục xử lý sự kiện khi menu hiện ra (Popup):

Private Sub menuTraCheo_Popup(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menuTraCheo.Popup

Bây giờ, bạn chỉ việc truy vấn bảng tblThongTinTuDien của CSDL thongtin.mdb để lấy ra danh sách tên từ điển, rồi đưa vào chứa trong dataset nào đó. Tiếp đến, dùng lệnh lặp for đưa (Add) từng hàng vào menuTraCheo. Ví dụ đoạn mã của chương trình “e-CHÍP Từ điển”:

Private Sub menuTraCheo_Popup(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles menuTraCheo.Popup
Const strConnection As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data _ Source=.\data\thongtin.mdb"
Dim datasetDanhSachTuDien As New DataSet
Dim objConnection As New OleDb.OleDbConnection(strConnection)
objConnection.Open()

Const strLayDanhSachTuDien As String = "SELECT Ten_Tu_Dien FROM tblThongTinTuDien _ ORDER BY Ten_Tu_Dien"

Dim objDataAdapter As New OleDb.OleDbDataAdapter(strLayDanhSachTuDien, strConnection)
datasetDanhSachTuDien.Clear()
objDataAdapter.Fill(datasetDanhSachTuDien, "tbleChipDanhSachTuDien")
menuTraCheo.MenuItems.Clear()
Dim intSoTuDien As Integer = _ datasetDanhSachTuDien.Tables("tbleChipDanhSachTuDien").Rows.Count

For i As Integer = 1 To intSoTuDien
menuTraCheo.MenuItems.Add(datasetDanhSachTuDien.Tables("tbleChipDanhSachTuDien").Rows(i - 1)(0), New System.EventHandler(AddressOf Me.menuTraCheo_OnClick))
Next

objConnection.Close()
End Sub

2. Xử lý tình huống nhấp chọn mục con:

Bạn để ý trong đoạn mã trên, tại câu lệnh Add để thêm vào từng đề mục con cho menuTraCheo, tôi có sử dụng thêm New System.EventHandler(AddressOf Me.menuTraCheo_OnClick) nhằm mục đích báo cho trình biên dịch biết là “Hãy xử lý tình huống nhấp chọn mục con xyz bằng thủ tục menuTraCheo_OnClick”. Hiệu quả của việc làm này là cho dù trong menuTraCheo có những gì đi chăng nữa, khi người dùng nhấp chọn một mục bất kỳ thì tình huống menuTraCheo_OnClick cũng đều được gọi.

Bây giờ, bạn tạo thủ tục xử lý tình huống nhấp chọn mục con menuTraCheo_OnClick được rồi đấy. Nhiệm vụ của bạn là phải bắt lấy tên của mục con được nhấp, sau đó dựa vào tên này rồi truy vấn trong bảng tblThongTinTuDien để lấy ra tên tập tin từ điển tương ứng. Đoạn mã ví dụ của chương trình “e-CHÍP Từ điển”:

Protected Sub menuTraCheo_OnClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
'Lấy tên từ điển tra chéo
Dim strTenTuDienTraCheo As String = sender.Text

'Lấy từ muốn tra chéo
Dim strTuMuonTraCheo As String
strTuMuonTraCheo = Trim(richNghiaTuDangTra.SelectedText)

If strTuMuonTraCheo.Length > 0 Then
'Chuẩn bị khung thoại Tra chéo
Dim formTraCheo As Form = New frmNghiaTuTraCheo
formTraCheo.Text = strTenTuDienTraCheo & "@" & strTuMuonTraCheo

formTraCheo.Location = Me.MousePosition
formTraCheo.StartPosition = FormStartPosition.Manual
formTraCheo.Show()
Else
MessageBox.Show("Trước tiên, Bạn phải chọn từ muốn tra chéo.", "Phát hiện ra lỗi!!!", MessageBoxButtons.OK, MessageBoxIcon.Error)
End If
End Sub

IV. Kết luận:

Trong hai đoạn mã minh họa, thật ra còn một số điều khá hay nhưng tôi chưa thể trình bày được vì nó không thuộc phạm vi bài viết này, với lại chúng còn liên quan đến nhiều phần trong cả chương trình “e-CHÍP từ điển”. Nhưng dù sao, như bạn thấy thì với giải pháp đã được trình bày, vấn đề về tạo menu động, thay đổi và không thể xác định trước lúc lập trình đã được giải quyết. Hi vọng bài viết sẽ giúp ích chút gì đó cho các bạn lập trình viên.

Bạn có thể tải mã nguồn của chương trình “e-CHÍP Từ điển 2.1” về để tìm hiểu thêm cách thức và giải pháp cho các vấn đề về quản lý từ điển tại www.echip.com.vn.

TIẾN TRÌNH DỰ ÁN E-CHÍP TỪ ĐIỂN

Trong tuần đầu tiên, diễn tiến của “Dự án e-CHÍP Từ điển” như sau:

- Hoàn thành bộ Từ điển thuật ngữ tin học với 1.381 từ, tham khảo tài liệu của Microsoft Việt Nam, giúp ích trong việc dịch thuật tài liệu Tin học.

- Kết thúc nhập liệu 2.000 từ đầu tiên của Từ điển Nhật – Việt.

- Công ty Vietsovpetro (105 Vũng Tàu) đảm nhiệm việc nhập liệu cho Từ điển Nga – Việt (Từ điển tổng hợp và Từ điển Kỹ thuật) và Từ điển Việt – Nga.

- Phiên bản “e-CHÍP Từ điển 2.1” mới, bổ sung thêm tính năng tra chéo giữa các từ điển có trong chương trình.

Xem chi tiết thông tin vể dự án tại địa chỉ http://www.echip.com.vn/echiproot/html/tudienechip/giaiphap.html.

[Đầu trang]
Trang chủ
Nội lực "Peter Pan"
Cầu nối Intel Việt Nam
Chuyện trong tuần
Cõi người ta
Bình luận thị trường
Cõi Mô-bai
Chuyên đề
Bổ ngửa
Túi càn khôn IT
Hồ lô biến
Cảm về Game
Nhật ký e-CHÍP
Bản quyền Công ty Phần mềm & Truyền thông VASC
 99 Triệu Việt Vương HN; Tel: (04) 9782235 • email: echip@vasc.com.vn
Mọi chi tiết về kinh doanh và quảng cáo xin liên hệ Phòng Quảng cáo. Tel: (04) 9782077 kd@vasc.com.vn