2010-04-13 3 views
1

J'ai cet algorithme que je veux implémenter sur VB6.Comment appeler une fonction avec la référence de nom de fonction à une valeur de chaîne dans VB

Sub Main() 
dim stringVal1 as string, stringVal2 as string 
dim getOne as boolean 

stringVal1 = "FunctOne" 
stringVal2 = "FunctTwo" 

if getOne then 
    'Call Function with function name assigned to stringVal1 ... how to call the function here?** 
else 
    'Call Function with function name assigned to stringVal1 ... how to call the function here?** 
end if 

End Sub 


Function FunctOne() 
    Msgbox "I'm function one" 
End Function 

Function FunctTwo() 
    Msgbox "I'm function two" 
End Function 

Cela peut-il être fait dans VB6?

Répondre

8

Généralement, ces modèles de code indiquent des erreurs dans la conception de votre logiciel. Dans les rares cas où cela est vraiment nécessaire, CallByName accomplit cela.

Exemple:

Call CallByName(Me, "NameOfFunction", vbMethod, arguments) 
+1

AFAIK est la seule façon de le faire polymorphisme dans VB6 – Andrey

+1

@Andrey : non, vous avez tout à fait tort: ​​VB6 sait interfaces (http : //stackoverflow.com/questions/2581087).En outre, VB6 prend en charge la liaison tardive hors de la boîte de sorte que vous pouvez simplement appeler des méthodes sur des objets polymorphes (mais cela ne fonctionne plus avec 'Option Explicit'). –

+0

comment terriblement j'avais tort. Je déteste toujours VB6 :) – Andrey

0

Il serait utile que vous donner plus d'informations sur la raison pour laquelle vous besoin d'appeler des fonctions par la représentation de chaîne de leur nom. Pourriez-vous pas simplement ré-écrire votre code comme ceci:

If getOne Then 
    Call FuncOne() 
Else 
    Call FuncTwo() 
End If 
0

En général, vous ne voulez pas Dispatch en fait à partir de chaînes. C'est sujet aux erreurs (car vous devez être vraiment sûr au moment de l'exécution que votre chaîne a le nom de la fonction que vous voulez), et vraiment inutile. La façon de faire ce genre de chose où vous voulez pouvoir "passer" la méthode que vous voulez utiliser serait d'utiliser le polymorphisme que possède VB, et d'utiliser une classe séparée pour chaque implémentation.

Dans le module de classe que vous utilisez pour votre interface, par exemple nommé MyInterface:

Public Sub DoStuff() 
End Sub 

Ensuite, créez deux modules de classe, un pour chaque application possible de l'interface:

En MyClassOne:

Implements MyInterface 
Public Sub MyInterface_DoStuff() 
    Msgbox "I'm function one" 
End Sub 
Ensuite, dans
Implements MyInterface 
Public Sub MyInterface_DoStuff() 
    Msgbox "I'm function two" 
End Sub 

Pour l'utiliser, il vous suffit de passer dans lequel la mise en œuvre que vous souhaitez utiliser:

Private Sub UseInterface(WhichThingToUse as MyInterface) 
    WhichThingToUse.DoStuff 
End Sub 

Plutôt que d'utiliser une variable de chaîne pour stocker la méthode à utiliser, vous devez stocker plutôt une New MyClassOne ou un New MyClassTwo. Vous ne montrez pas comment votre variable getOne est définie, mais quelle que soit la logique, vous avez juste besoin de changer pour stocker une instance de MyInterface à la place, et l'utiliser directement.

Pour aller plus loin dans la bibliothèque MSDN:

Questions connexes