[Résolu][Calc]Ajouter Contrôle dans boite de dialogue

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 !
Drake
Membre cOOnfirmé
Membre cOOnfirmé
Messages : 299
Inscription : 02 févr. 2012 00:51

[Résolu][Calc]Ajouter Contrôle dans boite de dialogue

Message par Drake »

Bonsoir,
Je voudrai créer dynamiquement, par macro, un champ numérique dans une boite de dialogue existante.
Merci de votre aide.

Je viens de voir l'exemple de Dude. http://user.services.openoffice.org/fr/ ... +dynamique
Je vais l'étudier et revenir vers vous si je rencontre des problèmes.
Dernière modification par Drake le 12 nov. 2019 00:38, modifié 3 fois.
LibreOffice 6.2.7.1 (x64), Java (64b), Windows 10 (64b)
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 00:17
Localisation : gâtine deux-sèvrienne

Re: [Calc]Creer dynamiquement champ dans boite de dialogue

Message par luky-luke »

Bonjour
Je sors mon colt :wink:
Avec 258 messages au compteur un minimum de recherche s'impose avant de poser une question :roll:
Donc un petit tour dans les suprêmes

Gestion dynamique de dialogue
J'ai dégainé trop vite :lol:
Un indice pour faciliter la chose
"com.sun.star.awt.UnoControlNumericFieldModel"
Cordialement
Luke
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
Drake
Membre cOOnfirmé
Membre cOOnfirmé
Messages : 299
Inscription : 02 févr. 2012 00:51

Re: [Calc]Creer dynamiquement champ dans boite de dialogue

Message par Drake »

re,

Je n'y arrive pas :(

J'ai essayé d'adapter le code de Dude mais ça ne marche pas.

J'ai fait un petit bout de code pour faire des essais.
Quelqu'un pourrait y jeter un œil et me dire pourquoi ça ne fonctionne pas ?
CreaBouton 1.ods
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 6.2.7.1 (x64), Java (64b), Windows 10 (64b)
Avatar de l’utilisateur
Noonours
PassiOOnné
PassiOOnné
Messages : 501
Inscription : 11 mai 2013 00:11
Localisation : Aix en Provence

Re: [Calc]Creer dynamiquement champ dans boite de dialogue

Message par Noonours »

Bonjour,
Drake a écrit : [...] ça ne marche pas.
Merci d'être plus précis, explique ce qui ne fonctionne pas :|
Drake a écrit :J'ai fait un petit bout de code pour faire des essais
Le fichier joint ne comporte aucune macro...
 Ajout : Sur la base du script de Dude, essaye ceci, à insérer dans ton code:

Code : Tout sélectionner

Sub Dlg_NumField( x As Long, y As Long, larg As Long, haut As Long, cNom As String)

   oNumFieldModele = oDlgModele.createInstance( "com.sun.star.awt.UnoControlNumericFieldModel" )

   oNumFieldModele.PositionX = x
   oNumFieldModele.PositionY = y
   oNumFieldModele.Width = larg
   oNumFieldModele.Height = haut
   oNumFieldModele.Name = cNom

   oDlgModele.insertByName( cNom, oNumFieldModele )

End Sub
 
Cordialement,
Dernière modification par Noonours le 10 nov. 2019 23:41, modifié 1 fois.
Noonours procrastinateur perfectionniste: "Je fais rien, mais demain je l'ferai mieux"

Pour obtenir la réponse la plus précise possible, VEUILLEZ JOINDRE UN FICHIER

LibO 7.6.5.2 Stable et OpenOffice 4.1.15 sous Windows 10
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 00:17
Localisation : gâtine deux-sèvrienne

Re: [Calc]Creer dynamiquement champ dans boite de dialogue

Message par luky-luke »

Bonjour
Ta Macro n'était pas dans le document... :evil: Un exemple d'ajout d'un champ numérique dans une boite de dialogue (nom par défaut Dialog1)construite à partir de l'EDI ou il n'y a qu'un bouton de validation OK présent,

Code : Tout sélectionner

