ledangvan > 06-09-15, 11:57 AM
tranthanhan1962 > 06-09-15, 02:45 PM
Private Sub Form_Load()
Controls(0).Caption = "ABC"
Controls(1).Caption = "DEF"
Controls(2).Caption = "GHI"
…
End Sub
ledangvan > 06-09-15, 04:17 PM
(06-09-15, 02:45 PM)tranthanhan1962 Đã viết: Theo mình hiểu bạn đang xử lý việc đổi font cho form từ .vni sang unicode. Việc này có 2 phần. Thay đổi font cho các control nhập giá trị như text box, combo box, list box và chuyển các caption của label, command button…sang unicode
Công việc thứ nhất rất dễ dàng: Chọn hết bằng Ctrl + A rồi chọn lại font.
Công việc thứ 2 có 2 cách.
1/ Mở Unikey Toolkit – chọn nguồn là TCVN3 (ABC), đích là Unicode. Double click vào các control cần thay đổi caption để quét đen caption đó Ctrl + C, Ctrl + Shift + F9, Ctrl + V. (Theo mình đây là phương pháp sửa trực tiếp nhanh nhất)
2/ Viết mã VBA cho event form load:
Mã:Private Sub Form_Load()
Controls(0).Caption = "ABC"
Controls(1).Caption = "DEF"
Controls(2).Caption = "GHI"
…
End Sub
Tất nhiên "ABC", "DEF", "GHI" … có mã font Unicode.
* Cũng có thể còn nhiều phương pháp khác hay hơn mà mình chưa biết…
paulsteigel > 06-09-15, 05:15 PM
(06-09-15, 04:17 PM)ledangvan Đã viết: ...Bạn thiết kế bổ sung 1 bảng tblCaption với 5 trường (hoặc đơn giản là import từ ứng dụng demoAuth trong bài về GoogleDrive của tôi ý)
C+re+at+eTa+ble tblCaption(ID Autonumber,ObjectID text(100),MsgGroup integer,MsgID text(100),MsgCapV memo,MsgCapE memo)
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
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 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
Noname > 06-09-15, 09:59 PM
paulsteigel > 07-09-15, 10:28 AM
ledangvan > 07-09-15, 11:25 AM
(06-09-15, 05:15 PM)paulsteigel Đã viết: Hơi khó chịu với cái bẫy SQL INJECTION của diễn đàn rồi. Tuấn có thể sửa cái đó dễ dàng mà. Bây giờ vBulletin nó đã có cơ chế lọc thông điệp inject rồi mà diễn đàn ta vẫn dùng cơ chế cũ quá. Cũ đến bực mình.
(06-09-15, 04:17 PM)ledangvan Đã viết: ...Bạn thiết kế bổ sung 1 bảng tblCaption với 5 trường (hoặc đơn giản là import từ ứng dụng demoAuth trong bài về GoogleDrive của tôi ý)
Thêm vào module một thủ tục thế nàyMã:C+re+at+eTa+ble tblCaption(ID Autonumber,ObjectID text(100),MsgGroup integer,MsgID text(100),MsgCapV memo,MsgCapE memo)
Thủ tục này sẽ đọc tất cả các form và duyệt các Buton, Label lấy thông tin của nó để đưa vào bảng. Sau khi thông tin được đưa hết vào bảng rồi thì dùng phép đơn giản xử lý nó sang Unicode và sau đó sử dụng thủ tục dưới đây để thiết lập giá trị.Mã: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
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
Đơn giản là gọi nó ở chỗ FormLoad với cú pháp SetObjInterface=me
Mã: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_REPORT_NAME" Then CallObject.Caption = .Fields("Msg" + fLang)
.MoveNext
Wend
.Close
Set Obj = Nothing
End With
ExitMe:
End Property
Cái này thì nó không chỉnh vĩnh viễn, nếu bạn muốn chỉnh vĩnh viễn thì tận dụng cái GetObjectCaption của tôi mà dùng.
paulsteigel > 07-09-15, 12:03 PM
(07-09-15, 11:25 AM)ledangvan Đã viết: ...
Dim iObj As New ADODB.Recordset, iCr As Control, Obj As Object, iCaption As String
Bạn giúp mình với
ledangvan > 07-09-15, 01:10 PM
(07-09-15, 12:03 PM)paulsteigel Đã viết:(07-09-15, 11:25 AM)ledangvan Đã viết: ...
Dim iObj As New ADODB.Recordset, iCr As Control, Obj As Object, iCaption As String
Bạn giúp mình với
Cụ ơi, cụ phải đặt tham chiếu (reference) đến đối tượng Microsoft ActiveX Data Object 2.x (vào phần soạn VBA, chọn tools/reference nhé.
Còn không thì cụ sửa chỗ đó thành Dim iObj as Object
Sau đó đặt tiếp lệnh.
Set iObj=CreateObject("ADODB.Recordset")
Có khi hôm nào cụ tranthanhnhan1962 viết giúp cho anh em một bài về các sử dụng đối tượng ActiveX và thiết lập tham chiếu trong code. Trong diễn đàn em thấy mọi người lập trình nhưng còn thiếu một phần căn bản trong cách khai thác các ActiveX hoặc trong cấu trúc chương trình.
Để tạm đặt gạch em xin phép trả lời trực tiếp cho bạn ledangvan trước.
Lập trình hướng đối tượng cho phép ta tương tác với các kho thư viện của Windows một cách rất thoải mái. Tuy nhiên, thoải mái không có nghĩa là không tuân thủ quy tắc.
Trong câu hỏi của bạn Văn có thể thấy lỗi chỉ ra ngay ở câu lệnh khai báo DIM. Điều đó có nghĩa là VBA không tạo ra đối tượng đó dược. Nói khác hơn là bị thiếu phần tham chiếu.
Túm lại:
Mặc định khi tạo một CSDL ứng dụng Access nó sẽ cho ta mấy tham chiếu mặc định trong đó có phần DAO và ADO để ta tương tác với các đối tượng truy cập dữ liệu.
Đôi khi có bạn không cần thì sẽ bỏ các tham chiếu đó và vì thế các câu lệnh dạng như
Dim xyz as New ADODB.REcordset hoặc abc as new Recordset sẽ bị lỗi ngay.
Tất nhiên để khai báo thế dược thì người ta phải tham chiếu đến bộ thư viện tương ứng.
Ví dụ để sử dụng ADODB người ta phải tham chiếu đến Microsoft Active Dataobjec các phiên bản 2.x
Với DAO thì phải tham chiếu đến Microsoft DAO 3.x
Nhóm kỹ thuật nói trên gọi là kỹ thuật Ràng buộc sớm (Early bind)
Nhóm thứ 2 là khai báo biến là đối tượng (Object) sau đó khởi tạo phiên làm việc bằng cách khởi tạo đối tượng thông qua lệnh CreateObject("Tên ứng dụng")
Kỹ thuật này gọi là Late bind (ràng buộc muộn)
Cả 2 kỹ thuật này đều ổn tuy nhiên với nhóm kỹ thuật thứ 2 thì bạn bắt buộc phải nhớ các thuộc tính của đối tượng. Không có chuyện gõ abc.Thuộc tính là VBA tự động đưa ra cho mình đâu.
Còn nhiều thứ nữa, giờ tạm thế đã. có gì bác TranthanhNhan giúp em với nhé
paulsteigel > 07-09-15, 01:22 PM