[Résolu][Calc] Evénement sur clic d'une plage

Discussions et questions sur tout ce qui concerne la programmation sous StarOffice NeoOffice ou OpenOffice.org tous langages et tous modules confondus.

Modérateur: Vilains modOOos

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] Evénement sur clic d'une plage

Messagepar rvtoulon » 05 Nov 2009 14:53

Bjr,
nouveau sur ce forum, et également nouvel utilisateur de open office, j'essaye de m'adapter au changement Excel - Calc, en ce qui concerne les macros. Bref j'aimerais lorsque je clic sur une cellule ouvrir une boite de dialogue. Avec un peu de recherche et beaucoup de réflexion j'ai trouvé le code qui me permet de faire ceci, en utilisant un listener, le voici:
Code: Tout sélectionner   AgrandirRéduire
Option Explicit

Global PysDocView as object, PysListener as object

sub PysListenerAdd
PysDocView = ThisComponent.getCurrentController
PysListener = createUnoListener("Pys_","com.sun.star.view.XSelectionChangeListener")
PysDocView.addSelectionChangeListener(PysListener)
end sub

' Procédure pour arrêter le traitement
sub PysListenerRemove
if not(isnull(PysListener)) then
PysDocView.removeSelectionChangeListener(PysListener)
end if
end sub

' Procédure appelée par l'événement "arrêt du listener".
' Nécessaire même si ne fait rien
sub Pys_disposing(PysListener)
'******************************
end sub


' Procédure déclenchée quand changement de sélection
Sub Pys_selectionChanged(PysListener)
Dim PysEnCours as object

PysEnCours = thiscomponent.currentselection

' Si la sélection courante est une cellule ou une plage
if PysEnCours.supportsService("com.sun.star.table.Cell") then
call dialog1initialize
end if

End Sub

Ce code fonctionne bien seulement il déclenche l'évènement sur le clic de n'importe quel cellule de la feuille. En fait je voudrais déclencher l'évènement uniquement sur les cellules d'une plage nommée, par exemple "essai", ou d'une plage tout court exemple "B2:M30".
Comment faire?
Merci de votre Aide

EDIT: J'ai lu beaucoup de post sur ce forum à propos des listener mais j'ai pas trouvé comment définir uniquement le déclenchement sur une plage nommée... Est-ce que j'ai mal cherché? :aie:

EDIT: J'ai lu le message ci-dessous mais je vois pas trop ou j'ai inventé, j'ai oublié une majuscule :marto: je l'ai mise, je crois que c'est tout... si il y a autres choses merci de me le dire :mrgreen:

Le Modérateur a écrit: :alerte: Merci de ne pas inventer et de respecter la syntaxe des balises : ftopic1369.html
Le balisage doit bien sûr être correctement orthographié (première lettre en majuscule puis le reste en minuscules).
open office 3.1.1 et win xp pro
rvtoulon
Fraîchement OOothentifié
 
Messages: 2
Inscrit le: 05 Nov 2009 11:11

Re: [Calc] Evénement sur clic d'une cellule

Messagepar Pierre-Yves Samyn » 05 Nov 2009 16:40

Bonjour et bienvenue sur ce forum

En effet, les cellules/plages n'offrent pas de méthode addSelectionChangeListener.

Je n'ai pas pris le temps de réfléchir longtemps à ton problème mais a priori je déconseillerais par ailleurs cette piste : listener de changement de sélection qui a chaque changement (au niveau controller donc) vérifierait que la sélection courante est une cellule/plage et "intersecte" avec une plage donnée.

En effet, je pense que cela induirait une boucle sans fin dans la mesure où tout déplacement de souris va provoquer le changement de sélection.

Après ce que je n'essairais pas, ce que je te propose en conséquence (mais là encore je n'ai pas pris le temps de tester à fond et il faudrait vérifier qu'il n'y a pas d'effet non désirés) : utiliser un listener XMouseClickHandler pour tester lors d'un clic de souris si la sélection courante répond à ton critère. Pourquoi cette piste car, vs le déplacement de souris, cette option limite le déclenchement à une action utilisateur.

Ci-dessous un exemple minimum (à tester donc :) )
Code: Tout sélectionner   AgrandirRéduire
Option Explicit

Global PysDoc As Object
Global PysMouseClickHandler As Object
Global PysRange as Object

Sub PysAddMouseClickHandler
  PysDoc = ThisComponent.currentController
  PysRange = ThisComponent.sheets.getByName("Feuille1").getCellRangeByName("B2:M30")
  PysMouseClickHandler = createUnoListener("Pys_", "com.sun.star.awt.XMouseClickHandler")
  PysDoc.addMouseClickHandler(PysMouseClickHandler)
End Sub

Sub PysRemoveMouseClickHandler
  PysDoc.removeMouseClickHandler(PysMouseClickHandler)
End Sub

Sub Pys_disposing(PysEvt)
End Sub

Function Pys_mousePressed(PysEvt) As Boolean
  Pys_mousePressed = false
End Function

Function Pys_mouseReleased(PysEvt) As Boolean

Dim PysEnCours as object

PysEnCours = thiscomponent.currentselection

' Si la sélection courante est une cellule ou une plage
if PysEnCours.supportsService("com.sun.star.sheet.SheetCellRange") then
   if PysRange.queryIntersection(PysEnCours.getRangeAddress()).getCount >= 1 then
      'call dialog1initialize
      print "intersection"
   end if
end if

Pys_mouseReleased = False

End Function


Nota : un effet induit est l'impossibilité de sélection d'une plage "multi-zones" puisque la procédure se déclenche à la sélection de la première cellule/plage...
Pièces jointes
ChangeSelectionListener.ods
(8.97 Kio) Téléchargé 7 fois
OOo 3.1.1 windows XP

A lire avant tout !
Pierre-Yves Samyn
GourOOou
GourOOou
 
Messages: 7433
Inscrit le: 02 Mai 2006 10:42

Re: [Calc] Evénement sur clic d'une cellule

Messagepar rvtoulon » 05 Nov 2009 18:48

Bjr, Pierre-Yves Samyn
merci de t'être penché quelques minutes sur cette question.Ton code est fantastique :bravo: et réalise exactement ce que je souhaitais faire.
J'avais lu une discution que tu as eu avec une personne qui avait un problème similaire et effectivement tu lui avais montré un code avec un listener XMouseClickHandler , mais sincèrement je focalisais mes recherches sur le XSelectionChangeListener. :marto:
je faisais fausse route.
Merci pour tes explications claires et concises. Le Passage du VBA au OooBasic n'est pas évident mais grâce à ce forum je commence à y voir plus clair.
Merci je met résolu, A bientôt.
open office 3.1.1 et win xp pro
rvtoulon
Fraîchement OOothentifié
 
Messages: 2
Inscrit le: 05 Nov 2009 11:11


Retour vers Macros et API

Qui est en ligne ?

Utilisateurs parcourant actuellement ce forum : Jean-Marc et 1 invité