Récupérer les informations de intellisense (avec la reflection ???)

Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 23 sept. 2009 à 15:36
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 - 28 sept. 2009 à 15:40
Bonjour,

En ce moment, je me développe des classes "génériques" (entre autres une classe "journal" qui me serviras d'exemple) pour mes futures projets (je suis un peut à vide là tout de suite donc je prend de l'avance ). Ici pas de problèmes.

Maintenant je veut me faire un UserControl de configuration intelligent (enfin autant qu'il puisse l'être ). Et c'est la que sa coince

Dans cette classe (journal) j'ai différentes énumérations qui me permettent de la configurer ("EnBy_MethodeHistoJournal" qui énumère toutes les possibilités d'historisation de mes journaux me serviras d'exemple : "Tous les journaux dans le même fichier", "Un fichier journal par date", ...). Pour chaque élément de cette énumération je voudrais crée (dynamiquement bien sure) un "RadioButton" en mettant dans sa propriété "Text" la description de cette élément présente dans l'intellisense et dans le tooltiptext la remarque (si elle existe) tj présente dans l'intellisense (et la ma class aurais la classe ).

Mon objectif étant que si j'ajoute par la suite un nouvelle élément dans mon énumération (en renseignant intellisense bien évidemment) mon UserControl se mette à jour automatiquement. Je pense que pour faire sa j'ai besoin de "System.Reflection" mais je ne m'en suis servie qu'à de très rare occasion (une fois fin 2007 à vrais dire) et je n'y arrive pas .

Je sait déjà crée dynamiquement mes RadioButton (sa c'est facile, il suffi d'en crée un dans l'interface puis d'aller dans la définition de la fonction "InitializeComponent" présente dans le "New" du usercontrol, ou dans un formulaire sa marche aussi, pour voir comment faire ) mais récupérer la liste des éléments d'une énumération et leurs descriptions sa je ne sait pas faire .

Mon énumération exemple pour bien comprendre mon objectif :
        ''' <summary>
        ''' Méthode d'historisation du journal <- Le texte qui sera présent dans le GroupBox
        ''' </summary>
        Public Enum EnBy_MethodeHistoJournal As Byte
            ''' <summary>
            ''' Le journal est réinitialisé (vidé) à chaque exécution <- Le texte du 1ér RadioButton 
            ''' </summary>
            UneExecution = 1
            ''' <summary>
            ''' Toutes les exécutions sont sauvegarder dans le même journal <- Le texte du 2ème RadioButton 
            ''' </summary>
            ''' <remarks>
            ''' ATTENTION le fichier journal peut devenir TRÈS gros <- Le tooltiptext du 2ème RadioButton
            ''' </remarks>
            TouteExecution = 2
            ''' <summary>
            ''' Chaque journal contient la date du jour de sa création <- Le texte du 3ème RadioButton 
            ''' </summary>
            ''' <remarks>
            ''' La date de création afin d'éviter d&#8217;avoir plusieurs journaux pour la même exécution en cas de traitement de nuit <- Le tooltiptext du 3ème RadioButton
            ''' </remarks>
            UnFichierParDate = 3
        End Enum


Merci d'avance (si qq chose ne vous parais pas claire dans ma question n'hésitez surtout pas à demander)

Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo

3 réponses

cs_Z1z1 Messages postés 3 Date d'inscription vendredi 14 mars 2003 Statut Membre Dernière intervention 13 septembre 2014
25 sept. 2009 à 14:36
Voici un exemple EN VB 6.0 ... qui retourne le nom (dans une string) d'un élément d'une itération
L'astuce est d'utiliser la "TypeLib Library".... je ne sais pas si c'est exploitable en Dot.Net.
NB Cet exemple à la base n'est pas de moi, mais de Microsoft


Private Sub Form_Load()
'Exemple....
Debug.Print GetEnumName(vbMaximized, "FormWindowStateConstants", "C:\WINDOWS\system32\msvbvm60.dll\3")
End Sub

Public Function GetEnumName(EnumValue As Long, EnumName As String, TypeLibFile As String) As String

On Error GoTo Error_GetEnumName

Dim oTLIApp As Object 'TLI.TLIApplication
Dim oTLI As Object 'TypeLibInfo
Dim oTL As Object 'TypeInfo
Dim oTLMember As Object 'MemberInfo
Const TKIND_ENUM = 0


Set oTLIApp = CreateObject("TLI.TLIApplication")

Set oTLI = oTLIApp.TypeLibInfoFromFile(TypeLibFile)

For Each oTL In oTLI.TypeInfos
If oTL.TypeKind TKIND_ENUM And oTL.Name EnumName Then
' Now we have to search each member to find the correct value.
For Each oTLMember In oTL.Members
If oTLMember.Value = EnumValue Then
GetEnumName = oTLMember.Name
Exit Function
End If
Next oTLMember
End If
Next oTL

Exit Function

Error_GetEnumName:

GetEnumName = "Error"

End Function
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
25 sept. 2009 à 16:42
Ok merci de t'intéresser à mon problème Z1z1 .
On pouvais déjà faire ce genre de chose en VB6 (avec de la chance Microsoft auras ajouté les infos de intellisense, par contre j'ai l'impression que sa récup les nom des "variable" de l'enum et c'est pas tout à fait mon objectif mais sa m'en rapproche un peut c'est déjà sa)
(Je doit finir un truc pour ce soir mais je regarde sa dé lundi), je poste ici la traduction en Dot.Net dé que c'est fait


Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
0
Polack77 Messages postés 1098 Date d'inscription mercredi 22 mars 2006 Statut Membre Dernière intervention 22 octobre 2019 1
28 sept. 2009 à 15:40
Un projet "surprise" viens de me tombé dessus, et paf .
Je reviendrais sur celui-ci dé que je pourrais.
DZL

Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
0
Rejoignez-nous