当从一个子调用但另一个子调用时添加控件的子工作

Posted

技术标签:

【中文标题】当从一个子调用但另一个子调用时添加控件的子工作【英文标题】:Sub to add controls works when called from one sub but the other 【发布时间】:2019-06-26 11:43:36 【问题描述】:

我遇到了一个我无法弄清楚的错误。我写了一个子程序,在设计视图中打开一个表单,删除所有动态控件,然后添加请求的数字。

sub 以两种不同的方式被调用。用户打开表单(通过主菜单表单)填写新表单(删除动态控件然后重新创建)创建表单后,用户可以单击表单以添加更多的控件行。主菜单和按钮窗体都调用相同的子菜单,但是当单击按钮时代码卡住并且错误 29054 'Microsoft Access 无法添加、重命名或删除控件( s) 你请求的。' 被抛出。调试按钮已停用,因此我看不到实际卡住的是哪一行,但是当我单步执行代码时,这是弹出错误之前的最后一行(下面上下文中的最后一个缩进块):

    With Application.CreateControl("BOM5", acComboBox, acDetail, frm.Controls("Tabs").Pages(PageNum).Name, , ChangeTypeLeft, LastControlTop, ChangeTypeWidth, ControlHeight)

其余代码如下。

    DoCmd.OpenForm "BOM5", acDesign
    Set frm = Application.Forms("BOM5")

    ' Cycle through controls and set LastControlTop based on the last dynamic control, if any
    For i = 0 To frm.Controls.Count - 1
        Set ctl = frm.Controls(i)
        Debug.Print ctl.Name
        If ctl.Tag Like DYNAMIC_TAG & "*" Then
            If ctl.ControlType = acComboBox Or ctl.ControlType = acTextBox Then
                LastControlTop = ctl.Top + ControlHeight + ControlPadding
                FormRowCount = FormRowCount + 1
            End If
        Else
            FormRowCount = (FormRowCount / 6) + 1      ' Convert number of fields to number of rows then add one to start new batch of controls

            Exit For
        End If
    Next

    PageNum = frm.Controls("Tabs").Pages.Count - 1      ' .Pages has an index of 0. Getting PageNum to follow suit with the -1

    ' Add controls for inputting parts
    For FormRowCount = FormRowCount To NewControlCount
        With Application.CreateControl("BOM5", acComboBox, acDetail, frm.Controls("Tabs").Pages(PageNum).Name, , ChangeTypeLeft, LastControlTop, ChangeTypeWidth, ControlHeight)
            .Name = "ChangeType" & FormRowCount
            .Tag = DYNAMIC_TAG
            .RowSourceType = "Table/Query"
            .RowSource = "ChangeType"
        End With

最后一个 for 循环有 5 个其他 With Application.CreatControl 语句,但我只展示了第一个。其他 5 个类似,除了文本框而不是组合。

我以前遇到过这个错误,但我认为我通过将 DoCmd.OpenForm 语句移动到代码的不同部分来解决它(比如在 if 语句或 for 循环之外或不允许它得到的地方称为),但我认为这不会解决它。此外,第一个 for 循环可以正确迭代,因为我看到它抓住了最后一个动态控件的控件高度。

【问题讨论】:

在您的代码中,我没有看到删除现有控件的尝试。当您使用按钮运行 Sub 时,您确定应该创建的控件不存在吗? 糟糕,忘了包括那个位。删除是在一个单独的子中。最初它在同一个子中,但是当我添加按钮时将其拆分,这样我就不会删除我想添加到的控件。我想我倾向于忘记我拆分了操作。 【参考方案1】:

你不能这样做。表单或报表只能包含一定数量的控件,无论是否删除,因此 - 最终 - 它不会接受更多控件。此时,您必须从头开始重新创建表单。

所以,不要删除控件。创建您可能需要的内容,并随时隐藏不需要的内容,并在必要时重命名其余内容。

【讨论】:

除非我能做到。我知道访问最多有 255 个控件,但是由于我的控件具有相同的名称,我想,我可以解决这个问题。在几天的时间里,我多次创建、删除和重新创建 160 个控件来测试这个限制。 总而言之,在这种特殊情况下,我可以在从主菜单打开时创建 10 个控件。但是,如果我创建 5 个控件,然后尝试再添加 5 个,我会收到错误消息。所以我不认为我的问题是这个限制。 远不止255,但是想不起来这个数字了。无论如何,删除和重新创建是一个完全停止的死胡同。 @Gustav 完全正确!!!尝试将您的表单保存到文件SaveAsText acForm ,"FormName","c:\tempFormFile" 并查看与ItemSuffix = 的行。这是永远不会递减的内部访问计数器。但是你可以做这样的解决方法:1.保存表单SaveAsText acForm ,"FormName","c:\tempFormFile" 2.打开文件和2.1。删除行Checksum = .... 2.2。将ItemSuffix = 设置为任何保存值 2.3。保存文件 3. 加载它以访问LoadFromText acForm ,"FormName","c:\tempFormFile" . 看起来在 Access2010 上这个限制被移除了。 Access 使用负数命名,例如 Label-32767

以上是关于当从一个子调用但另一个子调用时添加控件的子工作的主要内容,如果未能解决你的问题,请参考以下文章

调用removeFromSuperview后如何防止子视图释放自我?

willAnimateRotationToInterfaceOrientation 未在一个子视图中调用,而另一个子视图可见并已旋转

在 GAS 中进行系统调用并在 .data 部分中使用变量并访问它们以在另一个子例程中进行系统调用

将变量从一个子传递到另一个

qt全局对象删除

Excel VBA - 将类方法的名称传递给另一个子例程以调用该方法