Actionner un bouton de commande par macro

Bonjour à tous,

Je poursuis le développement du module de construction de figures de Dmaths.

Ma question du jour : Comment actionner par programme un CommandButton ? (simuler un clic)

Merci d'avance.

Bonjour,

Pas d'idées ?

Merci.

Bonjour Didier

Ma question du jour : Comment actionner par programme un
CommandButton ? (simuler un clic)

j'ai du mal à saisir la problematique

- si c'est un des tes boutons, appeler la sub qui est associée à l'evenement click (mais je me doute que tu ne poserais pas la question :wink: )

- si c'est un bouton de l'interface de libreo, voir du coté des slotsID et des call .uno:

- regarder sinon du coté de l'envoi d'un evenement (examine ton bouton avec xray pour voir si tu as pas de quoi faire)

mais j'ai peut etre pas compris la question

Laurent

Bonjour Laurent,

J'ai mal expliqué ce que je veux faire :

1) Je lance une macro m1, elle ouvre (.Execute) une boîte de dialogue dlg1. Cette boîte de dialogue contient un bouton btn1.

2) Si je clique avec la souris sur btn1 alors une macro m2 est lancée qui rend invisible dlg1 et ouvre (.Execute) une boîte dlg2.

Cela fonctionne bien.

Je voudrais court-circuiter l'étape 2) mais si j'écris dans le programme Call m1 : Call m2 seule la boîte dlg1 s'ouvre et bien sûr attend un clic.

Du coup, je me suis dit que si j'écrivais du code qui simule le clic sur btn1 au lieu de Call m2 cela devrait passer ...

Merci pour ta réponse.

Re

hum.

avec .execute, ta boite est modale et donc effectivement l'appel est bloquant

tu peux regarder du coté de .visible = true
ta boite est lancé mais n'est plus modale (et donc l'execution dans m1 se poursuit)

si tu veux conserver une boite modale mais que le process continue (par exemple barre de progression), tu peux passer par un callback asynchrone com.sun.star.awt.AsyncCallback

voir ce bout de code de principe http://pastebin.com/MiXCPQMT

l'idee est de mettre dans le .tag du dialogue ce qui sera utilisé dans le select case du callback asynchrone pour lancer la bonne sub

l'appel se fait comme suit
  oDlgPatience.model.tag = "m2"
    retourDialogue = oDlgPatience.execute()

laurent

Merci Laurent pour ta réponse.

Je vais essayer de comprendre tout cela.

Bonne soirée et encore merci.

Bonjour,

J'ai mal expliqué ce que je veux faire :

1) Je lance une macro m1, elle ouvre (.Execute) une boîte de dialogue
dlg1. Cette boîte de dialogue contient un bouton btn1.

2) Si je clique avec la souris sur btn1 alors une macro m2 est lancée
qui rend invisible dlg1 et ouvre (.Execute) une boîte dlg2.

Cela fonctionne bien.

Je voudrais court-circuiter l'étape 2) mais si j'écris dans le programme
Call m1 : Call m2 seule la boîte dlg1 s'ouvre et bien sûr attend un clic.

Du coup, je me suis dit que si j'écrivais du code qui simule le clic sur
btn1 au lieu de Call m2 cela devrait passer ...

j'ai peut-être pas tout compris mais pourquoi ne pas exécuter
directement m2 depuis ton module de départ ? m2 n'est pas visible ?

Bonjour

Comme les autres j'ai du mal à comprendre les tenants et aboutissants.

Compte tenu des infos dont on dispose il me semble que je procèderais
autrement : non utilisation de .execute, éventuellement gestion de "page".

Mais comme tu sembles ne pas avoir retenu ma proposition de ce fil :
http://nabble.documentfoundation.org/Programmation-et-boites-de-dialogues-tp4131956p4131966.html
je n'insiste pas.

