fonction de fonction
Le
fulgar

Bonjour
peut-on passer une fonction comme argument d'une fonction dans VB ?
merci
peut-on passer une fonction comme argument d'une fonction dans VB ?
merci
Hello,
en VB il n'y a pas de notions de pointeurs de fonctions,
comme ça existe en C par exemple.
Mais VB permet tout de même d'appeller une fonction par
som nom. Ceci permet de faire la même chose qu'un passage
de fonction en argument: on ne passe pas la fonction elle
même, mais son nom (et ses arguments).
On fait tout ceci avec la fonction CallByName:
http://msdn2.microsoft.com/en-us/library/aa262682(vs.60).aspx
Voici un tout simple exemple :
Private Sub Command1_Click()
Dim FunctionName As String
Dim p As String
Dim result As Variant
FunctionName = "LongueurChaine"
p = "HELLO WORLD"
result = CallByName(Me, FunctionName, VbMethod, p)
MsgBox "Resultat de l'appel à " & FunctionName & " = " & result
End Sub
Public Function LongueurChaine(p As String) As Variant
LongueurChaine = Len(p)
End Function
Tu peux faire des trucs compliqué par ce que CallByName peut prendre
comme dernier argument un tableau de variants. Tu peux donc faire tout
ce que tu veux, en jouant simplement avec les noms de fonctions.
--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Hello,
Lorsque la fonction est disponible dans un objet quelconque (module de
classe, form, usercontrol, ...), la fonction CallByName permet de
réaliser l'opération assez simplement.
Néanmoins, si la fonction est disponible dans un tel objet, il peut
être plus approprié que cette objet implémente une interface (mot cl é
Implements) qui a son tour fournira la fonctionnalité requise. Le
problème revient alors à passer un objet à la fonction ou, de maniè re
alternative, à conserver des objets dans une structure appropriée et
de passer le référent adéquat. Ceci peut être réalisée, par exe mple à
l'aide de l'objet Collection qui permettra de leur associer une clé.
D'autres possibilités incluent de déléguer l'appel à un pointeur de
fonction (récupéré par AddressOf) à une dll standard externe (http: //
faq.vb.free.fr/index.php?question4), ou à la VTable d'un objet
intermédiaire, VTable qui aura été préalablement modifiée.
François
n'etant pas un grand programmateur
je ne suis pas sur d'avoir tout compris
si j'ai une fonction qui s'appelle FA et l'autre FB et que je veux passer FA
comme argument dans FB
comme j'ecris cela avec callby name
function FA (a as double) as double
{....}
End function
function FB (CallByName FA, b as double) as double
{....}
End Function
Quelque chose dans ce genre ?
"François Picalausa"
On Aug 24, 11:59 pm, "fulgar"
Hello,
Lorsque la fonction est disponible dans un objet quelconque (module de
classe, form, usercontrol, ...), la fonction CallByName permet de
réaliser l'opération assez simplement.
Néanmoins, si la fonction est disponible dans un tel objet, il peut
être plus approprié que cette objet implémente une interface (mot clé
Implements) qui a son tour fournira la fonctionnalité requise. Le
problème revient alors à passer un objet à la fonction ou, de manière
alternative, à conserver des objets dans une structure appropriée et
de passer le référent adéquat. Ceci peut être réalisée, par exemple à
l'aide de l'objet Collection qui permettra de leur associer une clé.
D'autres possibilités incluent de déléguer l'appel à un pointeur de
fonction (récupéré par AddressOf) à une dll standard externe (http://
faq.vb.free.fr/index.php?question4), ou à la VTable d'un objet
intermédiaire, VTable qui aura été préalablement modifiée.
François
Hello,
Comme Jean-Marc le montrait, ce serait plutôt (non testé) :
'Dans Form1
Function FA(a As Double) As Double
FA = A / 2
End Function
'N'importe où, pour un argument b appartenant à FB, le reste servant à
l'appel
Function FB(CallbackObject As Object, CallbackFunction As String, b As
Double) As Double
FB = CallByName(CallbackObject, CallbackFunction, VbMethod, b *5)
'FB vaudra donc (b*5)/2 pour l'appel à FA
End Function
'L'appel à FB se fera de la manière suivante
MsgBox FB(Form1, "FA", 5) 'Devrait afficher 5*5/2 soit - aux
erreurs dues à la précision finie près - 12.5
François
En complément de l'exemple de François, voici un petit bout de
code, testé et fonctionnel.
Les fonctions "perimetre", "aire" et "volume" sont 3 fonctions "FA"
La fonction "FonctionGenerique" est ta fonction "FB"
Depuis Command1, on appelle FB en lui passant en argument les noms
des fonctions "FA":
Depuis FB, on va appeller les 3 focntions FA.
Voici le code, à écrire simplement dans une form:
Option Explicit
Private Const PI As Double = 3.141592653
Public Function perimetre(rayon As Double) As Double
perimetre = 2 * PI * rayon
End Function
Public Function aire(rayon As Double) As Double
aire = PI * rayon ^ 2
End Function
Public Function volume(rayon As Double) As Double
volume = 4 / 3 * PI * rayon ^ 3
End Function
Public Function FonctionGenerique(CallBackFunction As String, parametre As
Variant) As Variant
FonctionGenerique = CallByName(Me, CallBackFunction, VbMethod,
parametre)
End Function
Private Sub Command1_Click()
Dim r As Double
Dim result As Double
r = 10
result = FonctionGenerique("perimetre", r)
MsgBox "le perimetre est de " & result
result = FonctionGenerique("aire", r)
MsgBox "l'aire est de " & result
result = FonctionGenerique("volume", r)
MsgBox "le volume est de " & result
End Sub
'-------------------------------------------------------
Note : L'usage de pointeurs de fonctions ou de CallByName en VB
est normalement réservé à des cas très particuliers. Devoir les
employer (à part pour un exercice de style) peut être la marque
d'une erreur de design de l'application.
Dans un vrai programme, je n'écrirais personnellement jamais un
tel code.
J'écrirais:
if choix="perimetre" then
result = perimetre(rayon)
elseif choix = "aire" then
result = aire(rayon)
... etc.
'------------
L'usage de ce genre de chose est en général réservé pour les
appels de fonctions dite "CallBack".
Le petit lien ici explique brièvement le concept:
http://www.newty.de/fpt/callback.html
Le cas type, c'est de passer une fonction CallBack pour implémenter
la comparaison dans un algo de tri. Ca permet d'avoir un seule algorithme
de tri (générique) et de lui passer une fonction dédiée pour la
comparaison, ce qui rend les choses très souples.
Bref, à toi de voir si le CallByName est bien une bonne idée :-)
--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
juste en complément le 1er argument de CallByName correspond à quoi ?
merci
FonctionGenerique = CallByName(Me, CallBackFunction, VbMethod,
parametre)
"Jean-marc" de news: 46d088bb$0$14231$
C'est l'objet "propriétaire" de la fonction ou méthode à exécuter.
Si je veux déplacer le controle Text1 avec callByName, j'écris:
CallByName Text1, "Move", vbMethod, 100, 100
--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
^^^^^^^^^^^^^
Moi non plus, je ne suis pas un grand *programmateur* :
Programmateur (n. m.) : Dispositif automatique permettant de définir des
opérations à effectuer dans le temps.
Par exemple, un programmateur de machine à laver.
A ne pas confondre avec un *programmeur* : une personne qui
écrit des programmes informatiques.
J'avais laissé passer celle la :-)
--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;