Sub Insert_ChampNum
Dim oDlg As Object, oNumModel As Object, oNumControl As Object
	DialogLibraries.LoadLibrary("Standard")
	oDlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
	oNumModel = oDlg.Model.createInstance( "com.sun.star.awt.UnoControlNumericFieldModel" )
	oDlg.Model.insertByName( "MonChampNumérique",oNumModel ) 
	oNumControl = oDlg.getControl("MonChampNumérique")
	oNumControl.setPosSize(60, 20, 78, 25, com.sun.star.awt.PosSize.POSSIZE)	'position et dimension
	if oDlg.Execute = com.sun.star.ui.dialogs.ExecutableDialogResults.OK Then
		MsgBox("la Valeur ecrite dans mon Champs Numerique est : " & oNumControl.Value)
	End if 
End Sub
 Ajout : Merci d'être plus précis, explique ce qui ne fonctionne pas 
+1 je suis d'accord avec Noonours c'est un peu court :lol:
Cordialement
Luke
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
Drake
Membre cOOnfirmé
Membre cOOnfirmé
Messages : 299
Inscription : 02 févr. 2012 00:51

Re: [Calc]Creer dynamiquement champ dans boite de dialogue

Message par Drake »

Bonsoir,

Merci de ton aide,
Le fichier joint ne comporte aucune macro...
oui, désolé je joins un nouveau fichier
Merci d'être plus précis, explique ce qui ne fonctionne pas
Dans la boite de dialogue j'ai mis un bouton qui appelle la macro qui est sensée créer un deuxième bouton dans la boite de dialogue.
A l’exécution j'obtiens ce message d'erreur:
Erreur d'exécution BASIC.
Propriété ou méthode non trouvée : createInstance.
CreaBouton 1.ods
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 6.2.7.1 (x64), Java (64b), Windows 10 (64b)
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 00:17
Localisation : gâtine deux-sèvrienne

Re: [Calc]Creer dynamiquement champ dans boite de dialogue

Message par luky-luke »

Re
Ton fichier avec la macro corrigé. Je te laisse trouver les différences avec l'original. Le listener n'est pas utile c'est la boite de dialogue déjà existante (Dialog1) qui gère les événements. Si je peux donner mon avis, ce n'est pas une très bonne idée de créer un bouton de façon dynamique. La première raison, c'est lourd à mettre en place, la deuxième c'est qu'un second appui sur le bouton va créer une erreur.
Cordialement
Luke
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
Drake
Membre cOOnfirmé
Membre cOOnfirmé
Messages : 299
Inscription : 02 févr. 2012 00:51

Re: [Calc]Creer dynamiquement champ dans boite de dialogue

Message par Drake »

Re,

Merci luky-luke, ça marche très bien.
J'ai trouvé la différence (oDlg.Model).
Si je peux donner mon avis, ce n'est pas une très bonne idée de créer un bouton de façon dynamique. La première raison, c'est lourd à mettre en place, la deuxième c'est qu'un second appui sur le bouton va créer une erreur.
Certes mais c'est parce-que je ne sais pas d'avance combien de champs vont être utiles .
Je compte mettre un bouton de création de champ ---> Fait.
...c'est qu'un second appui sur le bouton va créer une erreur.
j'y travaille. A ce sujet sais-tu comment rendre invisible un bouton créé par macro ? ---> Fait
Et aussi comment assigner une macro à un bouton créé par macro ? De façon à créer un nouveau nouveau champ.
CreaBouton 1.ods
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Drake le 11 nov. 2019 13:41, modifié 1 fois.
LibreOffice 6.2.7.1 (x64), Java (64b), Windows 10 (64b)
Avatar de l’utilisateur
OOotremer971
ManitOOu
ManitOOu
Messages : 2744
Inscription : 16 avr. 2010 13:31

Re: [Calc]Creer dynamiquement champ dans boite de dialogue

Message par OOotremer971 »

Bonjour,

Un autre moyen de faire serait de rendre visibles ou invisibles certains contrôles en fonction du contexte. Tous les contrôles possèdent une propriété Step (pas) (page) dont il suffit de modifier la valeur pour qu'ils s'affichent ou non. Voir ici un début d'explication ici :arrow: : https://forum.openoffice.org/fr/forum/v ... 39#p330333. A mon avis ce sera plus simple à mettre en place et un peu moins usine à gaz.

