Tester la présence d'un parametre optionnel

Résolu
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 - 23 déc. 2006 à 21:35
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 - 27 déc. 2006 à 17:11
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

jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
24 déc. 2006 à 08:46
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é.
3
Dragon Eye Messages postés 3 Date d'inscription mercredi 11 octobre 2006 Statut Membre Dernière intervention 28 janvier 2007
24 déc. 2006 à 13:36
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
3
Julien237 Messages postés 883 Date d'inscription vendredi 3 novembre 2000 Statut Membre Dernière intervention 3 mars 2009 7
23 déc. 2006 à 21:46
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.
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
23 déc. 2006 à 22:17
IsMissing(a) n'est valable que si a est de type variant

Pour un type long :
if a = 0
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
23 déc. 2006 à 23:10
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.
0
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
24 déc. 2006 à 00:20
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
0
jmfmarques Messages postés 7666 Date d'inscription samedi 5 novembre 2005 Statut Membre Dernière intervention 22 août 2014 27
24 déc. 2006 à 09:56
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
0
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
24 déc. 2006 à 13:45
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
0
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 74
26 déc. 2006 à 10:31
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
0
cavo789 Messages postés 168 Date d'inscription vendredi 9 janvier 2004 Statut Membre Dernière intervention 28 juillet 2009 1
27 déc. 2006 à 09:27
[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
0
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
27 déc. 2006 à 17:11
J'ai déjà cité cette méthode et expliqué pourquoi je ne pouvais pas l'utiliser

Ciaò
- MadMatt -
Vb System Library
0
Rejoignez-nous