Đánh giá chủ đề:
  • 0 Votes - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Hỏi cách đổi Font hàng loạt trên Form ?
#1
Tôi làm một phần  mềm có rất nhiều Form trên Form ngày xưa đã chót đánh bằng Font .vntime nay muốn đổi toàn bộ thành font Unicode. Có bác nào có cách nào chuyển đổi nhanh không chỉ giúp với (Tôi cứ phải mở từng Form và sửa chữa). Xin chân thành cảm ơn.
Chữ ký của ledangvan Xin chào, mình là ledangvan, Tham gia http://thuthuataccess.com/forum từ ngày 22-08 -11.
ღღღღღTài sản của ledangvan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#2
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…
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 ledangvan
#3
(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…

 Em hỏi là việc thứ nhât thôi tuy nhiên phải mở từng form ra và tiến hành chỉnh sửa từng cái, trong Form lại có nhiều label có Font khác (ví dụ .vntimeH - chữ in hoa) nhưng em chỉ muốn đổi các label, text box ... có font .vntime thường thành Unicode thôi
Chữ ký của ledangvan Xin chào, mình là ledangvan, Tham gia http://thuthuataccess.com/forum từ ngày 22-08 -11.
ღღღღღTài sản của ledangvan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#4
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 ý)
Mã:
C+re+at+eTa+ble tblCaption(ID Autonumber,ObjectID text(100),MsgGroup integer,MsgID text(100),MsgCapV memo,MsgCapE  memo)
Thêm vào module một thủ tục thế này
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
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ị.
Đơ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.
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 tranthanhan1962 , ledangvan , Noname , maidinhdan , Minh Tiên
#5
Cái này do thằng host của VDC nó lọc anh Ngọc ui. Em gọi nó thì nó bảo đã tắt Sercurity_mod rồi. Mà không hiểu sao vẫn chặn. Gần hết hạn host, chắc em không ký hợp đồng với nó nữa mà chuyển sang 1 nhà cung cấp khác quá! sad
Chữ ký của Noname 020
ღღღღღTài sản của Noname (View All Items) ღღღღღ
Reply
Những người đã cảm ơn paulsteigel
#6
Cảm ơn Tuấn,
Hôm qua tớ chỉ bức mỗi tí sau đó lên xe giờ mới tới nơi. Tuấn vất vả duy trì diễn đàn quá. Tớ đang nghĩ hay là chuyển quách sang sang host tại gia. Tớ nghĩ với đường truyền up/down 14M trong nước thì host được nhẩy! Kinh phí duy trì diễn đàn hiện nay chắc chỉ mình Tuấn đang đương đầu. Nghĩ cũng là một món. Xin cảm ơn Tuấn.

Nếu Tuấn đồng ý - tớ sẵn sàng host - tớ có máy chủ và đường cáp quang 14M (Fiber2Home). Hạ tầng map IP tớ giải quyết được Tuấn nghĩ sao?
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 Noname , Minh Tiên
#7
(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 ý)
Mã:
C+re+at+eTa+ble tblCaption(ID Autonumber,ObjectID text(100),MsgGroup integer,MsgID text(100),MsgCapV memo,MsgCapE  memo)
Thêm vào module một thủ tục thế này
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
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ị.
Đơ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.

Bạn paulsteigel ơi mình copy cái của bạn vào khi chạy load form nó bảo lỗi ở đoạn :

 Dim iObj As New ADODB.Recordset, iCr As Control, Obj As Object, iCaption As String

Bạn giúp mình với
Chữ ký của ledangvan Xin chào, mình là ledangvan, Tham gia http://thuthuataccess.com/forum từ ngày 22-08 -11.
ღღღღღTài sản của ledangvan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#8
(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é
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 ledangvan , Noname , maidinhdan , tranthanhan1962 , Minh Tiên
#9
(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é

Hì, bác paulsteigel thông cảm mình là dân không chuyên nên mới hỏi ngu ngơ vậy, mình là dân kế toán do công việc nên cũng táy máy chút ít để làm cái phần mềm phục vụ công việc cho riêng mình, có gì hỏi sai sai  014  mong bác thông cảm nhé 015
Chữ ký của ledangvan Xin chào, mình là ledangvan, Tham gia http://thuthuataccess.com/forum từ ngày 22-08 -11.
ღღღღღTài sản của ledangvan (View All Items) ღღღღღ
Reply
Những người đã cảm ơn
#10
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é
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 ledangvan , Noname , tranthanhan1962 , Minh Tiên


Có thể liên quan đến chủ đề
Chủ đề: Tác giả Trả lời: Xem: Bài mới nhất
  Cách đề tạo Combo Box và List Box Tương ứng Godspear 9 306 08-12-16, 03:44 PM
Bài mới nhất: toancvp
  [Hỏi] Refresh Form và tiếp tục hoạt động Godspear 2 84 08-12-16, 12:48 PM
Bài mới nhất: Godspear
  [Hỏi] Cách thêm dữ liệu vào form Main_Sub NganNguyen 1 39 06-12-16, 02:23 AM
Bài mới nhất: maidinhdan
  Tự động hiện Form khi loading hết thời gian ChiMai 1 49 02-12-16, 08:59 PM
Bài mới nhất: ongke0711
Photo [Hỏi] Mở Form trên access 2007 báo lỗi jason 5 195 22-11-16, 09:23 AM
Bài mới nhất: jason

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ơ