Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[Thủ Thuật] Demo Tổng hợp tất cả các kiểu thông báo tiếng việt trong Access
#11
Thực ra phần thêm tiếng Việt thì không phải là cái gì đặc biệt. Quan trọng là thủ tục có ngắn gọn để dùng lẫn trong các ứng dụng của ta không. Làm sao chỉ cần gắp mô đun và thả vào ứng dụng là dùng được.
Về vấn đề thêm tiếng Việt thì các bạn cần chú ý đến một thủ thuật gọi là Hook - Câu móc.
Kỹ thuật này được áp dụng khi ta cần thiết muốn thay đổi một số nội dung nào đó của các hộp thoại do hệ thống/ ứng dụng nào đó cung cấp. Trên thực tế, các hộp thoại đều gồm các điều khiển với các thông tin có thể điều khiển được.
Ta hãy hiểu cơ chế hoạt động của Windows như thế này:
1. Gọi lệnh hiển thị cái gì đó (thông điệp, hộp thoại).
2. Đầu tiên đối tượng đó được nạp vào bộ nhớ và đăng ký một thẻ (thường Windows gọi là Handle) sau đó nó sẽ đăng ký chuỗi các thông điệp/ lệnh cần thực hiện để có thể xuất hiện trên màn hình.
3. Windows sẽ lần lượt thực hiện các thông điệp đó và kết thúc chu trình.
Vậy kỹ thuật câu móc sẽ được can thiệp vào bước 2 theo đó ta sửa đổi vài thông tin trong các thông điệp để nó hiển thị theo ý mình. Đến đây có 2 kỹ thuật hiểu một cách nôm na như sau:
+ Chèn nội dung thông điệp chút ít để nó có các thông điệp ta cần- cái này gọi là Hook
+ Thêm vào vài lệnh theo yêu cầu - cái này gọi là SubClass.

Như thế thì ta có thể can thiệp vào hầu hết các hoạt động của hệ thống với bộ võ này.

Trở về thông điệp msgBox. Tôi dùng ngay thủ tục MsgBox để tiện dụng cho việc gọi thông điệp MsgBox. Vì tôi dùng tiếng Việt nên không cần phải dự phòng cho tình huống dùng tiếng Anh nữa.
Bước 1: Thiết lập cách hiển thị MsgBox
Xác định xem tham số truyền vào là gì để biết loại ứng dụng. Vì thường người ta sẽ truyền vào dạng tham số có Loại thông tin kết hợp luôn với loại thông điệp
Mã:
MsgBox "Hi", vbCritical + vbYesNo, "xxxx"
các tham số vbCritical,  vbYesNo ... chẳng qua chỉ là các hằng số và nó được gắn với giá trị nhất định tương đối nhất quán và thống nhất
Ở đây tôi không thiết kế phần xác định nút nào là mặc định vì mất thời gian và cũng không quá cần thiết

Bước 2: Khởi tạo thủ tục câu móc
Để dùng được các hàm câu móc, chúng ta phải khai báo thêm các hàm API của hệ thống để sử dụng trong đoạn đầu Module

Hàm này để lấy thẻ đăng ký của ứng dụng gọi thông điệp
Mã:
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long

Hàm này để thiết lập các giá trị vào đối tượng trong hộp thoại

Mã:
Private Declare Function SetDlgItemText Lib "user32" _
        Alias "SetDlgItemTextW" _
        (ByVal hDlg As Long, _
         ByVal nIDDlgItem As Long, _
         ByVal lpString As String) As Long


Hàm này để thiết lập chế độ câu móc vào đối tượng nào của ứng dụng gọi hộp thoại     

Mã:
Private Declare Function SetWindowsHookEx Lib "user32" _
Alias "SetWindowsHookExA" _
(ByVal idHook As Long, _
 ByVal lpfn As Long, _
 ByVal hmod As Long, _
 ByVal dwThreadID As Long) As Long


Hàm này để kết thúc quá trình câu móc

Mã:
Private Declare Function UnhookWindowsHookEx Lib "user32" _
(ByVal hHook As Long) As Long


