IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

WinDev Discussion :

récupérer ou parcourir une énumération DotNet [WD18]


Sujet :

WinDev

  1. #1
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut récupérer ou parcourir une énumération DotNet
    Bonjour,

    Je voudrais récupérer (dans des tableaux, tables ou listes) la liste des constantes et/ou des valeurs de diverses Enumérations utilisées sous DotNet, par exemple XmlNodeType, XmlNodeChangedAction, ValidationType etc.
    Je soulève le problème dans ce forum, parce que c’est l’interfaçage avec Windev qui pose problème et non le principe (les exemples de solution C ou VB ne manquent pas).

    Malheureusement, ces énumérations ne peuvent pas faire l’objet d’un parcours (pas IEnumerable).
    Il faut donc procéder autrement et la classe Enum présente deux méthodes permettant de récupérer ces valeurs sous forme de tableau :
    .GetNames(Type) pour les noms des constantes
    .GetValues(Type) pour les valeurs correspondantes
    L’éditeur connaît XmlNodeType (ou les autres énumérations) et suggère les méthodes ci-dessus.

    Par contre, il ne suggère pas .GetType() qui est pourtant une méthode d’Enum.

    Le problème que je rencontre est de passer le type de ces énumérations aux méthodes .GetNames et .GetValues,
    - soit via une constante ou une variable,
    - soit via une méthode, pour pouvoir construire une fonction générique.

    Pour cette seconde alternative, Windev ne dispose pas d’un GetType() ou TypeOf(), et TypeVar() renvoie un type’ 72 – DotNet Object’ sans autre précision.
    Je ne parviens pas à appeler la méthode .GetType sur l’énumération.
    Le code serait alors .GetNames(Enumération.GetType()), mais l’éditeur ne propose pas cette méthode sur ces énumérations.

    Comme mes connaissances de DotNet et de la POO sont limitées, je suis dans l’impasse.
    L’un de vous aurait-il une idée ou la solution ?

    D’avance, merci

    Hemgé

  2. #2
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    hello Hemgé,
    j'espère que j'ai bien compris ce que tu veux. J'ai trouvé un moyen de récupérer les noms pour ton Enum :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    tabEnumNom est un tableau de chaînes
     //tabEnumVal est un tableau de ????
    tabEnumNom = Enum.GetNames(System.Type.GetType("System.Xml.XmlNodeType, System.Xml, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"))
    //tabEnumVal = Enum.GetValues(System.Type.GetType("System.Xml.XmlNodeType, System.Xml, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089"))
    POUR i = 1 _A_ tabEnumNom..Occurrence
    Trace(tabEnumNom[i])
    FIN
    en fait c'est la fonction Type.GetType qui fait le boulot avec comme paramètre le nom complet de la classe suivi du nom "Fully qualified" de l'assemblage. J'avoue que c'est un peu tordu. Il doit y avoir plus simple. Et puis un autre problème apparaît : le tableau de valeurs renvoyé est un tableau d'objets dynamiques dotnet comment les convertir en variable windev ? Peut être voir du côté des variants.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    bon, j'ai trouvé un moyen de convertir un objet dotnet en entier : avec Convert.ToInt32

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    tabEnumNom est un tableau de chaînes
    tabEnumVal est un tableau de System.Object dynamique
    LeType est un System.Type dynamique  =  "System".Type.GetType("System.Xml.XmlNodeType, System.Xml, Version=1.0.5000.0,Culture=neutral, PublicKeyToken=b77a5c561934e089")        
    tabEnumNom = Enum.GetNames(LeType)
    tabEnumVal = Enum.GetValues(LeType)
    POUR i = 1 _A_ tabEnumNom..Occurrence
    Trace(tabEnumNom[i]," : " ,Convert.ToInt32(tabEnumVal[i]))
    FIN
    Résultat :
    Nom : Dotnet-windev-type.png
