[Résolu] [Calc] Interrompre un évènement de personnalisation

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] Interrompre un évènement de personnalisation

Messagepar Olive9 » 06 Juin 2013 09:36

Bonjour

Dans un calc, je veux faire un contrôle avant enregistrement par macro du contenu de la feuille. J'ai donc affecté une macro à l'évènement 'Enregistrement le document'.

Si l'information n'est pas correcte, je voudrais que la sauvegarde ne se fasse pas. Comment peut-on arrêter l'évènement ?

Par avance, merci
Dernière édition par lawrence le 05 Juil 2013 02:20, édité 1 fois.
Raison: Ajout de la Balise [Résolu] et de la coche verte
OpenOffice 3.3 windows 7
Olive9
Fraîchement OOthentifié
 
Message(s) : 5
Inscrit le : 06 Juin 2013 09:23

Re: [Calc] Interrompre un évènement de personnalisation

Messagepar Dude » 06 Juin 2013 10:26

Salut,

L'instruction Exit est ton amie.
Regarde l'aide F1 sur le sujet et les exemples sur le forum.
AOO 4.1.5 sous Windows 7 Pro x64

Poser une question, c'est bien. Répondre aux autres, c'est encore mieux.
Améliorez AOO et votez pour les issues
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20471
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

Re: [Calc] Interrompre un évènement de personnalisation

Messagepar Olive9 » 06 Juin 2013 12:11

Merci pour la réponse et désolé pour la balise.

J'ai mis Exit dans ma macro, mais l'évènement d'enregistrement s'effectue quand même.
OpenOffice 3.3 windows 7
Olive9
Fraîchement OOthentifié
 
Message(s) : 5
Inscrit le : 06 Juin 2013 09:23

Re: [Calc] Interrompre un évènement de personnalisation

Messagepar Dude » 06 Juin 2013 15:40

Effectivement, l'événement lance la macro puis exécute l'action.
Il faut donc intercepter l'enregistrement au niveau du Dispatcher.
Mais là, c'est une autre paire de manche.

Quelques ressources en anglais : http://wiki.openoffice.org/wiki/Documen ... terception
Une traduction est la bienvenue qui sera à publier ensuite dans la partie Enrichissez la documentation
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20471
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

Re: [Calc] Interrompre un évènement de personnalisation

Messagepar alhazred » 06 Juin 2013 17:26

Bonjour,

Houla... Je pense avoir un bon niveau en anglais et en informatique, mais je dois reconnaître que là, je suis un peu dépassé :lol:

Il serait plus évident, pour le fichier en question (pas pour Calc bien sûr :aie: ), de rediriger les commandes d'enregistrement normales (menus, raccourcis et boutons) vers une macro qui ferait la vérification et, selon le cas, l'enregistrement. Ou carrément les inhiber/supprimer et déclencher la macro par un bouton.

 Ajout : Précision, les raccourcis ne peuvent pas être commodément modifiés au niveau du document... 
À bientôt

LibO 4.1.5.3 et AOO 4.0.1 sous Windows 7, MRI et SDK pour les macros.

Et la sauvegarde incrémentée, c'est sympa !
Avatar de l’utilisateur
alhazred
ManitOOu
ManitOOu
 
Message(s) : 3028
Inscrit le : 01 Mai 2011 00:08
Localisation : Casablanca (Maroc)

Re: [Calc] Interrompre un évènement de personnalisation

Messagepar Olive9 » 07 Juin 2013 07:47

Bonjour,

Merci pour vos réponses. Je vois donc qu'il n'y a pas de solution simple.

J'avais bien pensé à la sulotion proposé par alhazred, mais il reste le problème de la fermeture par la croix. Si l'utilisateur choisit enregistrer sur le message affiché, la sauvegarde classique va se faire sans passer par la macro.
OpenOffice 3.3 windows 7
Olive9
Fraîchement OOthentifié
 
Message(s) : 5
Inscrit le : 06 Juin 2013 09:23

Re: [Calc] Interrompre un évènement de personnalisation

Messagepar joel275 » 09 Juin 2013 17:00

Bonjour,

ayant une grade habitude de rencontrer des obstacles incontournables pour moi, je propose de le contourner en rechargeant l'ancienne version si la vérification n'est pas satisfaisante. Il suffit pour cela de:

