Như bạn đã biết, ngôn ngữ được dùng để lập trình trong Access là VBA (Visual Basic for Application). Cũng như nhiều phần tử giao diện khác của 1 ứng dụng, hàm MsgBox() dùng font hệ thống để hiển thị thông tin, do đó để thông tin tiếng Việt được hiển thị bởi hàm MsgBox() luôn đúng và đọc được, bạn phải khai báo lại tên các font hệ thống cần dùng cho ứng dụng. Có 2 cách khai báo lại tên font thường dùng như sau:
o Khai báo thủ công như bạn đã làm (vào Control Panel.Display.Properties.Appearance để chỉnh lại). Cách này quá phiền hà cho người dùng như bạn đã thấy.
o Khai báo tự động bằng phần mềm, qui trình điển hình như sau:
1. Cài font tiếng Việt cần dùng cho ứng dụng vào Windows, việc này thường được thực hiện trong trình Setup và chỉ cần thực hiện 1 lần.
2. Mỗi khi chương trình chạy, nó đọc sơ đồ font của hệ thống rồi lưu giữ sơ đồ này trong chương trình, sau đó chương trình thiết lập lại sơ đồ mới dùng font tiếng Việt riêng. Hàm SetSysFont() bằng VB được liệt kê dưới đây sẽ thực hiện chức năng này.
3. Cho chương trình hoạt động bình thường.
4. Khi chương trình kết thúc, nó phục hồi sơ đồ font hệ thống trước đó lại cho Windows. Hàm RestoreSysFont() được liệt kê dưới đây sẽ thực hiện chức năng này.
Lưu ý hàm API phục vụ cho việc đọc/thiết lập sơ đồ font có tên là "SystemParametersInfo". Đoạn chương trình VB sau đây thực hiện các công đoạn trên. Chương trình gồm 1 form đơn giản có 1 button tên là Command0, khi form được chạy, hàm Form_Load sẽ thiết lập font hệ thống tiếng Việt theo yêu cầu của ứng dụng, hàm Command0_Click() demo việc gọi hàm MsgBox() để hiển thị văn bản tiếng Việt, hàm Form_Unload() sẽ phục hồi lại sơ đồ font hệ thống như trước khi form được chạy.
Option Compare Database
' Khai báo các hằng
Const SPI_GETNONCLIENTMETRICS = 41
Const SPI_SETNONCLIENTMETRICS = 42
Const SPI_GETICONTITLELOGFONT = 31
Const SPI_SETICONTITLELOGFONT = 34
' Khai báo kiểu cần dùng
Private Type LOGFONT
lfHeight As Long
lfWidth As Long
lfEscapement As Long
lfOrientation As Long
lfWeight As Long
lfItalic As Byte
lfUnderline As Byte
lfStrikeOut As Byte
lfCharSet As Byte
lfOutPrecision As Byte
lfClipPrecision As Byte
lfQuality As Byte
lfPitchAndFamily As Byte
lfFaceName As String * 32
End Type
Private Type NONCLIENTMETRICS
cbSize As Long
iBorderWidth As Long
iScrollWidth As Long
iScrollHeight As Long
iCaptionWidth As Long
iCaptionHeight As Long
lfCaptionFont As LOGFONT
iSmCaptionWidth As Long
iSmCaptionHeight As Long
lfSmCaptionFont As LOGFONT
iMenuWidth As Long
iMenuHeight As Long
lfMenuFont As LOGFONT
lfStatusFont As LOGFONT
lfMessageFont As LOGFONT
End Type
'Khai báo các biến
Dim m_nonClientMetrics As NONCLIENTMETRICS
Dim m_logFont As LOGFONT
'Khai báo các biến chứa sơ đồ font
Dim m_fontCaption As String * 32
Dim m_fontSmCaption As String * 32
Dim m_fontMenu As String * 32
Dim m_fontMessage As String * 32
Dim m_fontStatus As String * 32
Dim m_fontIcon As String * 32
'Khai báo hàm Windows API cần dùng
Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Boolean
' Thủ tục thiết lập sơ đồ font hệ thống Windows về tiếng Việt
Private Sub SetSysFont(fontname As String)
' Truy xuất sơ đồ font hệ thống hiện tại
m_nonClientMetrics.cbSize = Len(m_nonClientMetrics)
ret = SystemParametersInfo(SPI_GETNONCLIENTMETRICS, Len(m_nonClientMetrics), m_nonClientMetrics, 0)
ret = SystemParametersInfo(SPI_GETICONTITLELOGFONT, Len(m_logFont), m_logFont, 0)
' Cất lại font dùng hiển thị các Caption
m_fontCaption = m_nonClientMetrics.lfCaptionFont.lfFaceName
' Cất lại font dùng hiển thị các Caption nhỏ
m_fontSmCaption = m_nonClientMetrics.lfSmCaptionFont.lfFaceName
' Cất lại font dùng hiển thị các Menu
m_fontMenu = m_nonClientMetrics.lfMenuFont.lfFaceName
' Cất lại font dùng hiển thị các hộp thoại thông báo
m_fontMessage = m_nonClientMetrics.lfMessageFont.lfFaceName
' Cất lại font dùng hiển thị thông tin ở thanh trạng thái và tooltips
m_fontStatus = m_nonClientMetrics.lfStatusFont.lfFaceName
' Cất lại font dùng hiển thị tên các Icon chương trình
m_fontIcon = m_logFont.lfFaceName
' Thay đổi thành font chữ tiếng Việt
m_nonClientMetrics.lfCaptionFont.lfFaceName = fontname & vbNullChar
m_nonClientMetrics.lfSmCaptionFont.lfFaceName = fontname & vbNullChar
m_nonClientMetrics.lfMenuFont.lfFaceName = fontname & vbNullChar
m_nonClientMetrics.lfMessageFont.lfFaceName = fontname & vbNullChar
m_nonClientMetrics.lfStatusFont.lfFaceName = fontname & vbNullChar
ret = SystemParametersInfo(SPI_SETNONCLIENTMETRICS, Len(m_nonClientMetrics), m_nonClientMetrics, 0)
m_logFont.lfFaceName = fontname & vbNullChar
ret = SystemParametersInfo(SPI_SETICONTITLELOGFONT, Len(m_logFont), m_logFont, 0)
End Sub
' Phục hồi sơ đồ font cũ của Windows
Private Sub RestoreSysFont()
m_nonClientMetrics.lfCaptionFont.lfFaceName = m_fontCaption
m_nonClientMetrics.lfSmCaptionFont.lfFaceName = m_fontSmCaption
m_nonClientMetrics.lfMenuFont.lfFaceName = m_fontMenu
m_nonClientMetrics.lfMessageFont.lfFaceName = m_fontMessage
m_nonClientMetrics.lfStatusFont.lfFaceName = m_fontStatus
ret = SystemParametersInfo(SPI_SETNONCLIENTMETRICS, Len(m_nonClientMetrics), m_nonClientMetrics, 0)
m_logFont.lfFaceName = m_fontIcon
ret = SystemParametersInfo(SPI_SETICONTITLELOGFONT, Len(m_logFont), m_logFont, 0)
End Sub
'Hàm khởi động form ứng dụng
Private Sub Form_Load()
SetSysFont ("VnTimes")
End Sub
Hàm được gọi khi form bị xóa
Private Sub Form_Unload(Cancel As Integer)
RestoreSysFont
End Sub
' Thủ tục xử lý ấn button Command0
Private Sub Command0_Click()
MsgBox ("Dòng tiếng Việt thử")
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
If (KeyAscii < &H30) Or (KeyAscii > &H39) Then
KeyAscii = 0 ' Bỏ ký tự không phải là số
End If
End Sub
////////////////////////////////////////////
Hôm nay mình đọc và đã làm thành công 1 bài tập nữa ,sẽ post lên cho anh em cùng bàn và tham khảo. Mình chỉ làm thành công với .VNTime
còn Times new roman thì chưa thành công? không biết làm sao? híc.
Mình tự hỏi ,có thể chỉ cần tạo 1 form tiếng việt,khi bật lên thì sẽ nối với tất cả các form khác không? làm kiểu này lại phải copy tới các form khác để hiển thị tiếng việt sao?
Mong anh em góp ý!!!
http://www.box.net/shared/ozbmtvpsqv
Tb: có cách nào hiển thị chỉnh sửa cỡ chữ trong MsgBox không?
-----------------------------------------------------------------------------------------
ngoài ra ta có thể chỉnh như sau:
TGõ hùng- PC world
Trong Access 2K trở lên chạy trên Windows XP/2K, không cần phải thay thế font hệ thống bằng các font TCVN, VNI, Vietware..., bạn vẫn có thể sử dụng font Unicode tiếng Việt trong các thành phần từ khi lập trình cho đến khi sử dụng: ô nhập liệu, tiêu đề trên form, menu, toolbar... Quan trọng nhất, bạn có thể viết code sử dụng font Unicode để tạo các message box hiển thị tiếng Việt. Điểm mấu chốt là khi tạo các form, report, menubar, toolbar, bạn sử dụng font Unicode dựng sẵn, nhưng khi lập trình (viết code) bạn dùng font Unicode tổ hợp. Lưu ý: khi viết code nhớ chọn font có chữ Vietnamese ở đằng sau, ví dụ font Times New Roman (Vietnamese).
Cài đặt hệ điều hành 2K/XP
Vào Control panel->Regional and Language Options. Trong bảng này có 3 tab:
+ Tab Regional options (gọi là Tab 1)
+ Tab Languages (gọi là Tab 2)
+ Tab Advanced (gọi là Tab 3)
- Đầu tiên bạn vào Tab 2, đánh dấu chọn "Install files for complex script and right-to-left languages (including Thai)" (nếu chưa chọn). Có thể chương trình yêu cầu bạn đưa vào đĩa cài đặt WinXP(2K). Lưu ý: không nên dùng các đĩa cài đặt XP đã được chỉnh sửa như Wesmosiss WinXP,...
- Chọn OK và khởi động lại máy.
- Vào lại Tab 1, chọn Vietnamese.
- Vào Tab 3, chọn Vietnamese.
- Chọn OK và khởi động lại máy.
Cài đặt MS Office
Sau khi đã cài đặt MS Office, bạn vào Start -> Programs -> Microsoft Office Tools -> Microsoft Office Language Settings, chọn ngôn ngữ mặc định là Vietname.
Tôi chưa làm vì CD_rom bị hỏng,bạn nào làm rồi cho ý kiến nhỉ?
Cách nào tốt và các biện pháp khắc phục để khi chương trình cầm đến 1 máy khác hoạt động không bị lỗi phông chữ??? và tiện cho người sử dụng nhất?
o Khai báo thủ công như bạn đã làm (vào Control Panel.Display.Properties.Appearance để chỉnh lại). Cách này quá phiền hà cho người dùng như bạn đã thấy.
o Khai báo tự động bằng phần mềm, qui trình điển hình như sau:
1. Cài font tiếng Việt cần dùng cho ứng dụng vào Windows, việc này thường được thực hiện trong trình Setup và chỉ cần thực hiện 1 lần.
2. Mỗi khi chương trình chạy, nó đọc sơ đồ font của hệ thống rồi lưu giữ sơ đồ này trong chương trình, sau đó chương trình thiết lập lại sơ đồ mới dùng font tiếng Việt riêng. Hàm SetSysFont() bằng VB được liệt kê dưới đây sẽ thực hiện chức năng này.
3. Cho chương trình hoạt động bình thường.
4. Khi chương trình kết thúc, nó phục hồi sơ đồ font hệ thống trước đó lại cho Windows. Hàm RestoreSysFont() được liệt kê dưới đây sẽ thực hiện chức năng này.
Lưu ý hàm API phục vụ cho việc đọc/thiết lập sơ đồ font có tên là "SystemParametersInfo". Đoạn chương trình VB sau đây thực hiện các công đoạn trên. Chương trình gồm 1 form đơn giản có 1 button tên là Command0, khi form được chạy, hàm Form_Load sẽ thiết lập font hệ thống tiếng Việt theo yêu cầu của ứng dụng, hàm Command0_Click() demo việc gọi hàm MsgBox() để hiển thị văn bản tiếng Việt, hàm Form_Unload() sẽ phục hồi lại sơ đồ font hệ thống như trước khi form được chạy.
Option Compare Database
' Khai báo các hằng
Const SPI_GETNONCLIENTMETRICS = 41
Const SPI_SETNONCLIENTMETRICS = 42
Const SPI_GETICONTITLELOGFONT = 31
Const SPI_SETICONTITLELOGFONT = 34
' Khai báo kiểu cần dùng
Private Type LOGFONT
lfHeight As Long
lfWidth As Long
lfEscapement As Long
lfOrientation As Long
lfWeight As Long
lfItalic As Byte
lfUnderline As Byte
lfStrikeOut As Byte
lfCharSet As Byte
lfOutPrecision As Byte
lfClipPrecision As Byte
lfQuality As Byte
lfPitchAndFamily As Byte
lfFaceName As String * 32
End Type
Private Type NONCLIENTMETRICS
cbSize As Long
iBorderWidth As Long
iScrollWidth As Long
iScrollHeight As Long
iCaptionWidth As Long
iCaptionHeight As Long
lfCaptionFont As LOGFONT
iSmCaptionWidth As Long
iSmCaptionHeight As Long
lfSmCaptionFont As LOGFONT
iMenuWidth As Long
iMenuHeight As Long
lfMenuFont As LOGFONT
lfStatusFont As LOGFONT
lfMessageFont As LOGFONT
End Type
'Khai báo các biến
Dim m_nonClientMetrics As NONCLIENTMETRICS
Dim m_logFont As LOGFONT
'Khai báo các biến chứa sơ đồ font
Dim m_fontCaption As String * 32
Dim m_fontSmCaption As String * 32
Dim m_fontMenu As String * 32
Dim m_fontMessage As String * 32
Dim m_fontStatus As String * 32
Dim m_fontIcon As String * 32
'Khai báo hàm Windows API cần dùng
Private Declare Function SystemParametersInfo Lib "user32" Alias "SystemParametersInfoA" (ByVal uAction As Long, ByVal uParam As Long, ByRef lpvParam As Any, ByVal fuWinIni As Long) As Boolean
' Thủ tục thiết lập sơ đồ font hệ thống Windows về tiếng Việt
Private Sub SetSysFont(fontname As String)
' Truy xuất sơ đồ font hệ thống hiện tại
m_nonClientMetrics.cbSize = Len(m_nonClientMetrics)
ret = SystemParametersInfo(SPI_GETNONCLIENTMETRICS, Len(m_nonClientMetrics), m_nonClientMetrics, 0)
ret = SystemParametersInfo(SPI_GETICONTITLELOGFONT, Len(m_logFont), m_logFont, 0)
' Cất lại font dùng hiển thị các Caption
m_fontCaption = m_nonClientMetrics.lfCaptionFont.lfFaceName
' Cất lại font dùng hiển thị các Caption nhỏ
m_fontSmCaption = m_nonClientMetrics.lfSmCaptionFont.lfFaceName
' Cất lại font dùng hiển thị các Menu
m_fontMenu = m_nonClientMetrics.lfMenuFont.lfFaceName
' Cất lại font dùng hiển thị các hộp thoại thông báo
m_fontMessage = m_nonClientMetrics.lfMessageFont.lfFaceName
' Cất lại font dùng hiển thị thông tin ở thanh trạng thái và tooltips
m_fontStatus = m_nonClientMetrics.lfStatusFont.lfFaceName
' Cất lại font dùng hiển thị tên các Icon chương trình
m_fontIcon = m_logFont.lfFaceName
' Thay đổi thành font chữ tiếng Việt
m_nonClientMetrics.lfCaptionFont.lfFaceName = fontname & vbNullChar
m_nonClientMetrics.lfSmCaptionFont.lfFaceName = fontname & vbNullChar
m_nonClientMetrics.lfMenuFont.lfFaceName = fontname & vbNullChar
m_nonClientMetrics.lfMessageFont.lfFaceName = fontname & vbNullChar
m_nonClientMetrics.lfStatusFont.lfFaceName = fontname & vbNullChar
ret = SystemParametersInfo(SPI_SETNONCLIENTMETRICS, Len(m_nonClientMetrics), m_nonClientMetrics, 0)
m_logFont.lfFaceName = fontname & vbNullChar
ret = SystemParametersInfo(SPI_SETICONTITLELOGFONT, Len(m_logFont), m_logFont, 0)
End Sub
' Phục hồi sơ đồ font cũ của Windows
Private Sub RestoreSysFont()
m_nonClientMetrics.lfCaptionFont.lfFaceName = m_fontCaption
m_nonClientMetrics.lfSmCaptionFont.lfFaceName = m_fontSmCaption
m_nonClientMetrics.lfMenuFont.lfFaceName = m_fontMenu
m_nonClientMetrics.lfMessageFont.lfFaceName = m_fontMessage
m_nonClientMetrics.lfStatusFont.lfFaceName = m_fontStatus
ret = SystemParametersInfo(SPI_SETNONCLIENTMETRICS, Len(m_nonClientMetrics), m_nonClientMetrics, 0)
m_logFont.lfFaceName = m_fontIcon
ret = SystemParametersInfo(SPI_SETICONTITLELOGFONT, Len(m_logFont), m_logFont, 0)
End Sub
'Hàm khởi động form ứng dụng
Private Sub Form_Load()
SetSysFont ("VnTimes")
End Sub
Hàm được gọi khi form bị xóa
Private Sub Form_Unload(Cancel As Integer)
RestoreSysFont
End Sub
' Thủ tục xử lý ấn button Command0
Private Sub Command0_Click()
MsgBox ("Dòng tiếng Việt thử")
End Sub
Private Sub Text1_KeyPress(KeyAscii As Integer)
If (KeyAscii < &H30) Or (KeyAscii > &H39) Then
KeyAscii = 0 ' Bỏ ký tự không phải là số
End If
End Sub
////////////////////////////////////////////
Hôm nay mình đọc và đã làm thành công 1 bài tập nữa ,sẽ post lên cho anh em cùng bàn và tham khảo. Mình chỉ làm thành công với .VNTime
còn Times new roman thì chưa thành công? không biết làm sao? híc.
Mình tự hỏi ,có thể chỉ cần tạo 1 form tiếng việt,khi bật lên thì sẽ nối với tất cả các form khác không? làm kiểu này lại phải copy tới các form khác để hiển thị tiếng việt sao?
Mong anh em góp ý!!!
http://www.box.net/shared/ozbmtvpsqv
Tb: có cách nào hiển thị chỉnh sửa cỡ chữ trong MsgBox không?
-----------------------------------------------------------------------------------------
ngoài ra ta có thể chỉnh như sau:
TGõ hùng- PC world
Trong Access 2K trở lên chạy trên Windows XP/2K, không cần phải thay thế font hệ thống bằng các font TCVN, VNI, Vietware..., bạn vẫn có thể sử dụng font Unicode tiếng Việt trong các thành phần từ khi lập trình cho đến khi sử dụng: ô nhập liệu, tiêu đề trên form, menu, toolbar... Quan trọng nhất, bạn có thể viết code sử dụng font Unicode để tạo các message box hiển thị tiếng Việt. Điểm mấu chốt là khi tạo các form, report, menubar, toolbar, bạn sử dụng font Unicode dựng sẵn, nhưng khi lập trình (viết code) bạn dùng font Unicode tổ hợp. Lưu ý: khi viết code nhớ chọn font có chữ Vietnamese ở đằng sau, ví dụ font Times New Roman (Vietnamese).
Cài đặt hệ điều hành 2K/XP
Vào Control panel->Regional and Language Options. Trong bảng này có 3 tab:
+ Tab Regional options (gọi là Tab 1)
+ Tab Languages (gọi là Tab 2)
+ Tab Advanced (gọi là Tab 3)
- Đầu tiên bạn vào Tab 2, đánh dấu chọn "Install files for complex script and right-to-left languages (including Thai)" (nếu chưa chọn). Có thể chương trình yêu cầu bạn đưa vào đĩa cài đặt WinXP(2K). Lưu ý: không nên dùng các đĩa cài đặt XP đã được chỉnh sửa như Wesmosiss WinXP,...
- Chọn OK và khởi động lại máy.
- Vào lại Tab 1, chọn Vietnamese.
- Vào Tab 3, chọn Vietnamese.
- Chọn OK và khởi động lại máy.
Cài đặt MS Office
Sau khi đã cài đặt MS Office, bạn vào Start -> Programs -> Microsoft Office Tools -> Microsoft Office Language Settings, chọn ngôn ngữ mặc định là Vietname.
Tôi chưa làm vì CD_rom bị hỏng,bạn nào làm rồi cho ý kiến nhỉ?
Cách nào tốt và các biện pháp khắc phục để khi chương trình cầm đến 1 máy khác hoạt động không bị lỗi phông chữ??? và tiện cho người sử dụng nhất?
Sửa lần cuối: