CallByName en VB.NET ? [Résolu]

Signaler
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
-
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
-
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

Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
4
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 !
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
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.
Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
4
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
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.
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
Oupsss... Lire : "... C'est toute même moins lourd..."

Amicalement,
Us.
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
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.
Messages postés
3275
Date d'inscription
jeudi 3 avril 2008
Statut
Membre
Dernière intervention
14 septembre 2014
4
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 !
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
lol...

Amicalement,
Us.
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
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()
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
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.
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
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
Messages postés
2065
Date d'inscription
lundi 11 avril 2005
Statut
Membre
Dernière intervention
14 mars 2016
10
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.
Messages postés
918
Date d'inscription
vendredi 3 août 2007
Statut
Membre
Dernière intervention
27 octobre 2008
10
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 !