OpenArgs является нулевой ошибкой - PullRequest
8 голосов
/ 03 ноября 2008

Я использую параметр OpenArgs для отправки значения при использовании DoCmd.OpenForm:

DoCmd.OpenForm "frmSetOther", acNormal, , , acFormAdd, acDialog, "value"

Затем я использую Me.OpenArgs внутри открытой формы, чтобы получить значение . Иногда вместо исходной строки отправляется значение Null . Что не так?

Ответы [ 7 ]

23 голосов
/ 03 ноября 2008

Это часто происходит во время разработки, когда форма уже противоположна (например, в режиме редактирования), и вы вызываете функцию docmd.OpenForm. В этом случае форма переводится в обычный режим (просмотр) и генерируются события OnOpen и OnLoad, но свойство OpenArgs имеет значение null, независимо от того, что вы передали docmd.OpenForm.

Очевидно, что решение состоит в том, чтобы закрыть форму, прежде чем вызывать ее с помощью docmd.OpenForm. Однако есть обходной путь, который мне нравится использовать. В событии OnOpen я проверяю, является ли me.OpenArgs нулевым, и если это так, я заменяю его некоторыми значениями отладки.

if not isnull(me.OpenArgs) then
   myvalue = me.OpenArgs
else
   msgbox "Debug mode"
   myValue = "foo"
endif
8 голосов
/ 14 октября 2012

У меня просто была эта проблема. Строка Arg не была передана, поскольку отчет уже был открыт, но не виден. Он был оставлен открытым, когда произошел сбой кода с Null string error.

Решение состояло в том, чтобы закрыть отчет в ближайшем окне, с

Docmd.Close acReport, "myReport"

Это исправило мою ошибку, и аргументы были переданы правильно.

2 голосов
/ 03 ноября 2008

Очень интересной альтернативой этому аргументу "openArgs" является использование коллекции .properties объекта currentProject.allforms ("myFormName"). Если вам нужно передать значение в форму (например, фильтр, унаследованный от другого элемента управления или другой формы), просто добавьте соответствующее свойство для вашей формы и добавьте свое значение в это свойство.

Пример:

addPropertyToForm "formFilter","Tbl_myTable.myField LIKE 'A*'",myFormName

Вызываемая функция попытается обновить значение свойства "formFilter" объекта. Если свойство не существует (возникает ошибка 2455), оно будет добавлено как новое свойство в код управления ошибками.

Function addPropertyToForm(_ 
    x_propertyName as string, _
    x_value As Variant, _
    x_formName As String) 
As Boolean

On Error GoTo errManager
CurrentProject.AllForms(x_formName).Properties(x_propertyName).Value = x_value
addPropertyToForm = True
On Error GoTo 0

Exit Function

errManager:
If Err.Number = 2455 Then
    CurrentProject.AllForms(x_formName).Properties.Add x_propertyName, Nz(x_value)
    Resume Next
Else
    msgbox err.number & ". The property " & x_propertyName & "was not created"
End If

End Function 
1 голос
/ 07 сентября 2017

Возможно, ваша форма уже открыта (как предложено), но просто проверьте на нулевое значение, и форма также будет обрабатывать открытие с отсутствующими аргументами.

Это позволит открыть форму для быстрого просмотра (вами или пользователями), если аргументы не являются жизненно важными.

Private Sub Form_Open(Cancel As Integer)
    If Not IsNull(Me.OpenArgs) Then
        Me.lblHeading.Caption = Me.OpenArgs
    End If
End Sub

Нулевое значение можно передать в OpenArgs, пропустив значение в вызове OpenForm или дважды щелкнув форму на боковой панели «Объекты доступа».


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

То же самое можно, конечно, сделать для всех форм, не только для модальных, и тогда вам не понадобится проверка нуля (при условии, что вы никогда не передадите ей ноль). Но часто в проекте много форм и даже больше вызовов OpenForm, чем форм ...

0 голосов
/ 02 мая 2009

Ответьте здесь. Ваша форма может быть уже открыта, даже в режиме «Дизайн»: http://www.tech -archive.net / Архив / Access / microsoft.public.access.formscoding / 2007-02 / msg00928.html

0 голосов
/ 03 ноября 2008

Я думаю, что нашел ответ на свою проблему:

По моему опыту, OpenArgs должен обрабатываться сразу после открытия формы. (ссылка)

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

0 голосов
/ 03 ноября 2008

Значение взято из пользовательского завершенного контроля? Вы гарантируете, что фокус перемещен от контроля прежде, чем Вы запустите линию openform?

РЕДАКТИРОВАТЬ: свойство value элемента управления будет равно предыдущему значению, которое может быть нулевым, если вы не сделаете это.

...