CallByName en VB.NET ?

Résolu
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 - 12 sept. 2008 à 00:02
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 - 16 sept. 2008 à 23:06
Bonsoir,

Dans un projet sous VB6/VBA, j'utilisais l'instruction "CallByName"... Je tente de transporter cette instruction sous VB2008, mais je ne connais pas son équivalent... Avez-vous une idée ?

Merci, pour toute l'aide que vous pourriez m'apporter...

Amicalement,
Us.

13 réponses

gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
12 sept. 2008 à 10:46
Public Function CallByName( _
ByVal ObjectRef As System.Object, _
ByVal ProcName As String, _
ByVal UseCallType As CallType, _
ByVal Args() As Object _
) As Object



Requirements





Namespace: [ms-help://MS.VSExpressCC.v80/MS.NETFramework.v20.en/dv_vbalr/html/f5e82c6e-3500-452b-bdb8-78f0d5477604.htm Microsoft.VisualBasic]



Module: Interaction



Assembly: Visual Basic Runtime Library (in Microsoft.VisualBasic.dll)














Bonjour chez vous !
1
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
12 sept. 2008 à 12:32
Bonjour,

Merci de nouveau.

J'ai trouvé 2 façons de faire :

Microsoft.VisualBasic.CallByName()
Microsoft.VisualBasic.Interaction.CallByName()

qui fonctionne donc, même sans la référence Microsoft.visualBasic cochée.
Bien sur, le fait d'écrire : "Microsoft.VisualBasic." fait, en réalité une référence implicite à VB6... (en qlq sorte)

Par conséquent, ce n'est pas du VB.NET natif !
Hors, c'est ce que je recherche... Ici, c'est plus une astuce, qu'autre chose...

Je me sert de CallByName, car visiblement VB2008 ne possède pas de collection d'objet pour les Label, TextBox, etc... Comme sous VB6, où cela est très simple d'utilisation... avec : Label(0), Label(1), etc...

IL y a-t-il une solution pour indexer les Label, ou autres cntrôles ?
(Cette question pourrait faire l'objet d'un nouveau post, j'en suis conscient...)

Amicalement,
US.
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
12 sept. 2008 à 13:06
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
12 sept. 2008 à 16:46
Salut,

OKay, vu l'astuce que tu utilises :

Dim tb() As TextBox = {TextBox0, TextBox1, TextBox2, TextBox3, TextBox4, TextBox5, TextBox6, TextBox7, TextBox8, TextBox9, TextBox10, TextBox11, TextBox12}

For x = 0 To 12
tb(x).text = String.Empty
Next

=

JE viens de me pencher dessus, et comme c'est déjà un problème que j'avais rencontré dans VBA (il n'y a pas de collection, non plus) j'avais fait une petite propriété bien pratique, d'ailleurs en Snippets : http://www.codyx.org/snippet_donner-valeur-dans-ensemble-meme-type-controle_528.aspx
que j'ai adapté pour VB2008... Voici ce que cela donne :

Dans un module :

=

Public Property TypeControl(ByVal oObjet As Object, ByVal NameControl As String, ByVal NamePropriete As String)
' DONNE UNE VALEUR A UNE PROPRIETE A L'ENSEMBLE D'UN TYPE DE CONTROLE

Set(ByVal value)
Dim cTypeControl As Control
For Each cTypeControl In oObjet.Controls
If cTypeControl.GetType.Name = NameControl Then
Microsoft.VisualBasic.CallByName(cTypeControl, NamePropriete, Microsoft.VisualBasic.CallType.Let, value)
End If
Next
End Set
Get
Return Nothing
End Get
End Property

=

Puis, on appelle ainsi : (exemple)

TypeControl(GroupBox1, "Textbox", "text") "dede"
> ainsi tous les Textbox se trouvant dans Groupbox1 auront le texte "dede".

C'est toute même lourd, que de citer tous les noms des contrôles...

(J'y metterai peut-être une petite source exemple, le temps d'avoir des critiques, puis en snippets... Enfin, si tu vois mieux ? n'hésite pas...)

Amicalement,
Us.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
12 sept. 2008 à 16:48
Oupsss... Lire : "... C'est toute même moins lourd..."

Amicalement,
Us.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
12 sept. 2008 à 16:50
Pour continuer, la fonction CTYPE est presque un équivalent à CALLBYNAME... mais en moins pratique... CallByName reste vraiment plus puissante... Il me semble, que rien remplace vraiment CallByName en VB.NET...

Amicalement,
Us.
0
gillardg Messages postés 3275 Date d'inscription jeudi 3 avril 2008 Statut Membre Dernière intervention 14 septembre 2014 2
12 sept. 2008 à 17:26
ben attends vb10 ils ne pouvaient pas tout changer d'un coup sinon c'était impossible de faire un convertisseur vb6=>vb.net

Bonjour chez vous !
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
12 sept. 2008 à 17:31
lol...

Amicalement,
Us.
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
13 sept. 2008 à 07:54
Quitte à faire du .NET, faisons-en jusqu'au bout !
Il existe l'espace de nom System.Reflection dans le framework .NET
Avec les clases qu'il contient, il remplace plus qu'avantageusement ce bon vieux CallByName()
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
13 sept. 2008 à 10:42
Bonjour,

Je ne vois pas bien comment faire pour obtenir l'équivalent de CallByName ?
System.Reflection étant un peu court comme explication. Le nombre de surcharge étant plétorique, je n'y perds... et l'aide en ligne, ben, c'est franchement pas ça... Peux-tu préciser ? SVP.

Amicalement,
Us.
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
15 sept. 2008 à 19:58
Voici un exemple issu de MSDN et présentant l'appel à une méthode :

Public Class A
Public Overridable Function method() As Integer
Return 0
End Function
End Class

Public Class B
Public Overridable Function method() As Integer
Return 1
End Function
End Class

Class Mymethodinfo

Public Shared Function Main() As Integer
Console.WriteLine("Reflection.MethodInfo")
Console.WriteLine()
Dim MyA As New A()
Dim MyB As New B()

'Get the Type and MethodInfo
Dim MyTypea As Type = Type.GetType("A")
Dim Mymethodinfoa As MethodInfo = MyTypea.GetMethod("method")

Dim MyTypeb As Type = Type.GetType("B")
Dim Mymethodinfob As MethodInfo = MyTypeb.GetMethod("method")

'Get and display the Invoke method
Console.WriteLine("First method - {0} returns {1}", MyTypea.FullName, _
Mymethodinfoa.Invoke(MyA, Nothing).ToString())
Console.WriteLine("Second method - {0} returns {1}", MyTypeb.FullName, _
Mymethodinfob.Invoke(MyB, Nothing).ToString())
Return 0
End Function
End Class
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
16 sept. 2008 à 20:55
Bonsoir,

Très cher, je ne vois pas bien en quoi l'appel à une methode, m'aide pour faire l'équivalent de CallByName ?
dsl, même si je suis un peu l'entêtrise de service, sur ce coup...

Amicalement,
Us.
0
Kristof_Koder Messages postés 918 Date d'inscription vendredi 3 août 2007 Statut Membre Dernière intervention 27 octobre 2008 10
16 sept. 2008 à 23:06
Ben c'est exactement ce que fait l'exempel que je t'ai refilé !
Il appelle les méthodes nommées Method() d'instances des classes A et B à partir de chaines de caractères : Une contenant "A", l'autre "B" et la dernière "method". si ce n'est pas l'équivalent de CallByName() ... je ne sait pas ce que c'est ! C'est juste que c'est bcp plus puissant, donc cela parait plus complexe, mais il n'en est rien !
0
Rejoignez-nous