Как проверить, что Optional параметр передан?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Как проверить, что Optional параметр передан?

Сообщение Leon_ » 25.06.2004 (Пт) 17:52

Помогите разобраться?

В объявлении функции использую Optional параметры:
Код: Выделить всё
Public Function AnyFunction(Optional ByVal nTest as Long, Optional ByVal dtDate As Date) as Boolean
        If (IsMissing(nTest)) then
                   . .. . . . . . ..
        End if

        If (IsMissing(dtDate)) then
                   . .. . . . . . ..
        End if
End Function

И вызываю все это через Call AnyFunction(), т.е. параметры опускаю.
При проверке (IsMissing(nTest)) получается True, а (IsMissing(dtDate)) выдает False. (?!) Оказывается что dtDate уже имеет значение =0:00:00 .
Что это за явление? Это только у меня так или это штатное поведение?

Samovar
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 111
Зарегистрирован: 23.05.2004 (Вс) 8:13

Сообщение Samovar » 25.06.2004 (Пт) 18:29

Да нет - у меня вообще IsMissing возвращает False. Можно поставить какую-нибудь глупость, напр.:
Optional ByRef dtDate As Date = CDate("01.04.1900")
и потом вместо IsMissing проверять year(dtDate)...
Ученье - свет, неученых - тьма.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 25.06.2004 (Пт) 18:50

Код: Выделить всё
Public Function test( _
    Optional ByVal v As Variant, _
    Optional ByVal i As Long, _
    Optional ByVal d As Date, _
    Optional ByVal s As String _
    )
   
    Debug.Print IsMissing(v)
    Debug.Print IsMissing(i)
    Debug.Print IsMissing(d)
    Debug.Print IsMissing(s)
   
End Function


Immediate
Код: Выделить всё
?test
True
False
False
False


Вывод: IsMissing() работает только! для переменных типа Variant

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.06.2004 (Пт) 20:46

Об этом кстати и в хелпе говорится, только для Variant с неуказанным значением по умолчанию.
Т.е. либо используй Variant, либо те значения, которых при обычном вызове быть не должно.
Lasciate ogni speranza, voi ch'entrate.

Alexanbar
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1727
Зарегистрирован: 13.04.2004 (Вт) 23:04
Откуда: Волгоградская обл.

Сообщение Alexanbar » 27.06.2004 (Вс) 0:37

А зачем, собственно, это проверять? Можно простто указать, какое должно быть значение опционного параметра по умолчанию:

Public Function AnyFunction(Optional ByVal nTest as Long =11, Optional ByVal dtDate As Date=какая-то_дата) as Boolean
....

end function

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.06.2004 (Вт) 10:44

Alexanbar, а ты попробуй такую декларацию:
Код: Выделить всё
Public Function AnyFunction(Optional ByVal dtDate As Date = Now() ...

В этом случае без правильного IsMissing не обойтись
Lasciate ogni speranza, voi ch'entrate.

skiperski
Идеолог
Идеолог
Аватара пользователя
 
Сообщения: 1386
Зарегистрирован: 25.06.2002 (Вт) 15:52

Сообщение skiperski » 29.06.2004 (Вт) 12:21

Код: Выделить всё
Public Function AnyFunction(Optional ByVal dtDate As Date = 0)
    If (dtDate = 0) Then dtDate = Now()
    ...
End Function

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 29.06.2004 (Вт) 15:22

Если я вызову эту функцию с датой 31 декабря 1899 года, то эта функция сработает неправильно :)
Lasciate ogni speranza, voi ch'entrate.

Leon_
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 333
Зарегистрирован: 19.05.2004 (Ср) 16:31
Откуда: Moscow

Сообщение Leon_ » 29.06.2004 (Вт) 16:12

Такая дискуссия разгорелась :)
Все сказанное выше очень полезно, но я забыл уточнить -- работает все это из-под Access 2002, и кроме типа Date, IsMissing исправно работает с остальными стандартными типами. Надеюсь, тьфу-тьфу, и дальше будет нормально.
Но вообще довольно неудобно назначать и проверять значения параметров "по умолчанию".[/code]


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14

    TopList  
cron