• Thứ Năm, 08/01/2004 14:42 (GMT+7)

    Câu hỏi :
    Hỏi: 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.

    Trả lời :

    Đáp: 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

    Chuyên mục: Tiếng Việt