Tester la présence d'un parametre optionnel

Résolu
Signaler
Messages postés
2167
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009
-
Messages postés
2167
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009
-
Bonjour à tous,

voilà mon problème est que j'ai un fonction  avec des parametres optionnels :
Public Function Add(Optional A as long, Optional B as long)

end function

J'aimerais pouvoir tester si A et B ont été précisés, ou si ils n'ont pas été précisés.
J'ai regardé du coté de la fonction "IsMissing", mais elle ne marche que pour des types variant, et moi c'est des Long.

Le coup des valeurs par défaut ne me convient pas non plus, car je me trouve avec des variables qui peuvent prendre n'importe quelle valeur (String, Long qui peuvent etre nuls ou négatifs ...), donc aucune façon de le savoir grace à une valeur par défaut.

Une idée ??

Merci d'avance

Ciaò
- MadMatt -
Vb System Library

11 réponses

Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Bonjour  191911 MadM@tt

J'avais en effet lu trop vite.

Mais alors, tu ne peux t'en sortir que par des acrobaties !

Je n'aime pas, mais en voilà 2 possibles :

La première :

un tableau dynamique public de type string et de dimensions égales au nombre de tes paramètres
avant l'appel de ta fonction, tu mets dans ce tableau, à l'index correspondant au rang du paramètre optionnel ne contenant rien, n'importe quel cxaractère
Dans ta fonction, ti peux alors regarder ce tableau et décider :si par exemple a 0 et que tabl(1) <> "" alors a est vide (et tu en profites pour remettre immédiatement (depuis ta fonction) tabl(1) "" pour éviter une bouble ailleurs)
etc...

La deuxième :

envoyer tes paramètres optionnels en variant (ismissing peut alors être utilisé)
et les transformer immédiatement (d'entrée de jeu) en variables du véritable type

par exemple

a1 = val(a) si (à la fois) a n'est pas absent et que a est de type numérique

etc... pour chaque type d'un paramètre optionnel

puis tu fais tes calculs avec a1, b1, etc...

Je n'en vois pas d'autres et les 2 me déplaisent !...

Désolé.
Messages postés
3
Date d'inscription
mercredi 11 octobre 2006
Statut
Membre
Dernière intervention
28 janvier 2007

mon truc est:

changer un peut ta fonction telle que les parametres optionnelles seront de type Variant

function XXX(.....,optional A as variant,Optional B as variant,Optional.......etc)
      dim a1as long,b1 as long,...etc  'un variable long pour chaque optional
'example avec A
         if not ismessing(A) then
            if isnumeric(A) then
               a1=clong(A)
                 '.........rest
            else
                  ....... 'traitement comme ISMISSING
              end if
          else
             ...............'traitement ISMISSING
            end if
Messages postés
883
Date d'inscription
vendredi 3 novembre 2000
Statut
Membre
Dernière intervention
3 mars 2009
7
Fais une surcharge de ta fonction :

Function TaFonction(a as long, b as long) as long
'Paramètres précisés
End function

Function TaFonction() as long
'Paramètres pas précisés
End function

Julien.
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
IsMissing(a) n'est valable que si a est de type variant

Pour un type long :
if a = 0
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Pour être plus précis (et désolé pour la langue, mais je travaille avec une version en anglais) :

Use the IsMissing function to detect whether or not optional Variant arguments have been provided in calling a procedure. IsMissing returns True if no value has been passed for the specified argument; otherwise, it returns False. If IsMissing returns True for an argument, use of the missing argument in other code may cause a user-defined error. If IsMissing is used on a ParamArray argument, it always returns False. To detect an empty ParamArray, test to see if the array’s upper bound is less than its lower bound.
Messages postés
2167
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009
1
Julien > Ah je savais pas qu'on pouvait faire ça, mais le problème c'est que j'ai un truc du genre :
Public Function XXX(A as long, B as long, Optional C as long, Optional D as string, Optional E as boolean)

Donc y'a des parametres non-optionnels, et y'a beaucoup de parametres optionnels, donc impossible car il est possible de préciser le 3è parametre et pas le 2è etc...

jmfmarques > Je sais pour IsMissing, je l'ai précisé dans mon premier post. J'ai également précisé que je ne pouvais pas utiliser la technique de la valeur par défaut (If a=0)

Ciaò
- MadMatt -
Vb System Library
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Une acrobatie encore plus "drôle" (en me rasant) :

imagine que tu aies à envoyer 3 paramètres !
tu en envoies 1 de plus (donc 4) , le 4ème étant de type string et constitué de "l'image" des 3 1ers... Je m'explique

ta_fonction(A, , B,C)
serait transformé en ta_fonction(A, ,B,C, "A,  ,B,C")
et dans ta fonction :

Function TaFonction(a as long, b as long, c as long, montruc as string) as long
   là tu utilises split avec la virgule et tu détermines les chainages qui ne contiennent rien (correspondant donc à des paramètres vides)
 ---- et tu continues en sachant maintenant qui est "vide"
-----
End function
Messages postés
2167
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009
1
Merci pour ces idées, c'est sympa de s'etre penché sur la question.
En fait ma grande restriction, c'est que la fonction (et j'en ai pas mal comme celle la en fait) sont dans un projet DLL activeX, donc je suis censé faire une DLL la plus fonctionnelle et "pro" possible, donc c'est pour ça je ne peux vraiment pas appliquer le truc du tableau pour savoir quel parametre est optionnel, ni le truc "(A, ,B,C, "A,  ,B,C")" (meme si celle la est pas mal).
Celle qui me reste effectivement c'est celle avec des variant (c'est celle qui est la plus invisible pour l'utilisateur de la DLL).

Un grand merci à vous 3 donc, et pis bouh à MS qui ne s'est pas débrouillé pour que VB puisse gérer ça sa bricolage.

Ciaò
- MadMatt -
Vb System Library
Messages postés
17288
Date d'inscription
mercredi 2 janvier 2002
Statut
Modérateur
Dernière intervention
27 septembre 2021
71
Variant est la réponse a beaucoup de soucis....

un Variant, c'est une entete, suivie de la valeur.
l'entete (un octet) dit si la donnée est là (testé par le IsMissing) et nous donne le type de donnée stockée (date, string, long.....)

pour ça que la plupart des OCX (r) MS utilisent des Variant...
ils ont mauvaise reputation, car en effet, on stocke un octet de plus que la donnée.... il faut les utiliser avec parcimonie, donc, mais en pas les eradiquer

Renfield
Admin CodeS-SourceS- MVP Visual Basic
Messages postés
168
Date d'inscription
vendredi 9 janvier 2004
Statut
Membre
Dernière intervention
28 juillet 2009
1
[mailto:MadM@tt MadM@tt] : tout comme toi, j'ai pas mal de fonctions dans une DLL ActiveX.

Perso, j'ai opté pour l'approche suivante : je donne une valeur par défaut à mes paramètres optionnels.

Ainsi,

Public Function XXX(A as long, B as long, Optional C as long, Optional D as string, Optional E as boolean)

Sera codé chez moi comme
Public Function XXX(A as long, B as long, Optional C as long, Optional D as string vbNullString, Optional E as boolean False)

Puis, dans le corps de la fonction, je vérifie le paramètre et sa valeur.  Si D = vbNullString, je présume que ce paramètre n'a pas été spécifié.

Christophe
Messages postés
2167
Date d'inscription
mardi 11 novembre 2003
Statut
Membre
Dernière intervention
16 juillet 2009
1
J'ai déjà cité cette méthode et expliqué pourquoi je ne pouvais pas l'utiliser

Ciaò
- MadMatt -
Vb System Library