Affichages : 1215
Taille : 10,5 Ko


    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  4. #4
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Un tout grand merci, J.P
    C'est exactement ce que je recherchais.

    Il est vraiment dommage que la doc de WD ne soit pas plus complète.
    Je savais ne pas être "fully qualified" sur ces problèmes, mais au moins, j'avais une idée assez précise d'une source de solution ... qui s'avère conforme à mes espoirs !

    Pour le GetValues, j'avais aussi pensé à .ToString("D") comme sur les énumérations, mais .GetValues renvoie des objets et la méthode .ToString() des objets n'accepte pas de paramètre.

    Où puis-je trouver un peu de doc sur cette manière d'appeler une méthode, de même que le nom complet d'un assemblage ?

    Et ... un autre challenge : pourrait-on faire la même chose sur une énumération Windev ?
    Parce qu'alors cela changerait pas mal de choses !

    En vous souhaitant une excellente journée,

    Hemgé

  5. #5
    Expert éminent
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    3 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 3 954
    Points : 9 284
    Points
    9 284
    Par défaut
    hello,
    Citation Envoyé par Hemgé Voir le message
    Où puis-je trouver un peu de doc sur cette manière d'appeler une méthode, de même que le nom complet d'un assemblage ?
    je n'ai pas vraiment trouvé de doc concernant cette manière d'appeler la méthode, c'est en regardant à droite à gauche que j'ai vu qu'il fallait mettre le nom de l'assemblage "fully qualified" quand l'objet dont on cherchait le type n'appartenait pas à l'assemblage de base (mscorlib).
    Par contre pour trouver et utiliser le nom complet d'un assemblage , j'ai trouvé une astuce : il suffit de trouver dans cet assemblage une classe qui a la méthode gettype et le tour est joué. Par exemple pour System.xml la classe XmlDocument. Voici le code pour obtenir le "Fully qualified Name" (FQN). :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    monXmlDocument est un  System.Xml.XmlDocument()
    monType est un  System.Type dynamique  =  monXmlDocument.gettype()
    FQN est une chaîne = monType.get_AssemblyQualifiedName()
    Trace(CRLF + FQN)
    tabEnumNom est un tableau de chaînes
    tabEnumVal est un tableau de System.Object dynamique
    LeType est un System.Type dynamique  =  "System".Type.GetType("System.Xml.XmlNodeType, " + ...
    ExtraitChaîne(FQN,2,",") + "," + ExtraitChaîne(FQN,3,",") + "," + ExtraitChaîne(FQN,4,",")+ "," + ExtraitChaîne(FQN,5,","))  
    tabEnumNom = Enum.GetNames(LeType)
    tabEnumVal = Enum.GetValues(LeType)
    POUR i = 1 _A_ tabEnumNom..Occurrence
    Trace(tabEnumNom[i]," : " ,Convert.ToInt32(tabEnumVal[i]))
    FIN
    et voici le résultat chez moi :

    Nom : Windev-FQN-Enum.png
