Nom d'une fonction dans une variable [Résolu]

Signaler
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
-
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
-
Bonjour à tous

Peut on mettre le nom une fonction dans une variable ????
afin que selon le parametre que l'on entre dans l'argument de Essai il appelle la fonction correspondante sans faire de "select case"

Function Essai(Fonction as ???)
 
 Fonction(a,b)
 
End Function

Merci de votre aide

17 réponses

Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
50
Re,
Petit exemple pour illustrer (tout dans le formulaire)

Private Sub Form_Load()
Call CallByName(Me, "HelloWorld", VbMethod, "COUCOU")
Call CallByName(Me, "ByeBye", VbMethod, "COUCOU")
End Sub<hr />

Public Sub HelloWorld(Param As String)
   Call MsgBox(Param)
End Sub<hr />
Public Sub ByeBye(Param As String)
   Call MsgBox(Param)
   End
End Sub<hr />, ----
[code.aspx?ID=41455 By Renfield]

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
ou bien peut on faire un style d'alias ????
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
50
Essaie avec CallByName

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Non, pas possible.

Mais tu peux passer un parametre et dans la procedure suivant la valeur du parametre, appeler la bonne fonction.

Function toto( titi as boolean) as integer
   
    if titi = True then
       call fontion_titi()
    else
       call fonction_pas_titi()
    end if
end function

---- Sevyc64  (alias Casy) ---- <hr size ="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
oupsss, CallByName, je l'avais oublier celui-là

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
Merci beaucoup de vos réponses
@Casy


Justement le probleme c'est que je ne voulais pas avoir a referencer tous les codages que j'aurais en DLL, surtout qu'il peut y en avoir des nouveaux, et il faudrais que je modifie et rajoute a chaque fois le code source.


C'est pourquoi je ne voulais pas faire de choix style select case ou if else,
mais merci quand meme

@Jrivet


CallByName,  je connaissais pas
Je ne sais pas du tout comment l'utiliser, je vais chercher ....

Encore merci a vous deux
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
A bah tu as posté en meme temps que moi
Je regarde ça tout de suite pour voir si je comprend
Merci beaucoup
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
Jrivet tu est un ange


C'est exactement ce que je voulais


Mille merci


 
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
J'suis dégouté ça marche nickel avec une procedure interne, mais pas avec une procedure dans une DLL.

Est ce normal ???
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
50
Re,
Oui car le premier parametre est l'objet contenant la fonction (d'apres ce que j'ai compris)
Il faut donc que la procédure à appeler sois dans un objet (donc ps de mosule par exemple)

Place le code que tu utilises pour que l'on puisse t'aider un peu plus.

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
Voici le code :

Private Declare Function lstrcpy Lib "Kernel32" (ByVal lpString1 As Any, ByVal lpString1 As Any) As Long
Public Declare Function CryptageP1M1 Lib "P1M1.dll" (ByVal a As String) As Long
Public Declare Function DecryptageP1M1 Lib "P1M1.dll" (ByVal a As String) As Long

Public Sub Form_Load()
 
 Codage = "P1M1"
 PhraseACoder = "Coucou"
 MsgBox PhraseACoder, vbOKOnly, "Phrase d'originale"
 PhraseCoder = CoderAlpha(Codage, PhraseACoder)
 MsgBox PhraseCoder, vbOKOnly, "Retour Dll phrase codée par " + Codage
 PhraseDecoder = DecoderAlpha(Codage, SupCabalistiqueFinal(PhraseCoder))
 MsgBox PhraseDecoder, vbOKOnly, "Retour Dll phrase décodée par " + Codage
 
End Sub



'                   CODAGE/DECODAGE ALPHANUMERIQUE
'                   ******************************



Function CoderAlpha(Codage , PhraseACoder)
 
 Dim ChaineDll As String * 400
 Dim RetourDll As Long
 Dim AdresseChaine As Long
 ChDrive (Left(CurrentProject.Path, 1))
 ChDir CurrentProject.Path
 
 If Dir(CurrentProject.Path + "" + Codage + ".dll") <> "" Then
  Cryptage = "Cryptage" + Trim(Codage)
  RetourDll = CallByName(Cryptage, Cryptage, VbMethod, PhraseACoder)
  AdresseChaine = lstrcpy(ChaineDll, RetourDll)
  CoderAlpha = ChaineDll
 Else
  MsgBox "La Dll " + Codage + ".Dll" + " est absente de " + CurDir
 End If
 
End Function



Function DecoderAlpha(Codage, PhraseADecoder)
 
 Dim ChaineDll As String * 400
 Dim AdresseChaine As Long
 Dim RetourDll As String
 ChDrive (Left(CurrentProject.Path, 1))
 ChDir CurrentProject.Path
 
 If Dir(CurrentProject.Path + "" + Codage + ".dll") <> "" Then
  Decryptage = "Decryptage" + Trim(Codage)
  RetourDll = CallByName(Me, Decryptage, VbMethod, PhraseADecoder)
  AdresseChaine = lstrcpy(ChaineDll, RetourDll)
  DecoderAlpha = ChaineDll
 Else
  MsgBox "La Dll " + Codage + ".Dll" + " est absente de " + CurDir
 End If
 
End Function





Encore merci
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
J'avais remplacé ton "Me" par cryptage mais ça fait pas mieux
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
Dans la phrase :
RetourDll = CallByName(Cryptage, Cryptage, VbMethod, PhraseACoder)
Et j'ai oublié de remettre private au deux declarations que j'avais mises dans un module standard.

Merci de ton aide
Messages postés
7393
Date d'inscription
mercredi 23 avril 2003
Statut
Membre
Dernière intervention
6 avril 2012
50
Salut,

ATTENTION CallByName ne peux pas accéder à des procédures privées. ou alors j'ai pas compris ton dernier post.

Ensuite pour l'utiliser il faut indiquer l'objet contenant les procédures.
Dans mon exemple tout était au même endroit donc j'ai mis ME, mais pour toi je ne sais pas du tout comment faire pour taper dans les procédures d'une Dll

@+: Ju£i?n
Pensez: Réponse acceptée
Messages postés
7741
Date d'inscription
mercredi 1 septembre 2004
Statut
Membre
Dernière intervention
24 septembre 2014
37
Il faut peut-etre déclarer les fonctions de la dll en utilisant DllImport plutot que les instructions Declare.

Mais je sais pas si c'est possible en VB6

---- Sevyc64  (alias Casy) ----<hr size="2" width="100%" /># LE PARTAGE EST NOTRE FORCE #    http://aide-office-vba.monforum.com/index.php
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
J'suis dégouté, vous aviez presque trouvé.
Bon, j'espere qu'une ame charitable passera par la pour nous donner un coup de main.
En attendant je vous remercie encore de votre aide
Bonne journée
Messages postés
406
Date d'inscription
lundi 9 juin 2003
Statut
Membre
Dernière intervention
4 septembre 2013
1
Au pire je vais recréer un POST pour demander comment utiliser CallByName dans une DLL, peut etre que quelqu'un connait la reponse. Vous m'avez fait avancé d'un pas, et c'est deja bien