Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

fonction de fonction

8 réponses
Avatar
fulgar
Bonjour
peut-on passer une fonction comme argument d'une fonction dans VB ?

merci

8 réponses

Avatar
Jean-marc
fulgar wrote:
Bonjour
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_' ;
Avatar
François Picalausa
On Aug 24, 11:59 pm, "fulgar" wrote:
peut-on passer une fonction comme argument d'une fonction dans VB ?



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
Avatar
fulgar
merci
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" a écrit dans le message de news:

On Aug 24, 11:59 pm, "fulgar" wrote:
peut-on passer une fonction comme argument d'une fonction dans VB ?



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
Avatar
François Picalausa
On Aug 25, 11:43 am, "fulgar" wrote:
merci
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 ?



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
Avatar
Jean-marc
fulgar wrote:
merci
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 ?



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_' ;
Avatar
fulgar
Merci beaucoup, c'est plus clair
juste en complément le 1er argument de CallByName correspond à quoi ?
merci


FonctionGenerique = CallByName(Me, CallBackFunction, VbMethod,
parametre)

"Jean-marc" a écrit dans le message
de news: 46d088bb$0$14231$
fulgar wrote:
merci
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 ?



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_' ;






Avatar
Jean-marc
fulgar wrote:
Merci beaucoup, c'est plus clair
juste en complément le 1er argument de CallByName correspond à quoi ?
merci



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_' ;
Avatar
Jean-marc
> "Jean-marc" a écrit dans le
message de news: 46d088bb$0$14231$
fulgar wrote:
merci
n'etant pas un grand programmateur






^^^^^^^^^^^^^
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_' ;