A+
En principe, toujours à jour des dernières versions dites stables
AOO
LibreOffice
Debian 10 et 11
Drake
Membre cOOnfirmé
Membre cOOnfirmé
Messages : 299
Inscription : 02 févr. 2012 00:51

Re: [Calc]Creer dynamiquement champ dans boite de dialogue

Message par Drake »

Bonjour,

Merci OOotremer971 pour le lien.
J'ai regardé la vidéo de l'exemple et je trouve cela intéressant.
Néanmoins la mise en œuvre me parait complexe pour mon niveau et je ne suis pas sur que cela convienne à mon besoin.
Par ailleurs je ne vois pas la différence avec la propriété "setVisible" d'un contrôle.

Aussi je vais rester sur ma première idée d'ajout dynamique de contrôle(s) par macro dans une boite de dialogue existante.
Il me reste à trouver comment assigner une macro à un évènement d'un contrôle qui a été créé par macro.
Comme je ne suis pas sur d'être clair, voici en image l'équivalent de ce que je souhaite créer par macro (si c'est possible évidemment).
Capt1.jpg
Merci de votre aide.
CreaBouton 1.ods
Edit: Je viens de voire dans le livre "Programmation OpenOffice.org" de Bernard Macelly et Laurent Godard page 662 un code qui semble correspondre à ce que je cherche faire.
J'ai des difficultés à l’insérer dans mon code existant mais je vais persévérer néanmoins quitte à revenir vers vous si je bloque.
a+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 6.2.7.1 (x64), Java (64b), Windows 10 (64b)
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 00:17
Localisation : gâtine deux-sèvrienne

Re: [Calc]Creer dynamiquement champ dans boite de dialogue

Message par luky-luke »

Bonjour
En relisant le fil, je m'aperçoit que je t'ai induis en erreur.
luky-luke a écrit :Le listener n'est pas utile c'est la boite de dialogue déjà existante (Dialog1) qui gère les événements.
Pour récupérer la valeur d'un champ numérique ajouter dynamiquement ( c'est la question de départ) Il n'est pas nécessaire d'avoir une écoute (listener) sur la champ.
Pour l'ajout d'un bouton (tu devrais changer le titre du fil "Ajouter Contrôle dans boite de dialogue") le listener est nécessaire.
Un exemple qui résume l'ensemble de tes questions (Trop de questions dans un même fil, la patrouille va nous rattraper :wink: )
Ajout d'un champs numérique - Ajout d'un bouton - affectation d'une action - Bouton visible pas visible.

Code : Tout sélectionner

Public oDlg As Object
Public oNumControl As Object, oButtonControl As Object

Sub AfficheDialogue
	DialogLibraries.LoadLibrary("Standard")
	oDlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
	oDlg.Execute
End Sub

Sub Insert_Controle
Dim oNumModel As Object, oButtonModel As Object
	oNumModel = oDlg.Model.createInstance( "com.sun.star.awt.UnoControlNumericFieldModel" )
	oButtonModel = oDlg.Model.createInstance( "com.sun.star.awt.UnoControlButtonModel" )
	
	oDlg.Model.insertByName( "MonChampNumérique",oNumModel )
	oDlg.Model.insertByName( "LeBouton",oButtonModel )
	
	oNumControl = oDlg.getControl("MonChampNumérique")
	oButtonControl = oDLg.GetControl("LeBouton")
	oButtonControl.Model.Name = "Le_Bouton"
	oButtonControl.Visible = False

	oNumControl.setPosSize(40, 20, 75, 25, com.sun.star.awt.PosSize.POSSIZE)
	oButtonControl.setPosSize(180,20,75,25,com.sun.star.awt.PosSize.POSSIZE)
	
	PushButton = CreateUnoListener("LeBouton_", "com.sun.star.awt.XActionListener")
	oButtonControl.AddActionListener (PushButton)
End Sub