Sau khi khai báo xong, chúng ta bắt đầu gọi thủ tục Hook bằng cách
Mã:
hHook = SetWindowsHookEx(WH_CBT, AddressOf MsgBoxHookProc, 0, GetCurrentThreadId)

Có 4 tham số, ta chỉ cần chú ý đến:
+ AddressOf MsgBoxHookProc: Địa chỉ của thủ tục câu móc trong bộ nhớ
+ GetCurrentThreadId: thẻ đăng ký của ứng dụng gọi thủ tục

Ở đây do hàm MsgBox được gọi ở chế độ Modal nên nó nổi lên trên cùng của ứng dụng và hệ thống dừng ở đó để chờ đợi thao tác do đó chỉ cần trả về thẻ Ứng dụng gọi hàm MsgBox là có thể lấy ngay được hộp thoại đang nổi lên. Với những hộp thoại không ở chế độ Modal thì phải dùng thêm một số tham số khác như Caption của hộp thoại, thẻ phụ ...vv

Đại loại hàm này sẽ đăng ký là: Khi hộp thoại đưa vào bộ nhớ thì thủ tục MsgBoxHookProc sẽ được kích hoạt và sửa đổi thông tin.

Sau khi gọi xong thì bỏ chế độ câu móc bằng
Mã:
UnhookWindowsHookEx hHook

Và tiếp tục với việc hiển thị thông điệp ra màn hình

Mã:
MsgBox = Application.Assistant.DoAlert(IIf(DlgCaption <> "", DlgCaption, App_Title), _

        MessageTxt, msgButton, msgBoxIcon, ButtonDefault, msoAlertCancelDefault, True)


Thủ tục MsgBox này có thể áp dụng được với bất kỳ ứng dụng Office nào vì nó dùng thông điệp của Office Application.Assistant.DoAlert
Cái này tôi chộp được của Hoàng Trọng Nghĩa ở Giải pháp Excel (trước đây tôi dùng MsgBox của Hệ thống thấy nó xấu nên cuối cùng áp dụng cái Assistant của Nghĩa).

Đấy đơn giản thế thôi.
Nếu các bạn muốn tìm hiểu về Hook và SubClass thì có cả biển tài liệu để nghiên cứu nhờ dùng bác Gúc Gồ
Chúc các Cụ một ngày mới vui vẻ và hiệu suất cao
Chữ ký của paulsteigel ====================
Quốc gia hưng vong
Thất phu hữu trách
====================
Reply
Những người đã cảm ơn Minh Tiên , maidinhdan , MatTroiNguQuen , tranthanhan1962 , Noname , Che_Guevara , khanghychu
#12
Mình nghĩ mấy hàm đó Thì InputBox Tiếng việt có dấu chắc Tịt Quá
Xài mấy hàm API nó hay chứng giữa Win32 và 64 lắm nhiều lúc nó chứng hết xài hông biết lý do tại sao nữa
Chữ ký của kieu manh kieu manh,gia nhập Thủ Thuật Access từ 21-06 -15.
Reply
Những người đã cảm ơn
#13
Hàm VbaUni chữ     : đã = ChrW(273) & "ã"
Thay vì nó phải vậy : đã = ChrW(273) & ChrW(227)
Vì vậy Hàm VbaUni  một số máy hiểu sai từ đó
Một bộ siêu tập Msgbox khá đầy đủ nhưng còn thiếu một cái InputBox tiếng việt có dấu ...phải chăng nó khó làm quá....
Chữ ký của kieu manh kieu manh,gia nhập Thủ Thuật Access từ 21-06 -15.
Reply
Những người đã cảm ơn maidinhdan
#14
(06-08-15, 09:42 PM)kieu manh Đã viết: ...
Một bộ siêu tập Msgbox khá đầy đủ nhưng còn thiếu một cái InputBox tiếng việt có dấu ...phải chăng nó khó làm quá....

Cũng không đến nỗi "khó quá", chỉ cần bứt râu của bác Ân, cắm vào cằm bác Ngọc là có ngay một cái hàm InputBox TV  014 

