Hiển thị Tiếng việt tại các MsgBox

vuthuanbkvn

Member
Hội viên mới
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:võ 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:
Ðề: Hiển thị Tiếng việt tại các MsgBox

Theo tôi nên sử dụng unicode.
Đa số máy ở VN đều có cài đặt unicode. Đa số máy ở Mỹ thì không có cài.
Ngoài ra không nên can thiệp quá sâu vào hệ thống.
Ví dụ khi dùng Access thì những chỗ nào có thể gõ unicode thì nó đều thể hiện được: title bar, status bar, controlTip, label, text box ...
Một đôi khi nên dùng tiếng Anh nếu như chưa có chữ Việt phù hợp để dịch.
Chẳng hạn nên dùng các từ File, Field, Save, internet ... thay vì dùng Tệp, Trường, Lưu ... hà... ở đây quả thực chữ internet không nên dịch sang tiếng Việt.

-----
Như cách bạn hướng dẫn khai báo trong Control Panel ở trên thì cần làm khi cài đặt Window hoặc là khi khai báo cần nối mạng internet.
Khi đó máy sẽ được cài font unicode và sau đó ta cứ dùng thôi.
Bạn cũng nhớ hồi năm nào MS có thiết kế bản Win95 Việt hóa, nhưng rõ ràng dự án đó đã phá sản.
Người Việt nên có tối thiểu bằng A tiếng Anh, thay vì cố chèn tiếng Việt vào phần mềm của Microsoft.
 
Ðề: Hiển thị Tiếng việt tại các MsgBox

THEO NHƯ BÁC MUONTENNGUOI GỢI Ý VÀ NÊU MÌNH THỰC HIỆN LUÔN CẢ Ã CÁCH THẤY :
- cách đầu thì có nhược điểm: khi đang sử dụng access do đã chuyển lại hệ thống font của win thì các hệ thống mà mình sử dụng khác ngoài access bị lỗi font.
- cách sau: do cài lại hệ thống font nên Dãy phím số trên bàn phím toàn ra: ă â ê ô ̀ ̉ ̃ ́ ̣ đ - ₫ \ , xử lý ntn nhỉ?

Bên cụm numlock thì vẫn ra 123456789 ,,,,, đều đều, nhưng dãy phím số bên trên các ký tự q, w, e, r, t, y, u, thì nó lại ra thế kia, mấy dấu móc, hoa thị, a còng không hiện ra được.
cách này thuận tiện cho người lập trình không phải chuyển đổi lại thành vntimes và lập trình nhanh hơn rất nhiều.

Xin hỏi: có cách nào khắc phục lỗi trên? tìm ở google mãi chưa thấy? anh em nào từng bị và từng sử lý như nào nhỉ? Mong chỉ giáo?
-----------------------------------------------------------------------------------------
Đó là do Windows thự thiết lập chế độ gõ Tiếng Việt cho máy tính, bạn phải tắt nó đi bằng cách sau:
- Vào Control Panel > Regional and Language Options > Thẻ Languages > Bấm nút Details > Thẻ Settings > Tại Default input language, bạn chọn English (United States) - US là xong!
Khi cài đặt lần đầu tiên và khởi động lại thì mọi thứ đều có vẻ như rất ok,nhưng khi khởi động lại từ lần 2 trở đi Windows sẽ tự thiết lập hệ thống tiếng việt cho máy và mặc định luôn..... híc vì vậy các bộ số 1,2...9 khi gõ đều không đúng và có tình trạng trên?? Không biết làm kiểu gì?
-----------------------------------------------------------------------------------------
Cách số 1 ngoài tình trạng bị lỗi font thì còn một lỗi nữa là:
Đổi font Hệ thống không làm "nứt" các icon ở Traysystem
nghĩa là :
Bình thường khi dùng các hàm API để đổi font của hệ thống thành font của mình thì các biệu tượng phía dưới Traysystem sẽ bị co giãn kích thước làm cho các biểu tượng không thể hiện thị đúng kích thước ban đầu. Đoạn chương trình này sẽ khắc phục được nhược điểm trên
mình sưu tầm được cách khắc phục sau:
http://caulacbovb.com/forum/download/file.php?id=753
nhưng còn cái lỗi kia chưa tìm thấy,khi nào tìm thấy sẽ mách anh em,khò khò.. cái gì cũng có ưu và nhược nhỉ? nếu tìm được cách khắc phục các nhược điểm thì ta chọn phải không? Mong anh em góp sức nha:chay:
 
Sửa lần cuối:
Ðề: Hiển thị Tiếng việt tại các MsgBox

Thấy quý vị râm ran cái vụ hiển thị chữ có dấu tiếng Việt ở MsgBox quá, tôi bèn tham gia một chút xíu. Bảo đảm hiện chữ có dấu tiếng Việt hẳn hoi. Xài unicode nghen.

Quý vị chịu khó làm một cái table sau:

Name: tblMessages
Fields: messID (Text, 50), messContent (Text, 255)


messID: chứa một chuỗi để xác định nội dung thông báo, ví dụ: TRUNG_MASO
messContent: chứa nội dung thông báo, ví dụ: Mã số đã bị trùng, vui lòng nhập lại mã số khác.