Code : Tout sélectionner   AgrandirRéduire
ThisComponent.setModified(False)     ' pour éviter une demande de confirmation
        Dispatcher = CreateUnoService("com.sun.star.frame.DispatchHelper")
   Dispatcher.ExecuteDispatch(oFrame, ".uno:Reload, "", 0, Array())   


on peut peut-être aussi utiliser un modèle qui, justement, permet d'éviter les modifications malencontreuses (mais alors, on aurait quelque(s) document(s) inutile(s) encombrant le disque dur).

Pas le temps de tester tout ça ce dimanche soir.

Par ailleurs, Spyre m'avait indiqué il y a quelques temps déjà, la façon de modifier les raccourcis pour seulement le document en cours. je ne retrouve pas son message, mais je peux fournir ma version de ses indications à tout demandeur.

A plus, Joël
OpenOffice 4.1.2 LibreOffice 5-4-6 Windows 8.1
joel275
PassiOOnné
PassiOOnné
 
Message(s) : 709
Inscrit le : 10 Jan 2009 09:05

Re: [Calc] Interrompre un évènement de personnalisation

Messagepar Olive9 » 10 Juin 2013 08:55

Bonjour

Merci Joël, mais ta solution me parait un peu radical, car on perd toutes les modifs depuis le dernier enregistrement. Je pense que je vais faire une croix sur cette option.

Par contre Joël, la fonction de modifier les raccourcis pour seulement le document en cours pourrait m'intéresser. Peux-tu me fournir la version comme tu l'as proposé ? Par avance, merci.
OpenOffice 3.3 windows 7
Olive9
Fraîchement OOthentifié
 
Message(s) : 5
Inscrit le : 06 Juin 2013 09:23

Re: [Calc] Interrompre un évènement de personnalisation

Messagepar joel275 » 10 Juin 2013 10:45

Bonjour,

ma solution n'est pas si radicale que cela: 1) on sauvegarde la version modifiée 2) on recharge la version précédente 3) on remet la version modifiée (et on fait le ménage sur le disque dur) 4) on laisse le processus initié par l'utilisateur suivre son cours: mais là, c'est vraiment du bidouillage!

Pour l'affectation de nouvelles touches de raccourcis pour le document en cours, je joins le code comme convenu

Code : Tout sélectionner   AgrandirRéduire
' Code très largement inspiré d'une réponse faite par Spyre sur le forum, réponse que je ne retrouve plus!
oDocShortCutMgr = ThisComponent.getUIConfigurationManager.getShortCutManager      'raccourcis au niveau document
For I = 0 To UBound(jdMacros)
         jdMacros(I) = "vnd.sun.star.script:JDMath.MetMath." & jdMacros(I) & "?language=Basic&location=application"
'jdMacros(I) contient la macro à déclencher par raccourci
'jdLettres(I) contient le code de la touche affectée au raccourci
'par exemple jdLettres(0) = com.sun.star.awt.Key.A pour la lettre "A"
         With aKeyEvent
            .KeyCode = jdLettres(I)
         End With
         On Error Resume Next         ' CommandByKeyEvent renvoie une erreur si aKeyEvent n'est pas affectée
            sLocCommand = oDocShortCutMgr.getCommandByKeyEvent(aKeyEvent)
         On Error GoTo 0
         Select Case sLocCommand
            Case  ""
               oDocShortCutMgr.setKeyEvent(aKeyEvent, jdMacros(I))
            Case  jdMacros(I)       ' aKeyEvent est déjà affectée à notre commande
            Case Else             ' aKeyEvent est déjà affectée à une autre commande
               oDocShortCutMgr.removeKeyEvent(aKeyEvent)
               oDocShortCutMgr.setKeyEvent(aKeyEvent, jdMacros(I))
         End Select
         sLocCommand = ""      ' ne se remet pas toujours à "" à cause du On Error
      Next


Toutefois, je me demande s'il ne vaudrait pas mieux ouvrir un nouveau fil puisque ce code n'a pas de rapport avec le titre de la question.

 Ajout : la modification des raccourcis n'est pas enregistrée avec le document: il faut donc les réaffecter à chaque ouverture du documet 

 Ajout : à 17h12: j'ai ajouté une ligne au code pour définir la variable objet oDocShortCutMgr malheureusement zapée dans le copier-coller 


A plus, Joël
Dernière édition par joel275 le 10 Juin 2013 16:14, édité 1 fois.
OpenOffice 4.1.2 LibreOffice 5-4-6 Windows 8.1
joel275
PassiOOnné
PassiOOnné
 
Message(s) : 709
Inscrit le : 10 Jan 2009 09:05

Re: [Calc] Interrompre un évènement de personnalisation

Messagepar Dude » 10 Juin 2013 16:10

Sur la base du travail de ms777 qui l'a lui-même piqué à Paolo Montavi sur le forum anglophone.

Le classeur ci-dessous empêche la sauvegarde tant qu'une cellule n'a pas la bonne valeur.
zInterceptor.ods
(10.24 Kio) Téléchargé 103 fois

A utiliser avec prudence car tous les cas ne sont pas gérés et on a vite de se retrouver avec un logiciel hors de contrôle.
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20471
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

Re: [Calc] Interrompre un évènement de personnalisation

Messagepar joel275 » 10 Juin 2013 16:44

Bonjour,

Super!! Mais, euh!, comment dire? Sans vouloir abuser, quelques commentaires explicatifs (même beaucoup) seraient les bienvenus.

A plus, Joël
OpenOffice 4.1.2 LibreOffice 5-4-6 Windows 8.1
joel275
PassiOOnné
PassiOOnné
 
Message(s) : 709
Inscrit le : 10 Jan 2009 09:05

Re: [Calc] Interrompre un évènement de personnalisation

Messagepar Dude » 10 Juin 2013 17:02

joel275 a écrit:Sans vouloir abuser, quelques commentaires explicatifs (même beaucoup) seraient les bienvenus.

Oui, je l'ai mentionné plus haut, une francisation de la documentation du Wiki est à faire.
Le travail est en cours : viewtopic.php?f=37&t=39081
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 20471
Inscrit le : 03 Mars 2006 08:45
Localisation : 127.0.0.1

Re: [Calc] Interrompre un évènement de personnalisation

Messagepar Olive9 » 11 Juin 2013 07:33

Merci à Joël, pour son extrait de code et merci à Dude pour le fichier d'exemple. Je vais étudié tout ça tranquillement.
OpenOffice 3.3 windows 7
Olive9
Fraîchement OOthentifié
 
Message(s) : 5
Inscrit le : 06 Juin 2013 09:23


Retour vers Macros et API

Qui est en ligne ?

Utilisateur(s) parcourant ce forum : Aucun utilisateur inscrit et 3 invité(s)