Ci-joint un exemple de solution simple avec .execute. Le principe
est d'associer à la réception du focus (du contrôle qui le reçoit) le
lancement de ta macro. Bien sûr, il faut éviter que la macro soit
lancée à chaque réception du focus. Ici un simple flag...

DialoguesEnchainesSimple.ods
<http://nabble.documentfoundation.org/file/n4133269/DialoguesEnchainesSimple.ods>

Cordialement
Pierre-Yves

Bonsoir Pierre-Yves,

Bonjour

Comme les autres j'ai du mal à comprendre les tenants et aboutissants.

Du coup je détaille :
Je suis en train de d'améliorer un module de construction de figures géométriques existant sous Dmaths.
Le principe :
Dans un document Draw, un bouton d'une ToolBar lance une macro principale.
Cette macro affiche (.execute) une boîte de dialogue qui contient une listbox avec comme entrées de liste le choix pour construire :
- un point,
- une droite ou un segment,
etc ...
- des figures 2D construites par les macros de Gdmath,
- des figures 3D construites par AHmath3D.
- le presse papier.

Chaque choix lance une boîte de dialogue adhoc.

Tout fonctionne bien.

Lorsqu'une figure, par exemple en 3D (pavé droit ou cône) est construite, je souhaite pouvoir créer un ou plusieurs points et/ou segments (exemple une diagonale d'un des rectangles du pavé).
Là pas de problème les menus comme création d'un point ... etc sont là pour cela.

Mais il est difficile sauf pour les valeurs entières de construire un point avec les bonnes coordonnées.

D'où, l'utilisation d'un clic de souris pour positionner le point, puis d'une macro (développée et fonctionnelle) qui "capture" la position du point (comme Geogebra) pour placer le point exactement à l'intersection des arêtes du pavé.

Attention : je n'ai nullement l'intention de développer un logiciel de construction dynamique mais simplement de faciliter la création de figures qui sont construites dans Draw et donc au format natif LiBo et donc éditable etc.

Le problème : la boîte principale est modale. Mon problème c'est justement que le contrôleur autorise l'utilisateur à cliquer sur la page Draw.

J'explore plusieurs pistes dont :

- afficher la boîte principale avec SetVisible(True) comme tu me l'as proposé dans DialogListner.odg.
Mais j'ai des problèmes de stabilité, et aussi de copier coller que je n'explique pas.

- en utilisant des variables globales : je fais fermer (.endexecute) la boîte création d'un point, puis la principale.
Après Clic de souris, la macro appelle successivement la macro qui lance la boîte principale, puis la macro création d'un point.
Résultat, la boîte de dialogue principale s'affiche mais reste en attente. Je peux avoir la boîte création de point en cliquant sur le bouton adhoc de la principale.
Mais, ce n'est pas très ergonomique pour l'utilisateur.
Dans ce deuxième cas, tout fonctionne correctement.

Et tout sera parfait si j’arrive à trouver le moyen après le lancement de la boîte principale de lancer la deuxième.

D'où ma question : quel code écrire pour simuler un clic de souris sur le bouton de la boîte principale ?

Compte tenu des infos dont on dispose il me semble que je procèderais
autrement : non utilisation de .execute, éventuellement gestion de "page".

Mais comme tu sembles ne pas avoir retenu ma proposition de ce fil :
http://nabble.documentfoundation.org/Programmation-et-boites-de-dialogues-tp4131956p4131966.html
je n'insiste pas.

Ci-joint un exemple de solution simple avec .execute. Le principe
est d'associer à la réception du focus (du contrôle qui le reçoit) le
lancement de ta macro. Bien sûr, il faut éviter que la macro soit
lancée à chaque réception du focus. Ici un simple flag...

DialoguesEnchainesSimple.ods
<http://nabble.documentfoundation.org/file/n4133269/DialoguesEnchainesSimple.ods>

Cordialement
Pierre-Yves

J'espère avoir été suffisamment clair.

Merci pour ton aide.

Cordialement.