Làm một cái sub hay function gì đó. Ở đây là sub ví dụ:

Public Sub ThongBao (messID As String)
Dim noidung
noidung = DLookup("messContent", "tblMessages", "messID = '" & messID & "'")
If IsNull(noidung) Then
MsgBox "This error is not recorded."
Else
MsgBox noidung
End If
End Sub


Ở đâu đó cần hiện thông báo thì gọi sub:

ThongBao TRUNG_MASO


Vậy là nhẹ nhàng, khỏi cần Windows API chi cho cực khổ.
 
Ðề: Hiển thị Tiếng việt tại các MsgBox

Name: tblMessages
Fields: messID (Text, 50), messContent (Text, 255)



Ở đâu đó cần hiện thông báo thì gọi sub:

ThongBao TRUNG_MASO

Mạo muội thêm 1 chút đại ca nhé, Có 1 trong 2 chỗ cần chỉnh thì mới không báo lỗi.
1. Thay messID thành kiểu number hoặc
2. goi thong bao phải cho trong ngoặc kép: thongbao "trung_maso"
 
Ðề: Hiển thị Tiếng việt tại các MsgBox

Thấy quý vị râm ran cái vụ hiển thị chữ có dấu tiếng Việt ở MsgBox quá, tôi bèn tham gia một chút xíu. Bảo đảm hiện chữ có dấu tiếng Việt hẳn hoi. Xài unicode nghen.

Quý vị chịu khó làm một cái table sau:

Name: tblMessages
Fields: messID (Text, 50), messContent (Text, 255)


messID: chứa một chuỗi để xác định nội dung thông báo, ví dụ: TRUNG_MASO
messContent: chứa nội dung thông báo, ví dụ: Mã số đã bị trùng, vui lòng nhập lại mã số khác.

Làm một cái sub hay function gì đó. Ở đây là sub ví dụ:

Public Sub ThongBao (messID As String)
Dim noidung
noidung = DLookup("messContent", "tblMessages", "messID = '" & messID & "'")
If IsNull(noidung) Then
MsgBox "This error is not recorded."
Else
MsgBox noidung
End If
End Sub


Ở đâu đó cần hiện thông báo thì gọi sub:

ThongBao TRUNG_MASO


Vậy là nhẹ nhàng, khỏi cần Windows API chi cho cực khổ.
Mìng đã làm theo hwowsng dẫn của bác nhwng khi chạy vẫn không hiển thị được chữ Việt
 
Ðề: Hiển thị Tiếng việt tại các MsgBox

THEO NHƯ BÁC MUONTENNGUOI GỢI Ý VÀ NÊU MÌNH THỰC HIỆN LUÔN CẢ Ã CÁCH THẤY :
- cách đầu thì có nhược điểm: khi đang sử dụng access do đã chuyển lại hệ thống font của win thì các hệ thống mà mình sử dụng khác ngoài access bị lỗi font.
- cách sau: do cài lại hệ thống font nên Dãy phím số trên bàn phím toàn ra: ă â ê ô ̀ ̉ ̃ ́ ̣ đ - ₫ \ , xử lý ntn nhỉ?

Bên cụm numlock thì vẫn ra 123456789 ,,,,, đều đều, nhưng dãy phím số bên trên các ký tự q, w, e, r, t, y, u, thì nó lại ra thế kia, mấy dấu móc, hoa thị, a còng không hiện ra được.
cách này thuận tiện cho người lập trình không phải chuyển đổi lại thành vntimes và lập trình nhanh hơn rất nhiều.

Xin hỏi: có cách nào khắc phục lỗi trên? tìm ở google mãi chưa thấy? anh em nào từng bị và từng sử lý như nào nhỉ? Mong chỉ giáo?
-----------------------------------------------------------------------------------------

Tôi vẫn sử dụng cách này, mới đầu cũng thấy rất phiền. tuy nhiên sẽ không phiền nữa nếu bạn để Unikey chạy thường trực trên Windows. Khi đó các phím số như bạn nói vẫn thể hiện 1,2,3,4... và !, @, #.. như bình thường, và tất nhiên nếu bạn muốn dùng Unicode thì phải dùng bảng mã Unicode tổ hợp mới không gặp lỗi trên VBE.
 
Ðề: Hiển thị Tiếng việt tại các MsgBox

Mình cũng có 1 msgbox hiển thị unicode nhe, nhưng cách gõ trong access hơi đặc biệt tí, vì trong code kô gõ đc unicode, nên mình giả lập

Ví dụ: Ho^m nay la` nga`y dde.p tro+`i -> Hôm nay là ngày đẹp trời

Để mình tìm lại và post lên nhe
 

CẨM NANG KẾ TOÁN TRƯỞNG


Liên hệ: 090.6969.247

KÊNH YOUTUBE DKT

Cách làm file Excel quản lý lãi vay

Đăng ký kênh nhé cả nhà

SÁCH QUYẾT TOÁN THUẾ


Liên hệ: 090.6969.247

Top