Affichages : 1175
Taille : 15,1 Ko

    Citation Envoyé par Hemgé Voir le message
    Et ... un autre challenge : pourrait-on faire la même chose sur une énumération Windev ?
    je ne vais pas pouvoir beaucoup t'aider sur ce coup là car je n'ai que la version 16 de Windev et les énumérations sont apparues en version 18.

    Ami calmant, J.P
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  6. #6
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Citation Envoyé par jurassic pork Voir le message
    je ne vais pas pouvoir beaucoup t'aider sur ce coup là car je n'ai que la version 16 de Windev et les énumérations sont apparues en version 18.
    M'enfin ... Et Windev Express ?
    Parce que ces énumérations, ça parait génial à prime abord, mais comme souvent quand on veut passer aux travaux pratiques, il manque un 'petit' quelque chose. 'Petit', mais essentiel.

    Et il faudra attendre au moins la V23, puisque cela n'existe pas dans la V21 et n'est pas annoncé dans la V22.

    En tout cas, merci pour tout le reste, cela sera très précieux à l'usage (et sans doute aussi pour l'étude).

    Très bon week-end

    Hemgé

  7. #7
    Membre émérite
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    1 075
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 075
    Points : 2 441
    Points
    2 441
    Par défaut
    Bonjour,

    Voilà, pour ceux que cela intéresse et grâce à J.P, une petite procédure pour lister les énumérations DotNet.
    La discussion qui précède introduit suffisamment le sujet me semble-t-il.
    On passe le nom de l'énumération et l'objet qui permettra de référencer l'assemblage en paramètres, pour que la procédure soit générique.
    A chacun de pourvoir à sa gestion des erreurs.

    Appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    //Lister l'énumération XmlNodeType 
    clMonObjet est un System.Xml.XmlDocument 
    taTypeNoeud est un tableau associatif d'entiers = _NetEnumListe("System.Xml.XmlNodeType", clMonObjet)
    Procédure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    // Résumé : <Liste les membres et valeurs associées d'une énumération DotNet>
    // Syntaxe :
    //[ <Résultat> = ] _NetEnumListe (<prmLénum> est chaîne, <prmBaseAQN> est objet .NET)
    //
    // Paramètres :
    //	prmLénum (chaîne ANSI) : <Nom de l'énumération à lister>
    //	prmBaseAQN (objet .NET) : <Objet appartenant au même assemblage que prmLénum et supportant la méthode .GetType() >
    // Valeur de retour :
    // 	tableau associatif d'entiers sans doublon, avec le membre comme clé.
    //
    // Exemple :
    // Indiquez ici un exemple d'utilisation.
    // 
    // voir http://www.developpez.net/forums/d1611284/environnements-developpement/windev/recuperer-parcourir-enumeration-dotnet/#post8798527 
    // .GetType renvoie le Type, ce qui permet d'accéder à la propriété Type.AssemblyQualifiedName 
    // AQN pour Assembly Qualified Name 
    // FQN pour Fully Qualified Name 
    // 
    PROCEDURE _NetEnumListe(prmLénum est une chaîne, prmBaseAQN est un 'Object')  : tableau associatif d'entiers 
    taListeEnum est un tableau associatif d'entiers 
    tabNomTypeNoeud est un tableau de chaînes 
    tabValNoeud est un tableau de System.Object dynamique 
     
    monType est un  System.Type dynamique  =  prmBaseAQN.gettype()
    sFQN est une chaîne = monType.AssemblyQualifiedName //monType.get_AssemblyQualifiedName() 
    sFQN = sFQN[[Position(sFQN, ",") A ]] 
    pclLeType est un System.Type dynamique = "System".Type.GetType(prmLénum + sFQN) 
     
    tabNomTypeNoeud = Enum.GetNames(pclLeType) 
    tabValNoeud = Enum.GetValues(pclLeType)
     
    POUR i = 1 _A_ tabNomTypeNoeud..Occurrence 
    	taListeEnum[tabNomTypeNoeud[i]] = Convert.ToInt32(tabValNoeud[i]) 
    	//taListeEnum[tabNomTypeNoeud[i]] = tabValNoeud[i] 
    FIN
     
    RENVOYER taListeEnum
    @ J.P
    Différences avec votre code :
    • En ligne 25, on peut récupérer directement la propriété .AssemblyQualifiedName, plutôt que d'appeler la méthode .get_AssemblyQualifiedName()
    • En remarque ligne 34, j'ai testé l'affectation directe de l'objet obtenu par Enum.GetValues() et Windev fait automatiquement la conversion.
      Je préfère personnellement conserver la conversion explicite comme proposée.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Parcourir les différentes valeurs d'une énumération
    Par mister3957 dans le forum Général VBA
    Réponses: 4
    Dernier message: 09/03/2008, 09h07
  2. parcourir une énumération
    Par seiky dans le forum Windows Forms
    Réponses: 8
    Dernier message: 30/07/2007, 15h44
  3. Est-il possible de récupérer une énumération
    Par ProgElecT dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 12/01/2007, 20h28
  4. Récupérer les éléments d'une énumération
    Par The eye dans le forum VB.NET
    Réponses: 3
    Dernier message: 11/01/2007, 09h45
  5. Parcourir une image pour récupérer le min et le max
    Par Premium dans le forum Traitement d'images
    Réponses: 3
    Dernier message: 14/11/2006, 22h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo