[Basic] Utilisation du service EnumerableMap

Vos meilleures macros et portions de code sont publiées dans cette section.
Aucun support sur une question de programmation ici !

Modérateur: Vilains modOOs

Règles du forum
Aucune question dans cette section !
Celle-ci rassemble les meilleures macros et portions de code. Vous pouvez en revanche commenter ou argumenter le code exposé. Vous pouvez même remercier l'auteur (cela fait toujours plaisir) en indiquant par exemple dans quel cadre ou contexte vous en avez eu l'utilité.
Si vous avez à poster quelque chose, faites-le depuis la section Macros et API et demandez à un modérateur de l'y déplacer.

[Basic] Utilisation du service EnumerableMap

Messagepar Churay » 29 Nov 2016 16:27

Hubert Lambert Inside :

Code : Tout sélectionner   AgrandirRéduire
em = com.sun.star.container.EnumerableMap.create("string","[]string")
em.put("A", array("Albert","Annie"))
em.put("B", array("Bernard", "Béatrice"))
em.put("C", array("Christophe", "Cécile"))
em.put("D", array("Dominique", "Didier"))
B = em.get("B")
for each nom in B
    print nom
next nom
Dernière édition par Churay le 30 Nov 2016 10:57, édité 1 fois.
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 4.2.8.2 Debian 7.8 & Ubuntu 14.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
 
Message(s) : 2534
Inscrit le : 30 Avr 2009 06:54
Localisation : CATALUNYA

Re: Utilisation du service EnumerableMap

Messagepar Hubert Lambert » 29 Nov 2016 16:40

Pour l'instanciation en basic, la source est ici : https://forum.openoffice.org/en/forum/v ... 56#p385856.
:wink:
AOOo 4.1.2 sur Win7 | LibreOffice 5.x sur divers systèmes Linux
--
« Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
Membre enthOOusiaste
Membre enthOOusiaste
 
Message(s) : 402
Inscrit le : 06 Avr 2016 09:26

Re: [Basic] Utilisation du service EnumerableMap

Messagepar Churay » 30 Nov 2016 17:28

L'interface xMap permet de décrire une map (relation entre clés et valeurs).
L'interface XEnumerableMap étend XMap avec la possibilité d'énumération (XElementAccess)

Le service EnumerableMap fournit l'implémentation de l'interface. voir la doc de l'API pour les types de clés et de valeurs

Pour faire simple : cela permet de créer des ARRAY évolués : clé1, valeur1 ; clé2, valeur2 ; ...

La possibilité d'énumération permet de rechercher une valeur à partir de sa clé (.get) au lieu de balayer l'ARRAY à la recherche de la clé.

Dans le code d'Hubert Lambert,
Code : Tout sélectionner   AgrandirRéduire
    em = com.sun.star.container.EnumerableMap.create("string","[]string")
Création du container.

Code : Tout sélectionner   AgrandirRéduire
    em.put("A", array("Albert","Annie"))
    em.put("B", array("Bernard", "Béatrice"))
    em.put("C", array("Christophe", "Cécile"))
    em.put("D", array("Dominique", "Didier"))
Création de chaque couple clé/valeur, la valeur associé est un ARRAY

Code : Tout sélectionner   AgrandirRéduire
    B = em.get("B")
Récupération de la valeur associée à la clé "B"

Code : Tout sélectionner   AgrandirRéduire
    for each nom in B
        print nom
    next nom
S'agissant d'un ARRAY, balayage des éléments de l'ARRAY.

L'approche de bm sur le forum anglophone permet de découvrir d'autres possibilités
Code : Tout sélectionner   AgrandirRéduire
      enu = .createKeyEnumeration(False)
      Do While enu.hasMoreElements
         elem = enu.nextElement
         MsgBox("Key : " & elem, 0, "createKeyEnumeration")
      Loop
permet d'accéder à la clé

Code : Tout sélectionner   AgrandirRéduire
      enu = .createValueEnumeration(False)
      Do While enu.hasMoreElements
         elem = enu.nextElement
         MsgBox("Value : " & elem, 0, "createValueEnumeration")
      Loop
permet d'accéder à la valeur

Code : Tout sélectionner   AgrandirRéduire
      enu = .createElementEnumeration(False)
      Do While enu.hasMoreElements
         elem = enu.nextElement
         MsgBox("Key : " & elem.First & _
            chr(10) & "Value : " & elem.Second, 0, "createElementEnumeration")
      Loop
permet d'accéder au couple clé (elem.First) / valeur (elem.Second)

Adapté au code de Hubert Lambert, cela pourrait donner
Code : Tout sélectionner   AgrandirRéduire
Sub Main
Dim enu AS Object, elem, aNom()

   em = com.sun.star.container.EnumerableMap.create("string","[]string")
   em.put("A", array("Albert","Annie"))
   em.put("B", array("Bernard", "Béatrice"))
   em.put("C", array("Christophe", "Cécile"))
   em.put("D", array("Dominique", "Didier"))

   enu = em.createElementEnumeration(False)
   Do While enu.hasMoreElements
      elem = enu.nextElement
      aNom = elem.Second
      MsgBox("Key : " & elem.First & chr(10) & "Value : " & aNom(0) & " - " & aNom(1), 0, "createElementEnumeration")
   Loop
End Sub
Sachant que dans l'exemple, l'ARRAY n'a que deux éléments, j'accède directement à aNom(0) et aNom(1). Un truc plus fiable serait de déterminer UBOUND.

Ici, il s'agit d'une approche simple, voire simpliste, mais qui permet d'entrevoir des possibilités intéressantes, entre autres au niveau performances.
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 4.2.8.2 Debian 7.8 & Ubuntu 14.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
 
Message(s) : 2534
Inscrit le : 30 Avr 2009 06:54
Localisation : CATALUNYA


Retour vers Suprême de code

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 1 invité