SỐ 165
KINH NGHIỆM LẬP TRÌNH

Dùng tiếng Việt trong ứng dụng Visual Foxpro 6.0
CHƯƠNG CAN CHÍP

Thấy nhiều bà con thắc mắc về chuyện dùng tiếng Việt khi “mần” ứng dụng Visual Foxpro (VFP), tui thử la cà mấy cái quán in-tẹc-nét để “trinh sát” và rồi ngẫm thấy rằng: cái dzụ này... hay à nghen! Một ngày, hai ngày, rồi... en-nờ ngày qua mau, “chơn kinh” được tui đúc kết với bao vất vả không thua chi Đường Tăng trên đường Tây Du. Chỉ khác ở chỗ tên tui là... Thường Chăng!

Hồi 1: Thường Chăng lọt ổ phông chữ Việt
Để tương thích “tùm lum tà la”, người ta vẫn duy trì 2 loại phông chữ: 1-byte (tương thích ứng dụng trên DOS) và 2-byte. Ví dụ, phông chữ VNI 1-byte có tên rất Việt Nam như: HaLong, ThanhHoa, CuuLong... (tương ứng với tên phông chữ tiếng ăng-lê là Helvetica, Times, Courier...). Còn phông chữ VNI 2-byte có tên bắt đầu bằng VNI (như: VNI-Times, VNI-Aptima...), trong đó các ký tự tiếng Việt có dấu (như ấ, ắ, ư, ê...) thường dài 2 byte.
Do phông chữ 2-byte chỉ dùng 2-byte đối với một số ký tự tiếng Việt có dấu, khó lòng xác định chính xác kích thước dành cho các field có kiểu Character, mình nên chọn phông chữ 1-byte cho việc hiển thị dữ kiện của các table (các tập tin .DBF).
Túm lại, khi mần ứng dụng VFP, bà con phải chọn trước phông chữ để hiển thị dữ kiện được đưa vào các table và dùng phông chữ này để thiết kế các thành phần giao diện người dùng. Ví dụ, nếu tui chọn bộ gõ VietKey để nhập dữ kiện, phông chữ VNI 1-byte để hiển thị, thì tui xác định kiểu gõ là VNI, bộ mã là VNI-DOS (có thể dùng các phông chữ HaLong, ThanhHoa... cho giao diện).
Chưa hết, phông chữ trên Windows có 2 kiểu: phông chữ màn hình và phông chữ máy in. Tập tin phông chữ màn hình có đuôi là .FON, tập tin phông chữ máy in có đuôi là .TTF. Nếu bà con lẫn lộn chuyện này, chữ sẽ xấu như... Thị Nở! Phông chữ màn hình của VNI-DOS có tên là Vietnam, còn HaLong, ThanhHoa... lại là các phông chữ máy in.
Nếu có thể, dùng phông chữ Unicode là hay nhất. Nghe đồn hình như phiên bản VFP 8.0 đã hỗ trợ Unicode, bà con thử kiểm chứng xem sao?

