ledangvan > 07-09-15, 01:37 PM
(07-09-15, 01:22 PM)paulsteigel Đã viết: Ledangvan ơi, tớ ko có ý trách cứ... chỉ là muốn làm sao để giúp mợi người có hệ thống thôi.
Có lỗi quá.
Xin lỗi bạn nhé
Minh Tiên > 07-09-15, 05:11 PM
paulsteigel > 07-09-15, 05:27 PM
(07-09-15, 05:11 PM)Minh Tiên Đã viết: Cảm ơn Bác "pausteigel" nhiều nhiều !
Các nội dung Bác chia sẽ thật Pro và hữu ích.
Tôi cũng là dân tay ngang, đam mê ACCESS vì giúp mình rất nhiều trong công việc.
Tôi cũng như Bác "ledangvan" chắc là còn nhiều A/C/E khác nữa chỉ biết góp nhặt, lắp ghép sao cho tiện ích của mình "Bò" được là mừng rồi.
Bản thân tôi rất muốn được đọc những lời góp ý "Hơi nóng" nhưng rất chân thành của Bác.
Một lần nữa rất cảm ơn Bác !
Thân./.
ledangvan > 07-09-15, 09:51 PM
Property Let SetObjInterface(CallObject As Object)
' This will set object face language at runtime rather than do this just one
Dim iObj As New ADODB.Recordset, iCr As Control, Obj As Object, iCaption As String
Dim i As Long, fLang As String
fLang = AppLanguage
' Initialize interface recordset
iObj.Open Replace("+S+elect * f+rom tblCaption w+h+ere ObjectID='" & CallObject.name & "';","+",""), CurrentProject.Connection
With iObj
' Set caption for the object
On Error GoTo ExitMe
' Now set caption for all the label in the object
While Not iObj.EOF
CallObject.Controls(.Fields("MsgID")).Caption = .Fields("MsgCap" & fLang)
CallObject.Controls(.Fields("MsgID")).FontName = "Tahoma"
CallObject.Controls(.Fields("MsgID")).FontSize = 10
If .Fields("MsgID") = "FORM_OR_RÉPORT_NAME" Then CallObject.Caption = .Fields("Msg" + fLang)
.MoveNext
Wend
.Close
Set Obj = Nothing
End With
ExitMe:
End Property
paulsteigel > 08-09-15, 10:22 AM
(07-09-15, 09:51 PM)ledangvan Đã viết: ....
ledangvan > 08-09-15, 10:31 AM
(08-09-15, 10:22 AM)paulsteigel Đã viết:(07-09-15, 09:51 PM)ledangvan Đã viết: ....
Văn ơi,
Thủ tục 1 là đọc tất cả các textbox/ nút bấm vào bảng, chạy đi chạy lại nhiều lần thì nó lại thêm vào. Vì vậy chỉ cần chạy 1 lần.
Vậy các bước bạn cần làm là thế này:
Bước 1: Xóa hết bảng tblCaption đi đã
Bước 2: Chạy thủ tục 1 - 1 lần duy nhất
Bước 3: Chuyển bảng 1 sang unicode bằng Unikey rồi dán lại vào tblCaption
Bước 4: Sử dụng thủ tục 2 với cú pháp SetObjectInterface = me
Nếu bạn muốn thực hiện convert ngay trong code thì để tôi gửi thêm một mô đun convert từ VNI sang Unicode
paulsteigel > 08-09-15, 03:09 PM
(08-09-15, 10:31 AM)ledangvan Đã viết: ...Sau khi kiểm tra file của bạn, mình phát hiện ra là mình hơi ẩu khi viết thủ tục còn thiếu một biến loại ngôn ngữ (Anh/Việt) AppLanguage
CallObject.Controls(.Fields("MsgID")).Caption = ToUnicode(.Fields("MsgCap" & fLang))
CallObject.Controls(.Fields("MsgID")).FontName = "Tahoma"
CallObject.Controls(.Fields("MsgID")).FontSize = 10
If .Fields("MsgID") = "FORM_OR_REPORT_NAME" Then CallObject.Caption = ToUnicode(.Fields("Msg" + fLang))
Option Compare Database
Option Explicit
Private Const AppLanguage = "V"
Sub GetObjectCaption()
' This will get caption of all object and store in tblCaption
Dim frmObj As Form, SqlStr As String, CtrObj As Control, i As Long
' Delete all from caption table with form name stuff
SqlStr = "+D+e+lete * from tblCaption where ObjectID is null;"
CurrentDb.Execute Replace(SqlStr, "+", "")
For i = 0 To CurrentProject.AllForms.Count - 1
DoCmd.OpenForm CurrentProject.AllForms.Item(i).Name, acDesign, , , , acHidden
Set frmObj = Forms(CurrentProject.AllForms.Item(i).Name)
For Each CtrObj In frmObj.Controls
If TypeOf CtrObj Is Label Or TypeOf CtrObj Is CommandButton Then
SqlStr = "+I+NSERT I+N+TO tblCaption(ObjectID, MsgGroup, MsgID, MsgCapV) "
SqlStr = SqlStr + "V+A+LUES('" + frmObj.Name + "',1,'" + CtrObj.Name + "','" + CtrObj.Caption + "');"
CurrentDb.Execute Replace(SqlStr, "+", "")
End If
Next
' now for form/report caption
SqlStr = "I+N+SERT I+N+TO tblCaption(ObjectID, MsgGroup, MsgID, MsgCapV) "
SqlStr = SqlStr + "V+A+LUES('" + frmObj.Name + "',1,'FORM_OR_REPORT_NAME', '" + frmObj.Caption + "')"
CurrentDb.Execute Replace(SqlStr, "+", "")
DoCmd.Close acForm, frmObj.Name, acSaveNo
Next
ExitMe:
End Sub
Property Let SetObjInterface(CallObject As Object)
' This will set object face language at runtime rather than do this just one
'Dim iObj As Object
'Set iObj = CreateObject("ADODB.Recordset")
Dim iObj As New ADODB.Recordset, iCr As Control, Obj As Object, iCaption As String
Dim i As Long, fLang As String
fLang = AppLanguage
' Initialize interface recordset
iObj.Open Replace("+S+elect * f+rom tblCaption w+h+ere ObjectID='" & CallObject.Name & "';", "+", ""), CurrentProject.Connection
With iObj
' Set caption for the object
On Error GoTo ExitMe
' Now set caption for all the label in the object
While Not iObj.EOF
CallObject.Controls(.Fields("MsgID")).Caption = .Fields("MsgCap" & fLang)
CallObject.Controls(.Fields("MsgID")).FontName = "Tahoma"
CallObject.Controls(.Fields("MsgID")).FontSize = 10
If .Fields("MsgID") = "FORM_OR_REPORT_NAME" Then CallObject.Caption = .Fields("Msg" + fLang)
.MoveNext
Wend
.Close
Set Obj = Nothing
End With
ExitMe:
End Property
Function ToUnicode(txtString As String, Optional isReversed As Boolean = False, Optional isISO As Boolean = False) As String
' This function will do the conversion of text string into unicode
Dim iStr As String, repTxt As String, mText As String
Dim i As Long, J As Long
Dim iUnicode As Variant ' array to keep unicode char set
Dim iTCVN As Variant ' array to keep TCVN char set
Dim iProcList() As String ' array to keep what to convert
'parse the parameter into this local variable
iStr = txtString
mText = txtString
iUnicode = Array(225, 224, 7843, 227, 7841, 259, 7855, 7857, 7859, 7861, 7863, 226, _
7845, 7847, 7849, 7851, 7853, 233, 232, 7867, 7869, 7865, 234, 7871, 7873, 7875, _
7877, 7879, 237, 236, 7881, 297, 7883, 243, 242, 7887, 245, 7885, 244, 7889, 7891, _
7893, 7895, 7897, 417, 7899, 7901, 7903, 7905, 7907, 250, 249, 7911, 361, 7909, _
432, 7913, 7915, 7917, 7919, 7921, 253, 7923, 7927, 7929, 7925, 273, 193, 192, 195, _
258, 194, 212, 416, 431, 272)
iTCVN = Array(184, 181, 182, 183, 185, 168, 190, 187, 188, 189, 198, 169, 202, 199, 200, _
201, 203, 208, 204, 206, 207, 209, 170, 213, 210, 211, 212, 214, 221, 215, 216, 220, _
222, 227, 223, 225, 226, 228, 171, 232, 229, 230, 231, 233, 172, 237, 234, 235, 236, _
238, 243, 239, 241, 242, 244, 173, 248, 245, 246, 247, 249, 253, 250, 251, 252, 254, _
174, 193, 192, 195, 161, 162, 164, 165, 166, 167)
' Reenlarge the array
ReDim iProcList(1, 133)
' process the vowel only and covert to asc code
For i = 1 To Len(mText)
repTxt = Mid(mText, i, 1)
If AscW(repTxt) > 122 Then
iStr = Replace(iStr, repTxt, "[" & AscW(repTxt) & "]")
mText = Replace(mText, repTxt, " ")
' write the processed list
iProcList(1, J) = "[" & AscW(repTxt) & "]"
If isReversed Then
iProcList(0, J) = GetElementNo(AscW(repTxt), iUnicode)
Else
iProcList(0, J) = GetElementNo(AscW(repTxt), iTCVN)
End If
J = J + 1
End If
Next
If J = 0 Then
ToUnicode = txtString
Exit Function
End If
ReDim Preserve iProcList(1, J - 1)
' now convert to unicode
For i = 0 To UBound(iProcList, 2)
If isReversed Then
iStr = Replace(iStr, iProcList(1, i), ChrW(iTCVN(Val(iProcList(0, i)))))
Else
If isISO Then
iStr = Replace(iStr, iProcList(1, i), "&#" & iUnicode(Val(iProcList(0, i))) & ";")
Else
iStr = Replace(iStr, iProcList(1, i), ChrW(iUnicode(Val(iProcList(0, i)))))
End If
End If
Next
fExit:
ToUnicode = iStr
End Function
Private Function GetElementNo(iTxt As Long, iObj As Variant) As String
Dim i As Long
For i = 0 To UBound(iObj)
If iTxt = iObj(i) Then
GetElementNo = CStr(i)
Exit For
End If
Next
End Function
ledangvan > 08-09-15, 03:40 PM
paulsteigel > 08-09-15, 04:59 PM
ledangvan > 08-09-15, 05:54 PM
(08-09-15, 04:59 PM)paulsteigel Đã viết: Tớ có tí lỗi. Đoạn sau mình vẫn để hàm tounicode. Lúc nãy vội quên ko xoá đi. Văn bỏ hàm tounicode đó đi trong thủ tục setobjectinterface nhé.
Tớ xoá hàm trong bài trước rùi, Văn copy lại code là ok.