如何在Microsoft Access中使用VB代码在运行时创建控件?经过一番挖掘后,我发现使用CreateControl
函数可以实现这一点。问题是我在网上找到的每个随机论坛都有类似的代码:
Private Sub Button_Click()
Call AddLabel
End Sub
Function AddLabel()
Set ctl = CreateControl("MyForm", acLabel, acDetail, "", "", 0, 0, 100, 100)
With ctl
.name = "myTextBox"
.Caption = "Hello World!"
.Height = 50
.Width = 100
.FontSize = 11
.Visible = True
End With
End Function
但此代码似乎没有创建可见标签。
就我而言,我只是想学习如何让它发挥作用。所以我创建了一个带有按钮的空白表单,单击该按钮将创建一个标签,表示" Hello world!"。我期待发生的是当单击按钮时,文本框将显示在表单的左上角。我很好奇是否有人可以帮我展示一些实际可行的代码的简单示例。
在我知道之前,有人说我可以创建一个标签并隐藏它,然后更改其可见性属性。但是我想知道如何动态创建控件,让这个简单的例子实际工作将极大地帮助我理解。
答案 0 :(得分:4)
您需要的文档在这里(这些是专门用于Access VBA):
根据文件记载,这个功能有一些很大的局限性:
由于存在这些限制,除非您最初使用设计表单,否则它是不可取的。
重复问题:How do you dynamically create controls on a MS Access form?
根据OP的建议,这是我的测试代码,它能够添加40个控件并重复该过程50次而不超过754限制(我在测试中重复使用了40个名字)。
警告1 这是不可取的,因为它只能在设计视图中完成,而这在mde / accde中不起作用。
警告2 :它在多用户环境中的表现值得怀疑。
此代码来自带有两个按钮的表单。它打开了第二个名为" Form2"
Option Compare Database
Option Explicit
Private Const FORM_NAME As String = "Form2"
Private m_nCounter As Long
Private Sub cmdCreate_Click()
runDynamicForm
End Sub
Private Sub cmdRepeat_Click()
Dim n As Long
m_nCounter = 0
For n = 0 To 50
runDynamicForm
DoEvents
DoCmd.Close acForm, FORM_NAME, acSaveNo
DoEvents
Next 'n
MsgBox m_nCounter
End Sub
Private Sub runDynamicForm()
Const DYNAMIC_TAG As String = "dynamic"
Dim n As Long
Dim frm As Form
Dim ctl As Access.Control
On Error GoTo EH
Application.Echo False
DoCmd.OpenForm FORM_NAME, acDesign
Set frm = Application.Forms(FORM_NAME)
For n = frm.Controls.Count - 1 To 0 Step -1
Set ctl = frm.Controls(n)
If ctl.Tag = DYNAMIC_TAG Then
Application.DeleteControl FORM_NAME, ctl.Name
End If
Next 'n
For n = 1 To 20
With Application.CreateControl(FORM_NAME, acLabel, acDetail, , , 400, n * 300, 1500, 300)
.Name = "lbl" & n
.Caption = "Question " & n
.Visible = True
.Tag = DYNAMIC_TAG
End With
With Application.CreateControl(FORM_NAME, acTextBox, acDetail, , , 2000, n * 300, 3000, 300)
.Name = "txt" & n
.Visible = True
.TabIndex = n - 1
.Tag = DYNAMIC_TAG
End With
m_nCounter = m_nCounter + 2
Next 'n
DoCmd.Close acForm, FORM_NAME, acSaveYes
DoCmd.OpenForm FORM_NAME, acNormal
GoTo FINISH
EH:
With Err
MsgBox "Error:" & vbTab & .Number & vbCrLf _
& "Source" & vbTab & .Source & vbCrLf _
& .Description
End With
FINISH:
Application.Echo True
End Sub
答案 1 :(得分:1)
我接受了上传代码并将其简化为长篇大论,并将其转换为一个示例代码供我将来使用。希望它能帮助将来的某个人。
fail()
答案 2 :(得分:-1)
每当我尝试运行您的代码时,我都会遇到运行时错误:
运行时错误' 6062':
您必须处于“设计”或“布局视图”中才能创建或删除控件。
基于该信息,似乎在运行时动态创建控件似乎不可能。
答案 3 :(得分:-1)
您可能只缺少apt-file update && sudo apt-get install `apt-file search mono.pc --package-only`
,这是一个关于如何在运行时动态创建表单,数据绑定和创建控件的示例。
DoCmd.Restore