Hiển thị mã Unicode trong Access 2000
Trước khi giải quyết vấn đề chúng ta cần làm rõ một
số điểm. Thường Office 2000 dùng ngôn ngữ VBA
version 6.0 để viết code. Trên Win9x hay WinMe, có
hai trở ngại khi dùng Unicode trong lập trình hiển thị
chuỗi Unicode lên các phần tử giao diện, đó là:
1. Môi trường soạn thảo code VBA không cho phép
bạn nhập đúng các chuỗi Unicode.
2. Các đối tượng giao diện chuẩn của VBA, version
6.0 không hiển thị được chuỗi Unicode.
Để khắc phục 2 trở ngại trên, bạn nên:
-Nhập chuỗi Unicode trong cửa sổ thiết kế giao diện
và cửa sổ soạn code theo định dạng UTF-8 vì định
dạng này tương thích với mã ASCII truyền thống. Dĩ
nhiên, trước
khi sử dụng thật chuỗi UTF-8, bạn cần chuyển nó về
định dạng USC-2 thông qua việc gọi hàm API
Windows có tên là MultibyteToWideChar().
-Thay vì dùng các đối tượng giao diện có sẵn của môi
trường thiết kế VBA, bạn phải dùng các đối tượng
Form2 tương ứng. "Microsoft Form 2.0 Object
Library" là một thư viện các đối tượng giao diện mà
Microsoft mới viết sau này để hỗ trợ đúng mã
Unicode.
Chúng tôi có viết một form đơn giản, có 1 textbox để
nhập giá trị số, 1 textbox để hiển thị chuỗi chữ tương
ứng (ở dạng đơn giản nhất, cốt yếu để minh họa việc
xử lý chuỗi Unicode), 1 button cho phép chuyển số
thành chuỗi. Các đối tượng được dùng đều có trong
thư viện "Form 2.0". Qui trình xây dựng ứng dụng
này gồm các bước cụ thể sau:
1. Vì phát biểu Declare của VB không khai báo đúng
các hàm API có tham số là chuỗi Unicode nên trước
tiên bạn phải xây dựng một thư viện kiểu (type
library) chứa hàm MultiByteToWideChar() để dùng
trong ứng dụng. Hãy dùng một trình soạn thảo văn
bản soạn nội dung đặc tả thư viện TypeLib chứa hàm
MultiByteToWideChar() bằng ngôn ngữ ODL như
sau (cất nội dung lên file uniutil.odl):
[
uuid(13C9AF40-856A-101B-B9C2-
04021C007002),
helpstring("WIDE Windows API Type Library")
]
library WideWin32API
{
[
helpstring("KERNEL API Calls"),
dllname("KERNEL32")
]
module KernelAPI
{
[
helpstring("Convert a UTF8 string to a UCS-2
string."),
entry("MultiByteToWideChar")
]
long _stdcall MultiByteToWideChar
(
[in] long CodePage,
[in] long dwFlags,
[in] BSTR lpMultiByteStr,
[in] long cchMultiByte,
[in] BSTR lpWideCharStr,
[in] long cchWideChar
);
};
};
2. Dịch file ODL trên thành file thư viện kiểu
uniutil.tlb bằng tiện ích mktyplib.exe. Để có tiện ích
này, bạn có thể cài bộ Visual Studio 6.0, nếu cài ở
chế độ Typical, bộ VS sẽ được cài vào thư mục
"c:\Program Files\Microsoft Visual Studio". Nếu vậy,
để dịch file uniutil.odl ở trên, bạn hãy tạo một cửa sổ
DOS Prompt, dùng lệnh cd để chuyển về thư mục
chứa file uniutil.odl, rồi nhập tuần tự 2 lệnh sau để
dịch nó:
c:\progra~1\micros~3\vc98\bin\vcvars32.bat
mktyplib /I c:\progra~1\micros~3\vc98\include
/win32 /tlb uniutil.tlb uniutil.odl
Giả sử tên ngắn của thư mục "Program Files" là
progra~1, của thư mục "Microsoft Visual Studio" là
micros~3.
3. Chạy VB, tạo 1 project "Standard Exe" để quản lý
ứng dụng.
4. Ấn chuột phải vào chỗ trống trong cửa sổ
ToolBox, chọn mục "Components..." để hiển thị cửa
sổ "Components", ấn button Controls, duyệt đến mục
"Microsoft Forms 2.0 Object Library" và chọn nó để
thêm các phần tử giao diện trong thư viện này vào
Toolbox của Project VB.
5. Chọn menu Project.References... để hiển thị cửa sổ
References, ấn button Browse rồi duyệt hệ thống file
để chọn file uniutil.tlb vừa tạo ở bước 1 để thêm nó
vào Project.
6. Vẽ lần lượt từng phần tử:
1 TextBox có thuộc tính Name=txtSo; 1 Label kết
hợp có thuộc tính Caption="Hãy nhập số :"; 1
CommandButton có thuộc tính Caption="Bắt đầu
chuyển" và thuộc tính Name=cmdChuyenSo; 1
TextBox nữa có thuộc tính Name=txtChuoi; 1 Label
kết hợp có thuộc tính Caption="Chuỗi tương đương
:". Lưu ý rằng bạn phải dùng trình hỗ trợ tiếng Việt
có khả năng tạo mã UTF-8 (VietKey 2000, GVSBK
2.2,...) và chọn mã này trong việc nhập các chuỗi
tiếng Việt trong lúc thiết kế form và viết code. Cũng
lưu ý rằng các phần tử cần vẽ là các phần tử của thư
viện "Microsoft Forms 2.0 Object Library", chứ
không phải là các phần tử VB chuẩn (thường chúng
nằm phía dưới cùng trong cửa sổ ToolBox). Sau khi
thiết kế xong, form sẽ có dạng sau (chú ý các chuỗi
UTF-8 rất khó đọc):
7. Tạo thủ tục xử lý sự kiện Click chuột cho button
cmdChuyenSo rồi vào cửa sổ viết code của form để
nhập đoạn chương trình sau:
Option Explicit
'dãy chứa chuỗi UTF8 mi êu tả các ký số
'mã ký số 0 đến 9 là 48 đến 57
Dim dayUTF8(48 To 57) As String
'dãy chứa chuỗi UCS2 miêu tả các ký số
Dim dayUCS2(48 To 57) As String
' Thủ tục khởi động Form
Private Sub Form_Load()
Dim s As String
Dim x() As Byte
Dim ret As Integer
Dim i As Integer
dayUTF8(48) = "không"
dayUTF8(49) = "một"
dayUTF8(50) = "hai"
dayUTF8(51) = "ba"
dayUTF8(52) = "bốn"
dayUTF8(53) = "năm"
dayUTF8(54) = "sáu"
dayUTF8(55) = "bảy"
dayUTF8(56) = "tám"
dayUTF8(57) = "chín"
' Chuyển caption của button cmdChuyenSo về
Unicode
x = StrConv(cmdChuyenSo.Caption,
vbFromUnicode)
ret = MultiByteToWideChar(65001, 0, x, -1, s, 0)
s = Space(ret)
ret = MultiByteToWideChar(65001, 0, x, -1, s, ret)
cmdChuyenSo.Caption = s
' Chuyển caption của label lblSo về Unicode
x = StrConv(lblSo.Caption, vbFromUnicode)
ret = MultiByteToWideChar(65001, 0, x, -1, s, 0)
s = Space(ret)
ret = MultiByteToWideChar(65001, 0, x, -1, s, ret)
lblSo.Caption = s
' Chuyển caption của label lblChuoi về Unicode
x = StrConv(lblChuoi.Caption, vbFromUnicode)
ret = MultiByteToWideChar(65001, 0, x, -1, s, 0)
s = Space(ret)
ret = MultiByteToWideChar(65001, 0, x, -1, s, ret)
lblChuoi.Caption = s
' Chuyển các chuỗi UTF8 miêu tả các ký số về
Unicode
For i = 48 To 57
x = StrConv(dayUTF8(i), vbFromUnicode)
ret = MultiByteToWideChar(65001, 0, x, -1, s, 0)
s = Space(ret)
ret = MultiByteToWideChar(65001, 0, x, -1, s, ret)
dayUCS2(i) = Left(s, Len(s) - 1)
Next i
End Sub
'hàm xử lý sự kiện click chuột
Private Sub cmdChuyenSo_Click()
Dim so() As Byte
Dim chuoi As String
Dim i As Integer
chuoi = ""
so = StrConv(txtSo.Value, vbFromUnicode)
For i = 0 To Len(txtSo.Value) - 1
chuoi = chuoi & dayUCS2(so(i)) & " "
Next i
txtChuoi.Value = chuoi
End Sub
Khi chạy, form hiển thị như sau (các chuỗi Unicode
đều hiển thị đúng):
Theo PCWorld VN
c