paulsteigel > 08-09-15, 08:00 PM
Sub PrintObjectType(frmObject as object)
Dim myObj as control
For each myObj in frmObject.Controls
Debug.print myObj.Name + vbTab + "Type: " + myObj.Type
Next
End Sub
ledangvan > 08-09-15, 10:37 PM
(08-09-15, 08:00 PM)paulsteigel Đã viết: Giờ la lúc tự nghiên cứu tẹo Văn nhé. Thử xem sao...
Cứ chỗ nào có cái font name thì nghiên cứu.
Nếu Văn muốn textbox một font khác thì cần thêm một lệnh if nữa...
Thử đi xem nào. Tớ cũng từng học theo cách ý.
Ngọc
Bây giờ phân tích bài một chút nhé...
Form/Report có các điều khiển (control)
Nếu muốn truy cập vào các điều khiển của form/report thì dùng Forms([Tênform]).Controls/Reports([Tên report]).Controls
Nói khác hơn Form/Report là một đối tượng có các đối tượng con - cái này người ta hay gọi là Collection (tập hợp) đối tượng không cùng kiểu.
Điều khiển thì có nhiều loại khác nhau. Muốn biết nói chung có các loại nào thì ta có thể dùng từ khóa TypeOf gõ thêm dấu cách trong màn hình soạn thảo VBA (cách củ chuối nhất).
(**) Toàn bộ kiểu các điều khiển của Access được định nghĩa trong Danh mục hàm AcControlType. Bạn chỉ cần nhấn F2 tại màn hình soạn thảo, gõ vào chữ AcControlType để tìm là thấy danh mục các kiểu điều khiển ở đó, nhấn vào một cái ví dụ acTextBox, bạm sẽ thấy nó hiện ở vùng định nghĩa cú pháp Const acTextBox = 109 (&H6D). Nói khác hơn, loại điều khiển TextBox trong Acess được quy định là hằng số có giá trị 109 (long)
Sơ sơ ta thấy danh sách một số như
Giờ tôi công khai vài điều khiển quan trọng như;
TextBox, CommandButton, Lable, ComboBox, ListBox, Frame, CheckBox, RadioButton ...vv
Có 2 cách kiểm tra loại điểu khiển
+ If TypeOf [Đối tượng] is TextBox = Nếu loại của đối tượng là TextBox.
Cách này chỉ dùng khi ta muốn trực tiếp truy cập đối tượng texbox
+ If [Đối tượng].Type=109 (xem chú thích ** ở trên).
Vậy túm lại, muốn biết quy định về điều khiển loại gì bạn có thể dùng cách như trong chú thích ở trên.
Còn nếu muốn biết ngay trong form của mình nó ra sao, bạn có thể dùng đoạn code sau.
Mã:Sub PrintObjectType(frmObject as object)
Dim myObj as control
For each myObj in frmObject.Controls
Debug.print myObj.Name + vbTab + "Type: " + myObj.Type
Next
End Sub
Đặt cái này trong Module và bạn có thể gọi bất kỳ từ form hay report nào thông qua một nút bấm bằng cách gọi PrintObjectType Me
Hãy lưu ý, lệnh Debug.Print rất có giá trị đối với dân lập trình. Nó sẽ hiển thị kết quả trên Cửa sổ Inmmediate ngay dưới phần soạn thảo code. Nếu không hiển thị, nhấn Ctrl+G nhé.
Các bạn sẽ cần sử dụng màn hình Immediate Window này nhiều đấy. Ví dụ chỉ cần gõ Debug.print CurrentProject.Path nhấn Enter là bạn biết Ứng dụng của bạn ở thư mục nào.
Quay lại câu hỏi của bạn. Hãy coi là bài tập nhé - mai tớ giả nhời. Giờ đang viết trên ô tô nên không viết dài được...
Chúc bạn làm bài tập tốt.
If TypeOf CtrObj Is Label Or TypeOf CtrObj Is TextBox Then
SqlStr = "+I+NSERT I+N+TO tblCaption(ObjectID, MsgGroup, MsgID, MsgCapV) "
[u][color=#ffcc66] SqlStr = SqlStr + "V+A+LUES('" + frmObj.Name + "',1,'" + CtrObj.Name + "','" + CtrObj.Caption + "');"[/color][/u]
CurrentDb.Execute Replace(SqlStr, "+", "")
End If
paulsteigel > 08-09-15, 10:56 PM
(08-09-15, 10:37 PM)ledangvan Đã viết: ...
Sub PrintProperty(FrmObj As Object)
Dim Ctrl As Control, prpBag As Property
For Each Ctrl In FrmObj.Controls
For Each prpBag In Ctrl.Properties
Debug.Print prpBag.Name & vbTab & ": " & prpBag.Value
Next
Next
End Sub
ledangvan > 09-09-15, 10:25 AM
(08-09-15, 10:56 PM)paulsteigel Đã viết:(08-09-15, 10:37 PM)ledangvan Đã viết: ...
Văn phải đăng cả mã lỗi lên cơ.
Dưng mà quên. Các điều khiển có thuộc tính khác nhau vì thế không thể áp dụng chung được.
Ví như: Caption thì textbox không có mà chỉ Label, Button, Frame ... có.
Với textbox thì phải là text.
Với bài này thì Văn đọc kỹ bài của tớ rồi tự tìm hiểu thêm tí nữa - mai tớ giả nhời với một bài viết đầy đủ hơn.
Lỗi phát sinh là do bạn dùng sai Thuộc tính (property) hehe
Đoạn code sau để hiển thị các loại thuộc tính và giá trị của các đối tượng trên một form/Report chỉ cần gọi PrintProperty Me trong form là xong (nhớ thêm thủ tục PrintProperty và Module nhé)
Mã:Sub PrintProperty(FrmObj As Object)
Dim Ctrl As Control, prpBag As Property
For Each Ctrl In FrmObj.Controls
For Each prpBag In Ctrl.Properties
Debug.Print prpBag.Name & vbTab & ": " & prpBag.Value
Next
Next
End Sub
paulsteigel > 09-09-15, 02:48 PM
Option Compare Database
Option Explicit
Const AppLanguage = "V"
' Khai bao mot so thiet lap ve phong chu mac dinh cua Button va Textbox
Private Const DefaultFontTextbox = "Arial"
Private Const DefaultFontButton = "Tahoma"
Private Const DefaultFontSizeButton = 10
Sub GetObjectCaption()
' Thu tuc nay se lay caption cua cac dieu khien trong tat ca cac form/ report
' doi font chu cua textbox/ label, nut bam sang Tahoma hoac Arial hoac TimeNewRoman
Dim FrmObj As Form, SqlStr As String, CtrObj As Control, i As Long
' Delete all current record at tblCaption form
SqlStr = "+D+E+LETE * +F+ROM tblCaption Where ObjectId is not null;"
CurrentDb.Execute Replace(SqlStr, "+", "")
' Mo tat ca cac Form/Report
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, "+", "")
ElseIf TypeOf CtrObj Is TextBox Then
' doi luon font chu cua textbox
CtrObj.FontName = DefaultFontTextbox
ElseIf TypeOf CtrObj Is ComboBox Or TypeOf CtrObj Is ListBox Then
' cua combo box hoac listbox nua nhe ... tat nhien con nhieu doi tuong khac nua
CtrObj.FontName = DefaultFontButton
End If
Next
' Gio lay thiet lap tieu de cua form/ bao cao
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, "+", "")
' Luu lai ket qua acSaveYes= Luu lai, acSaveNo bang khong luu
DoCmd.Close acForm, FrmObj.Name, acSaveYes
Next
ExitMe:
End Sub
ledangvan > 09-09-15, 04:00 PM
(09-09-15, 02:48 PM)paulsteigel Đã viết: Văn không nên hốt, tôi cũng học Ngoại thương ra mà. Có chăng có thể là do tôi đọc được tiếng Anh. Mà giờ cũng chả quan trọng, có công cụ google dịch thì cũng dễ hơn nhiều. Ngày trước, thày của tôi là phím F1.
Trở lại bài của Văn, tôi sửa thủ tục GetObjectCaption để nó đổi font chữ của textbox luôn nhé. Bạn nên theo dõi mã nguồn của thủ tục này và phân tích cấu trúc lệnh của nó. Đố bạn biết trong thủ tục này có một cái tôi nói là có tính năng đó mà Code lại không có?
Mã:Option Compare Database
Option Explicit
Const AppLanguage = "V"
' Khai bao mot so thiet lap ve phong chu mac dinh cua Button va Textbox
Private Const DefaultFontTextbox = "Arial"
Private Const DefaultFontButton = "Tahoma"
Private Const DefaultFontSizeButton = 10
Sub GetObjectCaption()
' Thu tuc nay se lay caption cua cac dieu khien trong tat ca cac form/ report
' doi font chu cua textbox/ label, nut bam sang Tahoma hoac Arial hoac TimeNewRoman
Dim FrmObj As Form, SqlStr As String, CtrObj As Control, i As Long
' Delete all current record at tblCaption form
SqlStr = "+D+E+LETE * +F+ROM tblCaption Where ObjectId is not null;"
CurrentDb.Execute Replace(SqlStr, "+", "")
' Mo tat ca cac Form/Report
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, "+", "")
ElseIf TypeOf CtrObj Is TextBox Then
' doi luon font chu cua textbox
CtrObj.FontName = DefaultFontTextbox
ElseIf TypeOf CtrObj Is ComboBox Or TypeOf CtrObj Is ListBox Then
' cua combo box hoac listbox nua nhe ... tat nhien con nhieu doi tuong khac nua
CtrObj.FontName = DefaultFontButton
End If
Next
' Gio lay thiet lap tieu de cua form/ bao cao
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, "+", "")
' Luu lai ket qua acSaveYes= Luu lai, acSaveNo bang khong luu
DoCmd.Close acForm, FrmObj.Name, acSaveYes
Next
ExitMe:
End Sub
paulsteigel > 09-09-15, 05:22 PM
ledangvan > 09-09-15, 05:33 PM
paulsteigel > 09-09-15, 09:11 PM
paulsteigel > 09-09-15, 09:15 PM