MadM@tt
Messages postés2167Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention16 juillet 2009
-
23 déc. 2006 à 21:35
MadM@tt
Messages postés2167Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention16 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.
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 !...
Dragon Eye
Messages postés3Date d'inscriptionmercredi 11 octobre 2006StatutMembreDernière intervention28 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
jmfmarques
Messages postés7668Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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.
MadM@tt
Messages postés2167Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention16 juillet 20091 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)
jmfmarques
Messages postés7668Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 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
MadM@tt
Messages postés2167Date d'inscriptionmardi 11 novembre 2003StatutMembreDernière intervention16 juillet 20091 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.
Renfield
Messages postés17287Date d'inscriptionmercredi 2 janvier 2002StatutModérateurDernière intervention27 septembre 202171 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