Sub Bouton_Visible(oEvt)
ListeControle() = oDlg.Controls
For i = 0 to Ubound(ListeControle())
Nom = ListeControle(i).Model.Name
	If ListeControle(i).Model.Name = "Le_Bouton" then
		If 	oButtonControl.isVisible = False Then
			oButtonControl.Visible = True
		Else
			oButtonControl.Visible = False
		End if
	End if
Next i
End Sub

Sub LeBouton_ActionPerformed(oEvt As Object)
Print "Coucou c'est MOA !"
End sub

Sub LeBouton_disposing(oEvt As Object)
End sub

Quant à assigner un événement souris sur une boite dialogue, j'ai jamais fais, c'est déjà une machine à gaz sur une simple feuille, alors sur une boite de dialogue :marto:
Bon courage
Luke
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
joel275
InconditiOOnnel
InconditiOOnnel
Messages : 839
Inscription : 10 janv. 2009 08:05

Re: [Calc]Creer dynamiquement champ dans boite de dialogue

Message par joel275 »

Bonsoir,
Drake a écrit :Il me reste à trouver comment assigner une macro à un évènement d'un contrôle qui a été créé par macro.
un exemple ici:

https://forum.openoffice.org/fr/forum/v ... nt#p315793

A plus.
A jour de LibreOffice et de Ubuntu
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
Messages : 936
Inscription : 27 nov. 2010 00:17
Localisation : gâtine deux-sèvrienne

Re: [Calc]Creer dynamiquement champ dans boite de dialogue

Message par luky-luke »

Bonjour
Drake a écrit :Il me reste à trouver comment assigner une macro à un évènement d'un contrôle qui a été créé par macro.
Pour assigner à un bouton une macro à un événement souris, il faut remplacer dans la macro que je donne plus haut et dans le fichier associé CreaBouton4

Code : Tout sélectionner

PushButton = CreateUnoListener("LeBouton_", "com.sun.star.awt.XActionListener")
oButtonControl.addActionListener(PushButton)
par

Code : Tout sélectionner

PushButton = CreateUnoListener("LeBouton_", "com.sun.star.awt.XMouseListener")
oButtonControl.addMouseListener(PushButton)
Et ajouter les quatre macro suivante

Code : Tout sélectionner

sub LeBouton_mousePressed(oEvt As Object)
End Sub

Sub LeBouton_MouseReleased(oEvt As Object)
Print "Coucou c'est MOA !"
End sub

Sub LeBouton_mouseEntered(oEvt As Object)
End Sub

Sub LeBouton_mouseExited(oEvt As Object)
End Sub
Les quatre macro sont obligatoire sous peine d'avoir un message d'erreur.
La macro disposing quant à elle ne change pas et est également obligatoire

Code : Tout sélectionner

Sub LeBouton_disposing(oEvt As Object)
End sub 
luky-luke a écrit :Quant à assigner un événement souris sur une boite dialogue, j'ai jamais fais
Ben voila ! c'est fait 8)
luky-luke a écrit :tu devrais changer le titre du fil "Ajouter Contrôle dans boite de dialogue"
Cordialement
Luke
AOO 4.1.3 et LibO 5.3.7.2 Ubuntu 16.04 LTS et Debian 9
Xray ne tient pas lieu de tout, mais une pratique sans Xray ne vaut pas grand chose
Drake
Membre cOOnfirmé
Membre cOOnfirmé
Messages : 299
Inscription : 02 févr. 2012 00:51

[RESOLU][Calc]Ajouter Contrôle dans boite de dialogue

Message par Drake »

Bonsoir,

N'ayant pas trouvé par moi-même comment assigner une macro à un évènement, j'ai modifié ma boite de dialogue en ajoutant un bouton qui fera aussi bien l'affaire.

Je garde néanmoins vos solutions sous le coude (merci à vous luky-luke et joel).

@luky-luke
Pour l'ajout d'un bouton le listener est nécessaire.
Pas nécessairement, pour mon code je n'ai pas eu besoin de l'utiliser.

Cordialement,
Drake
CreaBouton 1.ods
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice 6.2.7.1 (x64), Java (64b), Windows 10 (64b)