[Basic] Exploiter Valeurs et Identifiants dans une Listbox
Modérateur : Vilains modOOs
Règles du forum
Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
Balisage obligatoire dans cette section !
Aidez-nous à vous aider au mieux en balisant correctement votre question : reportez-vous sur les règles de cette section avant de poster !
-
- Membre lOOyal
- Messages : 27
- Inscription : 16 nov. 2016 18:31
[Basic] Exploiter Valeurs et Identifiants dans une Listbox
Bonjour,
Sur cette page https://api.libreoffice.org/docs/idl/re ... cf5e6d7205 sont présentées les propriétés retournées par un évènement provenant de XItemListener.
Dans ces propriétés, une m'interpelle particulièrement ItemId. J'ai lançé une recherche avec comme mot clé "ItemId" sur ce forum mais aucun intitulé de message n'évoque ce sujet à première vue.
En pratique, quelque soit l'item d'une zone liste sélectionné l'ItemId renvoyé reste le même mais je me dis que quelque part cette propriété doit avoir la possibilité d'être renseigné dans le control lui-même au moment de sa construction par exemple. Ceci aurait pour résultat ce que nombre de language font déja c'est à dire hydrater une zone de liste avec comme valeurs visibles un libelle et comme valeur caché un identifiant.
Alors au début, je croyais que la méthode addItem() répondait à cela puisqu'elle comprends deux arguments un pour la valeur et un pour la position mais là encore en pratique même si je fournis en position l'identifiant comme ordre dans la liste, la construction du controle redefinit de lui-même pour éviter des "trous" dans l'index de la zone de liste si je puis dire... Ex si je fournit trois items avec id(1,4,7) la zone de liste mettra en index 0 l'id 1, en index 1 l'id 4 etc..
Malheureusement voilà un moment que je cherche sans trouver
Ma lecture de l'API est encore balbutiante, peut-être pourriez-vous m'aider...
D'avance merci,
tiogran
Sur cette page https://api.libreoffice.org/docs/idl/re ... cf5e6d7205 sont présentées les propriétés retournées par un évènement provenant de XItemListener.
Dans ces propriétés, une m'interpelle particulièrement ItemId. J'ai lançé une recherche avec comme mot clé "ItemId" sur ce forum mais aucun intitulé de message n'évoque ce sujet à première vue.
En pratique, quelque soit l'item d'une zone liste sélectionné l'ItemId renvoyé reste le même mais je me dis que quelque part cette propriété doit avoir la possibilité d'être renseigné dans le control lui-même au moment de sa construction par exemple. Ceci aurait pour résultat ce que nombre de language font déja c'est à dire hydrater une zone de liste avec comme valeurs visibles un libelle et comme valeur caché un identifiant.
Alors au début, je croyais que la méthode addItem() répondait à cela puisqu'elle comprends deux arguments un pour la valeur et un pour la position mais là encore en pratique même si je fournis en position l'identifiant comme ordre dans la liste, la construction du controle redefinit de lui-même pour éviter des "trous" dans l'index de la zone de liste si je puis dire... Ex si je fournit trois items avec id(1,4,7) la zone de liste mettra en index 0 l'id 1, en index 1 l'id 4 etc..
Malheureusement voilà un moment que je cherche sans trouver
Ma lecture de l'API est encore balbutiante, peut-être pourriez-vous m'aider...
D'avance merci,
tiogran
Dernière modification par Tiogran le 10 janv. 2020 12:26, modifié 4 fois.
Libre Office 6.3.4.2
Linux Mint et Windows 7,8 et 10
Linux Mint et Windows 7,8 et 10
-
- RespOOnsable forum
- Messages : 9254
- Inscription : 28 août 2010 08:45
Re: [Basic] Propriété ItemId de ItemEvent
Bonjour,
Si c'est une obligation, mentionnez-le dans votre signature par Obligation de version.
Afin de profiter des dernières améliorations, il est fortement recommandé d'être à jour de la dernière version stable.
Accès direct à votre signature pour la corriger.
Cette version de LibO est obsolète.Dans votre signature il y a écrit :Libre Office 5.4.6.2
Si c'est une obligation, mentionnez-le dans votre signature par Obligation de version.
Afin de profiter des dernières améliorations, il est fortement recommandé d'être à jour de la dernière version stable.
Accès direct à votre signature pour la corriger.
Touche Ctrl de Windows = touche cmd⌘ sur Mac
Outils > Options sur Windows = OpenOffice > Préférences sur Mac
Outils > Options sur Windows = OpenOffice > Préférences sur Mac
-
- Membre lOOyal
- Messages : 27
- Inscription : 16 nov. 2016 18:31
Re: [Basic] Propriété ItemId de ItemEvent
Bonjour,
C'est fait
Oui en plus je l'ai mis à jour il y a quelques heures tout juste sur mon poste actuel
C'est fait
Oui en plus je l'ai mis à jour il y a quelques heures tout juste sur mon poste actuel
Libre Office 6.3.4.2
Linux Mint et Windows 7,8 et 10
Linux Mint et Windows 7,8 et 10
-
- RespOOnsable forum
- Messages : 9254
- Inscription : 28 août 2010 08:45
Re: [Basic] Propriété ItemId de ItemEvent
La version 6.3.4 que vous avez installée est une version expérimentale. La version que préconise le forum est la version stable 6.2.8.
Touche Ctrl de Windows = touche cmd⌘ sur Mac
Outils > Options sur Windows = OpenOffice > Préférences sur Mac
Outils > Options sur Windows = OpenOffice > Préférences sur Mac
-
- IdOOle de la suite
- Messages : 25181
- Inscription : 03 mars 2006 07:45
- Localisation : 127.0.0.1
Re: [Basic] Propriété ItemId de ItemEvent
Problème XY
Encore et toujours, pour être aidé efficacement par les bénévoles et surtout leur faire gagner du temps, il faut systématiquement fournir les éléments suivants :
Encore et toujours, pour être aidé efficacement par les bénévoles et surtout leur faire gagner du temps, il faut systématiquement fournir les éléments suivants :
- insérer dans le corps du message le code de la macro exposant le problème
- joindre un document explicatif intégrant cette macro avec les données de départ (doc1) et le résultat à obtenir (doc2)
- fournir un mode pas-à-pas permettant de reproduire ce qui a été fait ou ce qui est cherché à faire pour arriver au problème
- ajouter des copies écran (situation avant / après) afin de mieux comprendre
-
- Membre lOOyal
- Messages : 27
- Inscription : 16 nov. 2016 18:31
Re: [Basic] Propriété ItemId de ItemEvent
Bonjour Dude,
Je comprends bien ton propos et je m'excuse de devoir te le faire rappeller une énième fois mais quoiqu'il en soit, je ne me lance pas dans l'écriture d'un fonctionnalité sans auparavant avoir trouvé l'itinéraire à suivre dans l'api car s'il n'est pas décelable dans l'api (peut-être que je me trompe) il me semble quand même qu'il le sera encore moins avec un document et un xray.
Malgré tout, je peux comprendre qu'un document reproduisant le constat fait puisse être illustré. Je le joins sous peu
Je comprends bien ton propos et je m'excuse de devoir te le faire rappeller une énième fois mais quoiqu'il en soit, je ne me lance pas dans l'écriture d'un fonctionnalité sans auparavant avoir trouvé l'itinéraire à suivre dans l'api car s'il n'est pas décelable dans l'api (peut-être que je me trompe) il me semble quand même qu'il le sera encore moins avec un document et un xray.
Malgré tout, je peux comprendre qu'un document reproduisant le constat fait puisse être illustré. Je le joins sous peu
Dernière modification par Tiogran le 10 janv. 2020 08:47, modifié 1 fois.
Libre Office 6.3.4.2
Linux Mint et Windows 7,8 et 10
Linux Mint et Windows 7,8 et 10
-
- IdOOle de la suite
- Messages : 25181
- Inscription : 03 mars 2006 07:45
- Localisation : 127.0.0.1
Re: [Basic] Propriété ItemId de ItemEvent
Non, ce n'est pas bon.Tiogran a écrit :et mis à jour le message initial
Sans quoi la logique de lecture n'est pas respectée et on n'y comprend plus rien.Dude a écrit :Merci de publier ces informations à la suite.
Comme déjà répété, problème XY.
Quel est l'objectif ?
Les événements d'un contrôle sont gérés via l'EDI. Tes macros sont donc à brancher sur l'action souhaitée.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
-
- Membre lOOyal
- Messages : 27
- Inscription : 16 nov. 2016 18:31
Re: [Basic] Propriété ItemId de ItemEvent
En guise d'illustration je mets en pièce jointe un classeur avec un bouton permettant d'ouvrir une boite de dialogue. Cette boite de dialogue comprends une zone de liste avec un jeu de données sommaire et en dessous les variables retournées par l'évènement suivi par "Statut modifié"
Voici la source:
J'ai isolé la partie hydratation sur la fonction hydrateZl() du reste du code. En principe, la modification à apporter y serait contenue.
Le fichier est joint.
La routine ItemStateChanger est rattaché à l'évènement "Statut Modifié".
Pistes d'évolution
1 - méthode setItemdata(position integer, data any)) du model du control.
J'ai modifié la fonction hydrateZl()
Aucune erreur n'est renvoyée donc a priori celà fonctionne. Je me dis qu'à tout setter il y a un getter et c'est bien le cas il existe une autre méthode getItemData(pos integer) sur ce même model du control. Cette méthode est donc appliquée après l'évènement et donc dans la routine déclenchée par celui-ci et pour le coup je fais le choix de remonter depuis l'évènement comme ceci:
Mais l'affichage ne donne rien car la méthode renvoit un résultat nul. Bon là j'en perd mon latin, quelque chose m'échappe...
2 - propriété allItems(pos integer)
En fouillant encore un peu je tombe sur un getter interressant que je teste avec un xray
Je modifie la routine ItemStateChanged() de cette façon et je commente l'instruction print précedemment mise en place
Voilà pourquoi elle est interressante
Déja elle regroupe tout les items atteignables par un index. A priori la position difficile à dire puisque je ne l'ai pas setter directement. Ensuite elle offre deux résultat par index (miam, miam) Par contre, je ne sais pas comment setter la propriété Second...
Voilà pour l'heure, je fais une petite pause pour me pencher sur "Problème XY" afin de m'informer des uss et coutumes bienvenues ici car solliciter trop les modérateurs n'est pas volontaire de ma part; bien au contraire.
Edit: J'ai changé le titre du post, en effet comme expliqué dans Probleme XY, le titre évoque plus une solution éventuelle Y pour un problème X qui mérite d'être clairement expliqué dans le titre.
Ensuite, pour commencer j'ai commis une erreur si la méthode addItem() demande une position sous le type Integer, la méthode setItemData() elle requiert un type Long (dois y avoir une raison mais çà me saute pas au yeux).
Dans mon problème j'ai tout de même trouvé une solution:
Alors, à un moment je me suis dit pour insérer les données pourquoi ne pas utiliser la méthode setItemText() mais une erreur m'est renvoyé de type Out of Bounds (autrement dit la position demandée n'existe pas je présume); je n'ai pas encore cherché à comprendre (chaque chose en son temps).
Maintenant j'aimerai optimiser ce code, je remarque que je réalise quand même deux fois la même boucle alors pourquoi pas remettre les instructions de la seconde dans la première.
comme ceci:
Alors, je veux bien croire que ma concentration s'émousse mais là çà tient du miracle par ce que celà ne fonctionne plus... Je vais aller écouter les oiseaux dehors un moment je crois
Voici la source:
Code : Tout sélectionner
REM ***** BASIC *****
OPTION EXPLICIT
Public DIAL as object
Public DATAS(2) as variant
Public ZL as object
SUB testItemIdFromEvt()
Dim theLib, dialModel, lstn as object
'Le jeu de données
DATAS(0) = array(1, "valeur1")
DATAS(1) = array(2, "valeur2")
DATAS(2) = array(3, "valeur3")
'Ouverture de la boite de dialogue
DialogLibraries.loadLibrary("Standard")
theLib = DialogLibraries.getByName("Standard")
dialModel = theLib.getByName("dial")
DIAL = CreateUnoDialog(dialModel)
'Hydratation de la zone de liste
ZL = DIAL.getControl("zl")
hydrateZl()
'affichage de la boite de dialogue
DIAL.execute()
END SUB
FUNCTION hydrateZl()
dim data as variant
dim n as integer
for each data in DATAS
'méthode d'hydratation
ZL.addItem(data(1), n)'note: addItem(valeur 'string', position dans la liste 'integer')
next
END FUNCTION
Sub ItemStateChanged(evt as object)
DIAL.getControl("selected").model.text = evt.selected
DIAL.getControl("highlighted").model.text = evt.highlighted
DIAL.getControl("itemid").model.text = evt.itemid
End Sub
Le fichier est joint.
La routine ItemStateChanger est rattaché à l'évènement "Statut Modifié".
Pistes d'évolution
1 - méthode setItemdata(position integer, data any)) du model du control.
J'ai modifié la fonction hydrateZl()
Code : Tout sélectionner
FUNCTION hydrateZl()
Dim data as variant
dim n as integer
n = 0
for each data in DATAS
'méthode d'hydratation
ZL.addItem(data(1), n)'note: addItem(valeur 'string', position dans la liste 'integer')
ZL.model.setItemData(n, data(0))'note: setItemData(position 'integer', une data 'any')
n = n + 1
next
END FUNCTION
Code : Tout sélectionner
SUB ItemStateChanged(evt as object)
DIAL.getControl("selected").model.text = evt.selected
DIAL.getControl("highlighted").model.text = evt.highlighted
DIAL.getControl("itemid").model.text = evt.itemid
print evt.source.model.getItemData(evt.selected)
END SUB
2 - propriété allItems(pos integer)
En fouillant encore un peu je tombe sur un getter interressant que je teste avec un xray
Je modifie la routine ItemStateChanged() de cette façon et je commente l'instruction print précedemment mise en place
Code : Tout sélectionner
SUB ItemStateChanged(evt as object)
xray evt
DIAL.getControl("selected").model.text = evt.selected
DIAL.getControl("highlighted").model.text = evt.highlighted
DIAL.getControl("itemid").model.text = evt.itemid
'print evt.source.model.getItemData(evt.selected)
END SUB
Déja elle regroupe tout les items atteignables par un index. A priori la position difficile à dire puisque je ne l'ai pas setter directement. Ensuite elle offre deux résultat par index (miam, miam) Par contre, je ne sais pas comment setter la propriété Second...
Voilà pour l'heure, je fais une petite pause pour me pencher sur "Problème XY" afin de m'informer des uss et coutumes bienvenues ici car solliciter trop les modérateurs n'est pas volontaire de ma part; bien au contraire.
Edit: J'ai changé le titre du post, en effet comme expliqué dans Probleme XY, le titre évoque plus une solution éventuelle Y pour un problème X qui mérite d'être clairement expliqué dans le titre.
Ensuite, pour commencer j'ai commis une erreur si la méthode addItem() demande une position sous le type Integer, la méthode setItemData() elle requiert un type Long (dois y avoir une raison mais çà me saute pas au yeux).
Dans mon problème j'ai tout de même trouvé une solution:
Code : Tout sélectionner
FUNCTION hydrateZl()
Dim data as variant
Dim p as integer
Dim i as long
p = 0
i = 0
for each data in DATAS
ZL.addItem(data(1), p)
p = p + 1
next
i = 0
for each data in DATAS
ZL.model.setItemData(i, data(0))
i = i + 1
next
END FUNCTION
Maintenant j'aimerai optimiser ce code, je remarque que je réalise quand même deux fois la même boucle alors pourquoi pas remettre les instructions de la seconde dans la première.
comme ceci:
Code : Tout sélectionner
FUNCTION hydrateZl()
Dim data as variant
Dim p as integer
Dim i as long
p = 0
i = 0
for each data in DATAS
ZL.addItem(data(1), p)
p = p + 1
ZL.model.setItemData(i, data(0))
i = i + 1
next
END FUNCTION
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office 6.3.4.2
Linux Mint et Windows 7,8 et 10
Linux Mint et Windows 7,8 et 10
-
- IdOOle de la suite
- Messages : 25181
- Inscription : 03 mars 2006 07:45
- Localisation : 127.0.0.1
Re: [Basic] Exploiter Valeurs et Identifiants dans une Listb
Ton monologue ne nous dit toujours pas ce que tu cherches à faire avec une zone de liste dans un dialogue.
-
- Membre lOOyal
- Messages : 27
- Inscription : 16 nov. 2016 18:31
Re: [Basic] Exploiter Valeurs et Identifiants dans une Listb
Bonjour Dude, merci de ta réponse qui déja le fait moins apparraitre ainsi. Celà dit, j'ai l'habitude d'avancer seul et celà ne me dérange pas mais je ne veux pas laisser ce post en impasse.Dude a écrit :Ton monologue
Aie, j'ai du mal m'exprimer et tu me fait poser la question que je n'ai pas du me poser très clairement.ne nous dit toujours pas ce que tu cherches à faire avec une zone de liste dans un dialogue.
Par priorité:
1 - La contrainte principale est de ne pas m'appuyer sur du traitement en "dur" (macro rattaché à l'EDI par exemple je dois éviter) mais uniquement en script (j'ai mes propres raisons et si tu veux nous pouvons en discuter mais ici ce n'est peut être pas le bon endroit)
2 - L'idéal est une méthode qui permette d'approvisionner une Listbox avec comme valeurs affichées une valeur de type string mais par ailleurs les identifiants qui lui sont associés afin d'exploiter pleinement les capacités d'un système de base de données relationnel. A la sélection d'une valeur, je ne récupère pas la valeur mais bien l'identifiant pour un traitement ultérieur.
3 - La provenance des données est encore indéfinie. Je ne sais pas encore si je me fixe comme objectif de partir sur la base d'objets classiques (tableaux, collection) ou d'objet plus spécifiques (RowSet, ResulSet...). Peux-être devrais-je dévellopper les deux...
En espérant que ma réponse soit claire, est ce que c'est le cas pour toi?
Merci
cordialement,
tiogran
PS: je dois m'absenter jusqu'à demain soir
Libre Office 6.3.4.2
Linux Mint et Windows 7,8 et 10
Linux Mint et Windows 7,8 et 10
-
- IdOOle de la suite
- Messages : 25181
- Inscription : 03 mars 2006 07:45
- Localisation : 127.0.0.1
Re: [Basic] Exploiter Valeurs et Identifiants dans une Lis
Tout cela me semble bien compliqué...L'idéal est une méthode qui permette d'approvisionner une Listbox avec comme valeurs affichées une valeur de type string mais par ailleurs les identifiants qui lui sont associés
Tu as toujours l'option d'avoir une liste masquée qui contient des identifiants ou encore de passer par un tableau (array) déclaré en variable globale.