Mã:
Function InputBox(ByVal Prompt As String, Optional ByVal Title As String = "", Optional ByVal DefaultResponse As String = "") As String
   
   Title = IIf(Title <> "", Title, Application.Name)
   
   hHook = SetWindowsHookEx(WH_CBT, AddressOf MsgBoxHookProc, 0, GetCurrentThreadId)
   
   InputBox = Eval("InputBox(""" & Prompt & _
       """, """ & Title & """, """ & DefaultResponse & """)")

End Function

Demo MsgBox va InputBox TV.rar
Chữ ký của MatTroiNguQuen Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn maidinhdan , tranthanhan1962 , Minh Tiên , Noname , khanghychu
#15
Nếu bạn nào không thích câu móc vào hệ thống thì chỉ cần đơn giản như sau:

Mã:
Function fInputBox(ByVal Prompt As String, Optional ByVal Title As String = "", Optional ByVal DefaultResponse As String = "") As String
   
   Title = IIf(Title <> "", Title, Application.Name)
  fInputBox = Eval("InputBox(""" & Prompt & _
       """, """ & Title & """, """ & DefaultResponse & """)")

End Function

Thực ra cú pháp đầy đủ của hàm InputBox như sau:
Mã:
InputBox ( prompt [, title ] [, default ] [, xpos ] [, ypos ] [, helpfile ] [, context ] )
 
Link tham khảo hàm InputBox

P/S: MTNQ mới up lại Demo ở bài #14 (Lý do: sửa hàm fTXT và fTitle, thêm vào hàm ở bài này)
Chữ ký của MatTroiNguQuen Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn maidinhdan , Minh Tiên , Noname , khanghychu
#16
(31-07-15, 10:10 PM)maidinhdan Đã viết: Còn 1 cách nửa mà mình chưa trình bày, nhưng cũng có đã sử dụng trong demo trên. Nên mình xin trình bày dưới đây luôn.

Tên gọi: Hàm chuyển chuỗi Unicode tiếng Việt thành Chuỗi mã Unicode trong VBA
Tác giả: Noname
Link liên kêt để trao đổi: http://thuthuataccess.com/forum/thread-4302.html
Tên hàm sử dụng: Chrw( mã unicode)

Cách thức sử dụng:
[Hình: vbaunicode.png]

Bước 1: Bạn viết tiếng việt vào ô như hình phía trên, sau đó ta nhấn nút chuyển, Sau đó copy đoạn chữ mới tạo ra.
Bước 2: Viết hàm MsgBox bình thường trong VBA

Ví dụ: Tôi rất yêu em ======> "Tôi r" & ChrW(7845) & "t yêu em"

=> MsgBox ("Tôi r" & ChrW(7845) & "t yêu em")

Chúc các bạn thành công.

Phần này mình cũng đã bổ sung vào file đính kèm thứ 2 ở bài đầu tiên.

Tôi xin góp ý chút xíu nha:
Bước 2: Sử dụng hàm TBtiengviet của bác tranthanhan1962 thì chuẩn hơn. 

Mình đã thử xài Msgbox nhưng vẫn lỗi.
[Hình: univba1.jpg]

Nhưng thay bằng TBtiengviet thì ok:
[Hình: univba2.jpg]

Demo của em đây
Múa rìu qua mắt thợ tí nha các bác... 007
Reply
Những người đã cảm ơn tranthanhan1962 , Noname , ledangvan , khanghychu
#17
Còn một cách nữa là dùng bàn phím tiếng Việt của Windows để gõ tiếng Việt (VIE - keyboard Vietnamese). Cách này sử dụng trực tiếp hàm Msgbox của VBA mà không cần viết thêm code nào cả.
Lưu ý:
1/ Khi sử dụng bàn phím VIE phải tắt hết các bộ gõ tiếng việt khác như vietkey, unikey.
2/ Khi gõ trong giao diện module cứ mỗi dấu giọng sẽ chạy ký tự một khoảng trắng, vì vậy sau khi gõ một đoạn con trỏ chạy tuốt ra đằng sau cách xa đoạn văn, chỉnh sửa rất khó. Mẹo: gõ trong word rồi dán vào giao diện module - trong word không bị lỗi chạy khoảng trắng. Muốn chỉnh sửa cũng copy sang word chỉnh sửa rồi copy dán ngược trở lại.
3/ Khi copy, paste đoạn mã có ký tự tiếng việt cũng phải tắt hết các bộ gõ tiếng việt, chọn bàn phím VIE dưới thanh taskbar mới thực hiện copy, paste. Nếu không sẽ bị lỗi font.
4/ Kiểu gõ của phím VIE không giống ai. 1 - ă, 2 - â, 3 - ê, 4 - ô, 5 - dấu huyền, 6 - dấu hỏi, 7 - dấu ngã, 8 - dấu sắc, 9 - dấu nặng, 0 - đ, [ - ư, ] - ơ. Bỏ dấu ngay sau nguyên âm, xóa dấu dùng phím backspace.
Chữ ký của tranthanhan1962 Kết quả cuối cùng của một đời người, không phải bạn có được bao nhiêu tiền bạc, tài sản. Mà bạn còn bao nhiêu người bạn  thumbs up
ღღღღღTài sản của tranthanhan1962 (View All Items) ღღღღღ
Reply
Những người đã cảm ơn Noname , maidinhdan , chigonvh
#18
Minh Tiên Đã viết:Chào cả nhà !
Tiên có một vấn đề phát sinh lỗi những không viết lý do là gì ? Nhờ các Pro chỉ giáo giúp !
 Tiên có 1 File Access sử dụng "Msgbox thông báo lỗi bằng tiếng Việt của bạn "pausteigel" trên diễn đàn", khi chạy trên PC có office 2007 hoặc 2013 thì chạy OK. Nhưng khi gỡ office và chạy Access Runtime 2007 hoặc Access Runtime 2013 thì không chạy được và thông báo lỗi: "Đã dừng thực thi do lỗi thời gian chạy".

Nhờ các pro chỉ giáo cách khắc phục lỗi ! Hoặc hướng dẫn cách sử dụng code để khi chạy  Access Runtime ko bị lỗi !
Thanks !

Sau khi test trên  Access Runtime, MTNQ xin góp ý sửa  module của bác Ngọc (paulsteigel) lại như sau:

Mã:
Option Explicit
'=======================================================
' Module for Vietnamized MsgBox function
' This overide default VBA MsgBox function with some small
' modifications of text, button caption....
' Use this MsgBox function like it is in default VBA IDE
'=======================================================
' Import
#If VBA7 Then
    Private Declare PtrSafe Function GetCurrentThreadId Lib "kernel32" () As LongPtr
     
    Private Declare PtrSafe Function SetDlgItemText Lib "user32" _
        Alias "SetDlgItemTextW" _
        (ByVal hDlg As LongPtr, _
         ByVal nIDDlgItem As LongPtr, _
         ByVal lpString As String) As LongPtr
     
    Private Declare PtrSafe Function SetWindowsHookEx Lib "user32" _
        Alias "SetWindowsHookExA" _
        (ByVal idHook As LongPtr, _
         ByVal lpfn As LongPtr, _
         ByVal hmod As LongPtr, _
         ByVal dwThreadID As LongPtr) As LongPtr
     
    Private Declare PtrSafe Function UnhookWindowsHookEx Lib "user32" _
        (ByVal hHook As LongPtr) As LongPtr
     
    ' Handle to the Hook procedure
    Private hHook As LongPtr
#Else
    Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
     
    Private Declare Function SetDlgItemText Lib "user32" _
        Alias "SetDlgItemTextW" _
        (ByVal hDlg As Long, _
         ByVal nIDDlgItem As Long, _
         ByVal lpString As String) As Long
     
    Private Declare Function SetWindowsHookEx Lib "user32" _
        Alias "SetWindowsHookExA" _
        (ByVal idHook As Long, _
         ByVal lpfn As Long, _
         ByVal hmod As Long, _
         ByVal dwThreadID As Long) As Long
     
    Private Declare Function UnhookWindowsHookEx Lib "user32" _
        (ByVal hHook As Long) As Long
     
    ' Handle to the Hook procedure
    Private hHook As Long
#End If
' Hook type
Private Const WH_CBT = 5
Private Const HCBT_ACTIVATE = 5
 
' Constants
Private Const IDOK = 1
Private Const IDCANCEL = 2
Private Const IDABORT = 3
Private Const IDRETRY = 4
Private Const IDIGNORE = 5
Private Const IDYES = 6
Private Const IDNO = 7

' Modify this code for English
Private StrYes As String
Private StrNo As String
Private StrOK As String
Private StrCancel As String
Private StrRetry As String
Private StrIgnore As String
Private StrAbort As String
 
Private Function MsgBoxHookProc(ByVal lMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    If lMsg = HCBT_ACTIVATE Then
        StrYes = "&C" & ChrW(243)
        StrNo = "&Kh" & ChrW(244) & "ng"
        StrOK = "Ch" & ChrW(7845) & "p nh" & ChrW(7853) & "&n"
        StrCancel = "&H" & ChrW(7911) & "y"
        StrRetry = "&Th" & ChrW(7917) & " l" & ChrW(7841) & "i"
        StrAbort = "&D" & ChrW(7915) & "ng"
        StrIgnore = "&B" & ChrW(7887) & " qua"
  
        SetDlgItemText wParam, IDYES, StrConv(StrYes, vbUnicode)
        SetDlgItemText wParam, IDNO, StrConv(StrNo, vbUnicode)
        SetDlgItemText wParam, IDCANCEL, StrConv(StrCancel, vbUnicode)
        SetDlgItemText wParam, IDOK, StrConv(StrOK, vbUnicode)
        SetDlgItemText wParam, IDABORT, StrConv(StrAbort, vbUnicode)
        SetDlgItemText wParam, IDRETRY, StrConv(StrRetry, vbUnicode)
        SetDlgItemText wParam, IDIGNORE, StrConv(StrIgnore, vbUnicode)
        ' Release the Hook
        UnhookWindowsHookEx hHook
    End If
    MsgBoxHookProc = False
End Function

Function MsgBox(MessageTxt As String, Optional msgStyle As VbMsgBoxStyle, Optional DlgCaption As String = "") As VbMsgBoxResult
   DlgCaption = IIf(DlgCaption <> "", DlgCaption, Application.Name)
   hHook = SetWindowsHookEx(WH_CBT, AddressOf MsgBoxHookProc, 0, GetCurrentThreadId)
   MsgBox = Eval("MsgBox('" & MessageTxt & _
      "', '" & msgStyle & "', '" & DlgCaption & "')")
End Function

-Phần chỉnh sửa: hàm MsgBox

-Kết hợp thủ thuật câu móc của bác Ngọc để hiển thị Tiếng Việt cho các nút nhấn (yes no,cancel,...) và phát hiện về hàm Eval của bác Ân
Như vậy ta vừa có thể chuyển hoàn toàn MsgBox sang Tiếng Việt như bác Ngọc, vừa hiển thị phần cần tô đậm như bác Ân chia sẻ trong chủ đề  [size=2]Msg Box tiếng Việt Unicode có định dạng chữ đậm[/size]
Chữ ký của MatTroiNguQuen Thời gian nước chảy... da mòn
Ngủ quên một chốc thấy còn bộ xương!
Reply
Những người đã cảm ơn maidinhdan , paulsteigel , Che_Guevara


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
Question [Help] Link tất các table trong một file.mdb bằng VBA MinhnHang 6 145 29-11-16, 05:18 PM
Bài mới nhất: MinhnHang
  Tránh xung đột dữ liệu trong access quocdung9999 16 1,688 23-11-16, 11:13 AM
Bài mới nhất: quocdung9999
  [Hỏi] Kết nối nhiều lần hay kết nối 1 lần trong ADO ưu điểm hơn Minh Tiên 1 116 10-11-16, 10:41 AM
Bài mới nhất: maidinhdan
  Summary bằng VBA trong MS Access. MinhnHang 6 315 08-11-16, 08:36 AM
Bài mới nhất: MinhnHang
  [Hỏi] Số Thứ Tự Theo Nhóm Hàng Hóa Trong Access pherotao 2 141 02-11-16, 03:05 PM
Bài mới nhất: pherotao

Chuyển nhanh:


User(s) browsing this thread: 1 Guest(s)
Diễn Đàn Thơ Văn Thi Ẩm Lâu|Nhà Hàng Sông Thơ