Hồi 2: Thường Chăng đại náo phông chữ Việt
Trừ khi bà con xài Unicode hoặc xài phiên bản Windows tiếng Việt, ứng dụng của ta phải thực hiện việc cài đặt các phông chữ Việt cần thiết và sửa đổi thuộc tính phông chữ của các thành phần giao diện.
Giả sử bà con đã chép các phông chữ Việt vào thư mục D:\FONTVN. Đoạn mã 1 trình bày việc cài đặt phông chữ HaLong.TTF và Vietnam.FON.
Đoạn mã 1
lThanhCong = CaiDatPhongChu("D:\FONTVN\HaLong.TTF")
lThanhCong = CaiDatPhongChu("D:\FONTVN\Vietnam.FON")
PROCEDURE CaiDatPhongChu()
LPARAMETERS lcTapTinPhongChu
LOCAL lnSoCuaPhongChuDuocThem
** Khai báo hàm API:
DECLARE INTEGER AddFontResource IN GDI32.DLL ;
STRING @ lpszFileName
DECLARE INTEGER SendMessage IN USER32.DLL ;
INTEGER hWnd, ;
INTEGER Msg, ;
INTEGER wParameter, ;
INTEGER lParameter
** Khai báo hằng API để xài trong hàm API:
#DEFINE HWND_BROADCAST 0xFFFF
#DEFINE WM_FONTCHANGE 0x001D
** Gọi hàm API để thêm phông chữ:
lnSoCuaPhongChuDuocThem = AddFontResource(lcTapTinPhongChu)
IF lnSoCuaPhongChuDuocThem > 0 && Phông chữ được thêm thành công
* Thông báo cho Windows để các ứng dụng biết có phông chữ mới thêm vào
=SendMessage(HWND_BROADCAST, WM_FONTCHANGE, 0, 0)
RETURN .T.
ELSE && Không thể thêm được phông chữ.
RETURN .F.
ENDIF
* Xóa khỏi ký ức các hàm API
CLEAR DLLS "AddFontResource", “SendMessage”
ENDPROC
Sau khi cài đặt xong phông chữ, chỉ có giao diện trên các biểu mẫu và các báo biểu có xài phông chữ này mới chịu ép-phê, còn các thành phần khác như trình đơn, tiêu đề cửa sổ, thông báo, chú thích... thì “đầu lâu xương sọ”! Đơn giản vì các thành phần này do Windows quản lý. Ta cũng phải xài các hàm API để thay đổi thuộc tính phông chữ của chúng. Tuy nhiên, máy của người ta không chỉ xài một ứng dụng VFP của mình, bà con nhớ trả lại “hiện trường” trước khi kết thúc ứng dụng (đoạn mã 2).
Đoạn mã 2
DO SetFontSystem WITH "ON", "Vietnam" && Dùng phông chữ Vietnam
* Chỗ này là các công việc của ứng dụng phải mần
* ...
DO SetFontSystem WITH "OFF", "Vietnam" && Hoàn nguyên thuộc tính cũ
PROCEDURE SetFontSystem
LPARAMETERS pOnOff, pFontName
* Mặc định là phông chữ Vietnam nếu tham số thứ hai để trống
pFontName = IIF(EMPTY(pFontName), "Vietnam", pFontName)
PRIVATE ALL
IF pOnOff = "ON"
IF LEN(pFontName) > 31 && Tên phông chữ không hợp lệ
RETURN
ENDIF
ENDIF
SPI_GETNONCLIENTMETRICS = 41
SPI_SETNONCLIENTMETRICS = 42
lcBuffSize = 1
lcCaption = 25 + 28
lcSMCaption = 93 + 28
lcMenu = 161 + 28
lcStatus = 221 + 28
lcMessage = 281 + 28
lcBuff = CHR(340%256)+CHR(INT(340/256))+CHR(0)+CHR(0)+REPLICATE(CHR(0),340-4)
DECLARE integer SystemParametersInfo IN USER32 AS SYSINFO;
integer uiAction, ;
integer BuffSize, ;
string @Buff, ;
integer fWinIni
* Lấy thông tin về thuộc tính phông chữ hệ thống
SYSINFO(SPI_GETNONCLIENTMETRICS, LEN(lcBuff), @lcBuff, 0)
IF pOnOff = "ON" && Nếu là đặt để thuộc tính mới
pubOldFontName = SUBS(lcBuff, lcMenu, 31) && Lấy tên phông chữ hiện thời
IF FILE("SysFont.MEM")
ERASE SysFont.MEM
ENDIF
SAVE TO SysFont ALL LIKE pubOldFontName && Lưu lại để hoàn nguyên
ELSE && Nếu là hoàn nguyên
RESTORE FROM SysFont ADDITIVE && Lấy tên phông chữ đã lưu
pFontName = pubOldFontName
RELEASE pubOldFontName
ENDIF
* Gán trị mới sẽ thay đổi thuộc tính phông chữ hệ thống
lcBuff = STUFF(lcBuff, lcCaption, LEN(pFontName)+1, pFontName + CHR(0))
lcBuff = STUFF(lcBuff, lcSMCaption, LEN(pFontName)+1, pFontName + CHR(0))
lcBuff = STUFF(lcBuff, lcMenu, LEN(pFontName)+1,pFontName+CHR(0))
lcBuff = STUFF(lcBuff, lcStatus, LEN(pFontName)+1,pFontName+CHR(0))
lcBuff = STUFF(lcBuff, lcMessage, LEN(pFontName)+1,pFontName+CHR(0))
* Thực hiện thay đổi thuộc tính phông chữ hệ thống
SYSINFO(SPI_SETNONCLIENTMETRICS, LEN(lcBuff), @lcBuff, 0)
* Xóa khỏi ký ức các hàm API
CLEAR DLLS "SystemParametersInfo"
RETURN
(còn tiếp)
[Đầ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