Гость
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как узнать, передан ли аргумент в процедуру? / 11 сообщений из 11, страница 1 из 1
22.04.2018, 21:09
    #39634395
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, передан ли аргумент в процедуру?
Всем привет

Ыы... понадобилось узнать при выполнении процедуры передан ли в неё необязательный аргумент
Например:

Public Sub Открыть_форму_Команды(Optional ByRef фильтр As Boolean)

Дело в том, что в случае вызова процедуры без аргумента, он всё равно будет равен False. А мне надо знать точно, указан он или нет.

Заранее спасибо
...
Рейтинг: 0 / 0
23.04.2018, 07:38
    #39634472
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, передан ли аргумент в процедуру?
Настаевмне надо знать точно, указан он или нет.Это невозможно. Optional параметр всё равно формируется, вне зависимости от того, указан он в операторе вызова или нет - это тебе не ParamArray. И поэтому в момент старта процедуры он существует в обязательном порядке. И нет возможности определить, имеет он значение по умолчанию, или это присвоенное.
...
Рейтинг: 0 / 0
23.04.2018, 08:58
    #39634496
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, передан ли аргумент в процедуру?
Вместо определенного типа задаете параметр типа Variant, тогда сможете точно отпределить, что он не был передан функцией IsMissing. Если все же нужны определенные типы, то присваиваете определенное значение по умолчанию, обозначающее, что параметр не был передан. Например я в подобных случаях для строковой переменной задаю Optional strParm As String = "{Missing}". Для подобного фокуса с Boolean приходится заменять на свой тип с неизвестным состоянием. Но лучше все же variant, но тогда в процедуре желательно проверять тип переданного параметра перед использованием, чтобы избежать ошибок.
...
Рейтинг: 0 / 0
23.04.2018, 09:18
    #39634508
studieren
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, передан ли аргумент в процедуру?
Настаев,

Если тип данных Variant, то можно использовать функцию IsMissing и узнать, передано ли значение аргумента.
Ну а если тип данных String, то можно использовать StrPtr для этих же целей.
Если же тип Object, то можно проверить Is Nothing.
...
Рейтинг: 0 / 0
23.04.2018, 09:52
    #39634533
MrShin
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, передан ли аргумент в процедуру?
studierenНу а если тип данных String, то можно использовать StrPtr для этих же целей.
Если же тип Object, то можно проверить Is Nothing.
Эти способы ненадежны, т.к. если параметр не будет пропущен, но будет передана неинициализированная строка, то StrPtr также вернет 0, как и при пропущеном параметре. То же самое и с объектом, передача объекта Nothing - это вполне обычная ситуация, определить нельзя достоверно, был ли он опущен.
...
Рейтинг: 0 / 0
23.04.2018, 14:27
    #39634794
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, передан ли аргумент в процедуру?
1 способ. тип изменить на byte, а в boolean преобразовывать уже в процедуре, например по правилу, если 0-параметр не передавался, -1 true, 1-false, или ещё как..
2 способ.поставить другой параметр, и при присваивании значения optional параметру ставить этот параметр в true
...
Рейтинг: 0 / 0
23.04.2018, 17:18
    #39634925
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, передан ли аргумент в процедуру?
Спасибо всем за идеи
очень полезная инфа :) ща буду прикручивать
...
Рейтинг: 0 / 0
23.04.2018, 17:56
    #39634963
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, передан ли аргумент в процедуру?
MrShinВместо определенного типа задаете параметр типа Variant, тогда сможете точно отпределить, что он не был передан функцией IsMissing. Если все же нужны определенные типы, то присваиваете определенное значение по умолчанию, обозначающее, что параметр не был передан. Например я в подобных случаях для строковой переменной задаю Optional strParm As String = "{Missing}". Для подобного фокуса с Boolean приходится заменять на свой тип с неизвестным состоянием. Но лучше все же variant, но тогда в процедуре желательно проверять тип переданного параметра перед использованием, чтобы избежать ошибок.

Спасибо, друг
я изменил тип аргумент на Variant , проверил с помощью isMissing и преобразовал в Boolean c помощью CBool
Всё заиграло новым красками ))
...
Рейтинг: 0 / 0
24.04.2018, 06:34
    #39635093
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, передан ли аргумент в процедуру?
НастаевMrShinВместо определенного типа задаете параметр типа Variant, тогда сможете точно отпределить, что он не был передан функцией IsMissing. Если все же нужны определенные типы, то присваиваете определенное значение по умолчанию, обозначающее, что параметр не был передан. Например я в подобных случаях для строковой переменной задаю Optional strParm As String = "{Missing}". Для подобного фокуса с Boolean приходится заменять на свой тип с неизвестным состоянием. Но лучше все же variant, но тогда в процедуре желательно проверять тип переданного параметра перед использованием, чтобы избежать ошибок.

Спасибо, друг
я изменил тип аргумент на Variant , проверил с помощью isMissing и преобразовал в Boolean c помощью CBool
Всё заиграло новым красками ))

Единственное, что утаил от народа тредстартер: зачем это может понадобиться?

ЗЫ. Вот понапрограммируют такие горе-программисты - а потом, разгребай...
...
Рейтинг: 0 / 0
24.04.2018, 10:39
    #39635171
alecko
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, передан ли аргумент в процедуру?
aleks222, ну это то просто, учитывая название процедуры и явно указанное byref являющееся умолчальным - он использует форму в разных режимах, переменную возвращает, если форма является подчиненной, например.
...
Рейтинг: 0 / 0
25.04.2018, 20:11
    #39636353
Настаев
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как узнать, передан ли аргумент в процедуру?
Фанатзёры ))
Я процедуру с потолка написал, чтобы вопрос понятней был

А нужно мне это вот зачем...
Я написал xml-файлы для создания своей ленты в Access. Чтобы элемент управления (кнопка, например) среагировал на нажатие, там прописано следующее:
onAction="Название_процедуры"
Разумеется, что для каждой кнопки создана своя процедура. Я поставил себе цель проверять перед запуском любой процедуры выполнять какие-то одинаковые действия. Например, проверить права пользователя. Чтобы не вставлять эту проверку в каждую из процедур, я создал одну единственную, которая запускается при нажатии на любую из кнопок ленты.

Так вот...
Эта единственная процедура делает, что ей надо и только потом запускает следующую методом Run "control.id" , где control.id совпадает с названием запускаемой процедуры. Поскольку некоторые из кнопок являются переключателями, они требуют передачи аргумента Pressed. Для них нужен вызов с аргументом. Вот так: Run "control.id" , pressed

Я думаю, что удовлетворил ваш интерес
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Как узнать, передан ли аргумент в процедуру? / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]