Thừa kế Textbox để đánh chữ Việt Unicode
Lập trình dùng thừa kế
Hết rồi giai đoạn bực mình với VB6 thì sự giới hạn về lập trình theo hướng
đối tượng (Object Oriented), .NET cho phép ta tha hồ thừa kế. Do đó, một
trong những dự án nho nhỏ đầu tiên của chúng ta là thừa kế từ Textbox
bình thường để tạo một Textbox, tạm gọi là vnTextbox, hỗ trợ đánh chữ
Việt Unicode theo lối VNI hay VIQR. Dĩ nhiên, ta vẫn tiếp tục giữ các
programs bỏ dấu chuyên nghiệp ưng ý của mình như VietKey, UniKey,
VPSKey, .v.v.., nhưng có thể sau nầy sẽ có trường hợp ta cung cấp cho
khách hàng một chương trình áp dụng tiếng Việt để họ dùng cho nhu cầu
chuyên môn mà không cần phải dùng thêm một program bỏ dấu hỗ trợ.Để
tạo một Control thừa kế từ Textbox bạn khởi động một Project mới loại
Windows Control Library như sau:
Kế đó, khi mở code ra thay thế hai hàng:
Public Class UserControl1
Inherits System.Windows.Forms.UserControl
bằng hai hàng sau:
Public Class vnTextbox
Inherits System.Windows.Forms.TextBox
Đánh dấu theo lối VNI
Ðể đánh dấu cho các nguyên âm chữ Việt, trong vnTextbox ta tạm dùng
phương pháp VNI. Tức là ta đánh nguyên âm trước, kế đó ta đánh một
con số từ 1 đến 9 để bỏ dấu.Các con số 1..6 theo sau chữ a chẳng hạn, sẽ
cho ta các chữ á à ả ã ạ â; số 7 theo sau chữ u sẽ cho ta ư; số 8 theo
sau chữ a sẽ cho ta ă; số 9 theo sau chữ d sẽ cho ta đ. Để bỏ hai dấu thì
ta dùng hai con số, thí dụ a36 thì sẽ đuợc hiển thị thành ẩ, còn u27 thì sẽ
cho ừ. Ðể đánh các chữ đ và Ð ta dùng d9 và D9. Chắc chắn bạn sẽ thấy
program nầy đơn sơ quá, nhưng nó sẽ dễ hiểu, và sau đó, nếu thích bạn
có thể thêm thắt các chức năng.Để bỏ dấu theo lối VIQR thì thay vì các
ChList(16) = "âấầẩẫậẩ-ẳ"
ChList(17) = "âấầẩẫậẫ-ẵ"
ChList(18) = "âấầẩẫậậ-ặ"
ChList(19) = "eéèẻẽẹê"
ChList(20) = "e^èẻẽẹế"
ChList(21) = "eé^ẻẽẹề"
ChList(22) = "eéè^ẽẹể"
ChList(23) = "eéèẻ^ẹễ"
ChList(24) = "eéèẻẽ^ệ"
ChList(25) = "eếềểễệ^"
ChList(26) = "êếềểễệế"
ChList(27) = "êếềểễệề"
ChList(28) = "êếềểễệể"
ChList(29) = "êếềểễệễ"
ChList(30) = "êếềểễệệ"
. . .
ChList(0) chứa toàn bộ các nguyên âm. Tương ứng với mỗi nguyên âm
(LastCh) trong ChList(0) là một hàng chứa tất cả mọi chữ có thể đuợc
dùng để thay thế LastCh khi user đánh vào một con số 1..9 hay
Backspace.Thí dụ nếu LastCh là à, ta sẽ dùng ChList(3), nó chứa các chữ:
aá^ảãạầ-ằKế đó nếu user đánh số 3 ta sẽ thay thế dấu sắc thành dấu hỏi
để có chữ ả. Còn nếu thay vì đánh số 3, user đánh số 8, thì ta sẽ có chữ ằ,
tức là thêm dấu ă cho chữ à.Nếu user đánh thêm một số 7 thì character
tướng ứng với số 7 trong hàng aá^ảãạầ-ằ là -, hể gặp character - thì ta
làm ngơ.Nếu user đánh thêm một số 2 sau chữ à bạn sẽ thấy character
tướng ứng với số 2 trong hàng aá^ảãạầ-ằ là ^. Điều nầy nhắc ta biết là
user đánh a22, nên ta sẽ hiển thị a2. Nếu user đánh Backspace, thay vì
một con số, ta sẽ dùng nguyên âm nằm ở đầu dòng, tức là chữ a. Như thế
nếu LastCh là ẩ, thì sau một Backspace ta có ả, sau thêm một Backspace
kế tiếp ta sẽ còn lại a.Kỹ thuật Program dùng để thay thế LastCh là select
Case 96
GetToneCharPos = 2 ' `
Case 126
GetToneCharPos = 4 ' ~
Case 63
GetToneCharPos = 3 ' ?
Case 46
GetToneCharPos = 5 ' .
Case 94
GetToneCharPos = 6 ' ^
Case 43, 42 ' + or *
GetToneCharPos = 7
Case 40
GetToneCharPos = 8 ' (
Case 100, 68, 45 ' d D or -
GetToneCharPos = 9
End Select
End If
End Function
Trong Control vnTextbox ta không thể để code hỗ trợ đánh dấu chữ Việt
trong Sub vnTextbox_KeyDown hay Sub vnTextbox_KeyUp được vì
một khi KeyDown hay KeyDown Events đã được raised rồi ta không thể bỏ
qua Keystroke hay thay đổi trị giá của nó thành 0 như trong VB6. Do đó, ở
đây ta Override Function ProcessKeyMessage. Nếu giá trị trả về
(Returned value) của hàm ProcessKeyMessage là True thì ta ngăn cản
không cho Keyboard Event xẩy ra. Loại Event có thể xẩy ra sau đó tùy
thuộc vào trị số của m.Msg. Trong hàm ProcessKeyMessage, ta chỉ xử lý
thông điệp m.Msg = KeyUp (có giá trị 258). Nếu m.Msg là cho KeyDown
hay KeyPress thì ta làm ngơ và cho ProcessKeyMessage return False để
KeyDown hay KeyPress events xẩy ra như bình thường.