Xin hướng dẫn lập trình Access tự động hiển thị mã tiếng Việt trong hàm MsgBox?

Xin hướng dẫn lập trình Access tự động hiển thị mã tiếng Việt trong hàm MsgBox để khi đem sang máy khác không phải vào Control Panel.Display.Properties.Appearance chỉnh lại.
tran anh kien
tran anh kien
Trả lời 15 năm trước
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
Tran Minh Tan
Tran Minh Tan
Trả lời 14 năm trước
[quote]Từ bài viết của [b]iuem[/b] 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[/quote] ------------------------------------- Toi da lam nhu huong dan nhung khi chay ct thi bao loi. Toi nghi can khai bao thu vien trong phan Tools\ References... Nhung khong biet check vao muc nao cho dung. Ai biet chi dum. Cam on