[Basic] Exploiter Valeurs et Identifiants dans une Listbox

Discussions et questions sur tout ce qui concerne la programmation tous langages et tous modules confondus.

Modérateur : Vilains modOOs

Règles du forum
:alerte: 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 !
Tiogran
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 16 nov. 2016 18:31

[Basic] Exploiter Valeurs et Identifiants dans une Listbox

Message par Tiogran »

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
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
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 9254
Inscription : 28 août 2010 08:45

Re: [Basic] Propriété ItemId de ItemEvent

Message par micmac »

Bonjour,
Dans votre signature il y a écrit :Libre Office 5.4.6.2
Cette version de LibO est obsolète.
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
Tiogran
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 16 nov. 2016 18:31

Re: [Basic] Propriété ItemId de ItemEvent

Message par Tiogran »

Bonjour,

C'est fait
Oui en plus je l'ai mis à jour il y a quelques heures tout juste sur mon poste actuel :lol:
Libre Office 6.3.4.2
Linux Mint et Windows 7,8 et 10
Avatar de l’utilisateur
micmac
RespOOnsable forum
RespOOnsable forum
Messages : 9254
Inscription : 28 août 2010 08:45

Re: [Basic] Propriété ItemId de ItemEvent

Message par micmac »

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
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Basic] Propriété ItemId de ItemEvent

Message par Dude »

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 :
  1. insérer dans le corps du message le code de la macro exposant le problème
  2. joindre un document explicatif intégrant cette macro avec les données de départ (doc1) et le résultat à obtenir (doc2)
  3. fournir un mode pas-à-pas permettant de reproduire ce qui a été fait ou ce qui est cherché à faire pour arriver au problème
  4. ajouter des copies écran (situation avant / après) afin de mieux comprendre
Merci de publier ces informations à la suite.
Tiogran
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 16 nov. 2016 18:31

Re: [Basic] Propriété ItemId de ItemEvent

Message par Tiogran »

Bonjour Dude,

Je comprends bien ton propos et je m'excuse de devoir te le faire rappeller une énième fois :oops: 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
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Basic] Propriété ItemId de ItemEvent

Message par Dude »

Tiogran a écrit :et mis à jour le message initial
Non, ce n'est pas bon.
Dude a écrit :Merci de publier ces informations à la suite.
Sans quoi la logique de lecture n'est pas respectée et on n'y comprend plus rien.

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.
capture.png
Tes macros sont donc à brancher sur l'action souhaitée.
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Tiogran
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 16 nov. 2016 18:31

Re: [Basic] Propriété ItemId de ItemEvent

Message par Tiogran »

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:

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


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()

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
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:

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
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

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
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.
allitems.jpg
Ensuite elle offre deux résultat par index (miam, miam)
itemid.ods
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
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:

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
Alors, je veux bien croire que ma concentration s'émousse mais là çà tient du miracle par ce que celà ne fonctionne plus... :fou: Je vais aller écouter les oiseaux dehors un moment je crois
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
Avatar de l’utilisateur
Dude
IdOOle de la suite
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

Message par Dude »

Ton monologue ne nous dit toujours pas ce que tu cherches à faire avec une zone de liste dans un dialogue.
Tiogran
Membre lOOyal
Membre lOOyal
Messages : 27
Inscription : 16 nov. 2016 18:31

Re: [Basic] Exploiter Valeurs et Identifiants dans une Listb

Message par Tiogran »

Dude a écrit :Ton monologue
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.
ne nous dit toujours pas ce que tu cherches à faire avec une zone de liste dans un dialogue.
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.

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
Avatar de l’utilisateur
Dude
IdOOle de la suite
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

Message par Dude »

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
Tout cela me semble bien compliqué...
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.