Sub для добавления элементов управления работает при вызове из одного sub, но из другого - PullRequest
0 голосов
/ 26 июня 2019

Я получаю ошибку, которую просто не могу понять. Я написал подпрограмму, которая открывает форму в режиме конструктора, удаляет все динамические элементы управления, а затем добавляет запрошенный номер.

Подсказка вызывается двумя разными способами. Пользователь, открывающий форму (через форму главного меню), чтобы заполнить новую форму (чтобы динамические элементы управления были удалены, а затем воссозданы) ИЛИ после создания формы, пользователь может нажать кнопку на форме добавить больше строк элементов управления. Как в главном меню, так и в форме кнопок вызывается одна и та же подпрограмма, НО при нажатии кнопки код застревает, и возникает ошибка 29054 ' Microsoft Access не может добавлять, переименовывать или удалять элементы управления. ) вы просили. 'брошено. Кнопка для отладки деактивирована, поэтому я не вижу, какая строка на самом деле застревает, но когда я перехожу через код, это последняя строка перед появлением ошибки (последний блок отступа в контексте ниже):

    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 выполняет итерацию правильно, так как я вижу, как он захватывает высоту элемента управления последнего динамического элемента управления.

1 Ответ

2 голосов
/ 26 июня 2019

Вы не можете сделать это.Форма или отчет может содержать только определенное количество элементов управления, удаленных или нет, поэтому - в конечном итоге - он не будет принимать больше элементов управления.На этом этапе вы должны заново создать форму.

Поэтому не удаляйте элементы управления.Создайте те, которые вам могут понадобиться, и в любой момент скройте ненужные и переименуйте остальные, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...