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

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

Messagepar Drake » 10 Nov 2019 19:18

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/forum/viewtopic.php?f=15&t=11928&hilit=boite+dialogue+contr%C3%B4les+dynamique
Je vais l'étudier et revenir vers vous si je rencontre des problèmes.
Dernière édition par Drake le 12 Nov 2019 01:38, édité 3 fois.
LibreOffice 6.2.7.1 (x64), Java (64b), Windows 10 (64b)
Drake
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 271
Inscrit le : 02 Fév 2012 01:51

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

Messagepar luky-luke » 10 Nov 2019 19:37

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
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
 
Message(s) : 914
Inscrit le : 27 Nov 2010 01:17
Localisation : gâtine deux-sèvrienne

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

Messagepar Drake » 10 Nov 2019 22:49

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
Essai de création à partir d'une macro d'un bouton dans une boite de dialogue existante
(8.14 Kio) Téléchargé 4 fois
LibreOffice 6.2.7.1 (x64), Java (64b), Windows 10 (64b)
Drake
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 271
Inscrit le : 02 Fév 2012 01:51

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

Messagepar Noonours » 11 Nov 2019 00:06

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   AgrandirRéduire
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 édition par Noonours le 11 Nov 2019 00:41, édité 1 fois.
Noonours plantigrade râleur

Pour obtenir la réponse la plus précise possible, N’HÉSITEZ SURTOUT PAS À JOINDRE UN FICHIER

LibO 6.2.8.2 sous Windows 10
LibO 5.0.6.3 (obligation de version) sous Win 7
Avatar de l’utilisateur
Noonours
Membre cOOnverti
Membre cOOnverti
 
Message(s) : 319
Inscrit le : 11 Mai 2013 01:11
Localisation : Aix en Provence

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

Messagepar luky-luke » 11 Nov 2019 00:06

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   AgrandirRéduire
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
Pièces jointes
CreaBouton 2.ods
(9.73 Kio) Téléchargé 4 fois
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
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
 
Message(s) : 914
Inscrit le : 27 Nov 2010 01:17
Localisation : gâtine deux-sèvrienne

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

Messagepar Drake » 11 Nov 2019 00:19

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
(11.31 Kio) Téléchargé 4 fois
LibreOffice 6.2.7.1 (x64), Java (64b), Windows 10 (64b)
Drake
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 271
Inscrit le : 02 Fév 2012 01:51

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

Messagepar luky-luke » 11 Nov 2019 00:58

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
Pièces jointes
CreaBouton 3.ods
(10.28 Kio) Téléchargé 6 fois
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
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
 
Message(s) : 914
Inscrit le : 27 Nov 2010 01:17
Localisation : gâtine deux-sèvrienne

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

Messagepar Drake » 11 Nov 2019 02:02

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
(11.16 Kio) Téléchargé 1 fois
Dernière édition par Drake le 11 Nov 2019 14:41, édité 1 fois.
LibreOffice 6.2.7.1 (x64), Java (64b), Windows 10 (64b)
Drake
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 271
Inscrit le : 02 Fév 2012 01:51

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

Messagepar OOotremer971 » 11 Nov 2019 10:05

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/viewtopic.php?f=8&t=60939#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
Ubuntu
OpenSuse Leap
Avatar de l’utilisateur
OOotremer971
HédOOniste
HédOOniste
 
Message(s) : 2142
Inscrit le : 16 Avr 2010 14:31

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

Messagepar Drake » 11 Nov 2019 14:38

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
(11.35 Kio) Téléchargé 4 fois


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+
LibreOffice 6.2.7.1 (x64), Java (64b), Windows 10 (64b)
Drake
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 271
Inscrit le : 02 Fév 2012 01:51

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

Messagepar luky-luke » 11 Nov 2019 15:32

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   AgrandirRéduire
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
Pièces jointes
CreaBouton 4.ods
(11.27 Kio) Téléchargé 12 fois
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
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
 
Message(s) : 914
Inscrit le : 27 Nov 2010 01:17
Localisation : gâtine deux-sèvrienne

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

Messagepar joel275 » 11 Nov 2019 21:16

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:

viewtopic.php?f=8&t=58424&p=315793&hilit=RegisterScriptEvent#p315793

A plus.
OpenOffice 4.1.2 LibreOffice 6-2-8-2 Windows 8.1
joel275
PassiOOnné
PassiOOnné
 
Message(s) : 743
Inscrit le : 10 Jan 2009 09:05

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

Messagepar luky-luke » 11 Nov 2019 23:22

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   AgrandirRéduire
PushButton = CreateUnoListener("LeBouton_", "com.sun.star.awt.XActionListener")
oButtonControl.addActionListener(PushButton)
par
Code : Tout sélectionner   AgrandirRéduire
PushButton = CreateUnoListener("LeBouton_", "com.sun.star.awt.XMouseListener")
oButtonControl.addMouseListener(PushButton)
Et ajouter les quatre macro suivante
Code : Tout sélectionner   AgrandirRéduire
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   AgrandirRéduire
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
Avatar de l’utilisateur
luky-luke
InconditiOOnnel
InconditiOOnnel
 
Message(s) : 914
Inscrit le : 27 Nov 2010 01:17
Localisation : gâtine deux-sèvrienne

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

Messagepar Drake » 12 Nov 2019 01:08

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
(11.33 Kio) Téléchargé 5 fois
LibreOffice 6.2.7.1 (x64), Java (64b), Windows 10 (64b)
Drake
Membre cOOnfirmé
Membre cOOnfirmé
 
Message(s) : 271
Inscrit le : 02 Fév 2012 01:51


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : MSN [Bot] et 5 invité(s)