[Writer] délocaliser une partie du code

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 !

[Writer] délocaliser une partie du code

Messagepar jean83fun » 18 Juin 2017 22:39

Bonjour,

Ou encore, comment appeler une macro depuis une macro.

ou encore, je travaille sur un document N°1, où j'ai sélectionné une chaîne de caractères d'intérêt. Je lance une macro qui comporte 3 étapes :
ETAPE 1 : j'ouvre un nouveau document (N°2), à partir d'un modèle, ici courrier01.ott
ETAPE 2 : la sélection est enregistrée
ETAPE 3 : je crée un cadre dans n°2 et y colle la sélection dedans.

Code : Tout sélectionner   AgrandirRéduire
Sub Courrier1

' ETAPE 1 : ouvre le document n°2 en allant chercher son modèle
   Dim monDocument2 As Object, adresseDoc As String
   adresseDoc = convertToURL("/Users/xxx/Documents/données/template/courrier1.ott")
   monDocument2 = StarDesktop.loadComponentFromURL(adresseDoc, "_blank", 0, Array() )

' ETAPE 2 : copie la sélection du document n°1
   Dim monDocument As Object, CurseurVisible As Object
   Dim texteSel As String
   Dim propFich()
      monDocument = ThisComponent
      CurseurVisible = monDocument.CurrentController.ViewCursor
      texteSel = CurseurVisible.String
     
'  ETAPE 3 : crée un cadre dans le document n°2, et y insère le texte surligné du document n°1
   Dim MonDocument3 As Object, MonTexte As Object
   Dim MonCurseur  As Object
   Dim MonCadre As Object
   MonDocument3 = ThisComponent
   MonTexte = MonDocument3.Text
   MonCurseur= MonTexte.createTextCursor

   ' mon cadre
   MonCadre = MonDocument3.createInstance("com.sun.star.text.TextFrame")
   with MonCadre
      .AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE
      .HoriOrient = com.sun.star.text.HoriOrientation.NONE
      .HoriOrientPosition = 10000

      .VertOrient = com.sun.star.text.VertOrientation.NONE
      .VertOrientPosition = 1500

      .Height = 7000
      .Width = 7500
   End with
   MonTexte.insertTextContent(MonCurseur, MonCadre, false)
   MonCadre.Text.String = texteSel
   
End Sub


Mais j'ai précisément 24 modèles de documents différents, l'ETAPE 1 fait l'objet de 24 macros qui se suivent dans mes Macros et boîtes de dialogue.Standard.
Je pourrais insérer ETAPE 2 et ETAPE 3 dans chacune d'elle, puisque cette opération doit être la même, quel que soit le modèle choisi, mais non seulement, j'alourdis mon module et si en plus, je dois modifier la taille du cadre, sa place, sa couleur, sa police, il me faudra changer le code de ETAPE 3 dans les 24 macros.
(Certes, je pourrais faire un copier-coller, mais j'ai justement déjà copié une première chaîne dans n°1, que je vais copier dans n°2. Et si je peux éviter de revenir sur n°1 pour copier la deuxième chaîne de caractère (qui fait l'objet de ETAPE 2 et la coller, je gagne un peu de temps, ce qui est précieux pour ma fonction.)

Ou encore, passer de :
Code : Tout sélectionner   AgrandirRéduire
Sub Courrier1
     ETAPE 1 appelle Courrier1.ott
     ETAPE 2
     ETAPE 3
End Sub

Sub Courrier2
     ETAPE 1 appelle Courrier2.ott
     ETAPE 2
     ETAPE 3
End Sub
...
(21 répétitions)
...
Sub Courrier24
     ETAPE 1 appelle Courrier24.ott
     ETAPE 2
     ETAPE 3
End Sub


à

Code : Tout sélectionner   AgrandirRéduire
Sub Courrier1
     ETAPE 1 appelle Courrier1.ott
     et appelle MacroCadre
End Sub

Sub Courrier2
     ETAPE 1 appelle Courrier2.ott
     et appelle MacroCadre
End Sub

etc

Sub Courrier24
     ETAPE 1 appelle Courrier24.ott
     et appelle MacroCadre
End Sub

' et voici le petit code délocalisé, que chaque macro peut appeler pour compléter et terminer sa fonction.
Sub MacroCadre
     ETAPE 2
     ETAPE 3
End Sub


Voilà, merci de votre attention et de vos recommandations :-)
Jean
AOO 4.1.3 sous OS X El Capitan 10.11.6
jean83fun
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 78
Inscrit le : 06 Fév 2013 22:10

Re: [Writer] délocaliser une partie du code

Messagepar Churay » 19 Juin 2017 04:56

Bonjour,

Si l'on savait comment est déterminé le modèle à utiliser, une seule macro pour le chargement du modèle pourrait peut-être suffire...

D'où l'intérêt de joindre le fichier principal et d'un ou deux modèles, même rendus anonymes...
Sans oublie la/les boite(s) de dialogue, s'il y en a...
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 4.2.8.2 Debian 7.8 & Ubuntu 14.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
 
Message(s) : 2562
Inscrit le : 30 Avr 2009 06:54
Localisation : CATALUNYA

Re: [Writer] délocaliser une partie du code

Messagepar jean83fun » 19 Juin 2017 06:27

Churay a écrit:Bonjour,

Si l'on savait comment est déterminé le modèle à utiliser, une seule macro pour le chargement du modèle pourrait peut-être suffire...

D'où l'intérêt de joindre le fichier principal et d'un ou deux modèles, même rendus anonymes...
Sans oublie la/les boite(s) de dialogue, s'il y en a...


bonjour,

Je ne comprends pas le sens de ta question. J'ai indiqué mon code dans mon premier post, avec le détail des 3 étapes. J'utilise des modèles ott très basiques.
Je joins ici le document n°1, appelé dossier.odt et le document n°2, appelé courrier1.ott

Ai-je répondu à ta question ?
Pièces jointes
courrier1.ott
(12.79 Kio) Téléchargé 2 fois
dossier.odt
(13.97 Kio) Téléchargé 1 fois
Jean
AOO 4.1.3 sous OS X El Capitan 10.11.6
jean83fun
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 78
Inscrit le : 06 Fév 2013 22:10

Re: [Writer] délocaliser une partie du code

Messagepar Dude » 19 Juin 2017 09:26

Image
Tu veux faire partir ton code en Chine ?

L'appel d'une routine dans une autre se fait par l'instruction Call.
Voir l'aide F1 sur le sujet.
Avatar de l’utilisateur
Dude
Grand Maître de l'OOffice
Grand Maître de l'OOffice
 
Message(s) : 19350
Inscrit le : 03 Mars 2006 09:45
Localisation : 127.0.0.1

Re: [Writer] délocaliser une partie du code

Messagepar jean83fun » 19 Juin 2017 09:59

Dude a écrit:L'appel d'une routine dans une autre se fait par l'instruction Call.
Voir l'aide F1 sur le sujet.


merci Dude.

Code : Tout sélectionner   AgrandirRéduire
Sub ExampleCall
Dim sVar As String
sVar = "Bureau"
Call f_callFun sVar
end Sub

Sub f_callFun (sText as String)
Msgbox sText
end sub


Oui ok merci Dude, voilà ce que je cherchais, il me reste à l'adapter à mon projet car il y a des paramètres à ajouter à Call, et à Sub ensuite...
Je reviens sous peu pour compléter ma demande si je m'emmêle.
Jean
AOO 4.1.3 sous OS X El Capitan 10.11.6
jean83fun
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 78
Inscrit le : 06 Fév 2013 22:10

Re: [Writer] délocaliser une partie du code

Messagepar jean83fun » 19 Juin 2017 15:33

Le code suivant ne veut pas fonctionner. Mes commentaires sont à lire dans les remarques du code.
Je n'ia pas de messages d'erreurs, le cadre est bien créé, au bon endroit, mais visiblement, pas d'intégration du texte sélectionné.

Nous sommes sur le document n°1
MACRO N°1 : celle qui appelle le modèle courrier.ott et enregistrer le texte du doc n°1 sélectionné
Code : Tout sélectionner   AgrandirRéduire
' d'abord la macro d'appel du modèle - on ouvre le document n°2
     Sub appel_mod
     Dim monDocument As Object, adresseDoc As String
     adresseDoc = convertToURL("/Users/moi/Documents/données/Courrier1.ott")
     monDocument = StarDesktop.loadComponentFromURL(adresseDoc, "_blank", 0, Array() )

Cette étape fonctionne parfaitement, tout va bien.
Passons à la suite du code
Code : Tout sélectionner   AgrandirRéduire
'procédure de copie du texte sélectionné à l'intérieur du document n°1
   Dim monDocument2 As Object, CurseurVisible As Object
   Dim texteSel As String
   Dim propFich()  ' je me demande à quoi sert ce propFich....
      monDocument2 = ThisComponent
      CurseurVisible = monDocument2.CurrentController.ViewCursor
      texteSel = CurseurVisible.String
      ' Print texteSel : à ce niveau et qui fait s'afficher un message vide... il ne prend pas en compte la sélection dans le document n°1...
  Call f_callFun texteSel 'ici j'appelle la procédure qui va créer le cadre dans le document n°2 et y coller le texte sélectionné
End Sub

Et en fait, je crois qu'il ne copie rient du tout car j'ai introduit une commande Print texteSel et qui ne Print rien du tout, un msgbox vide, quoi, sans erreur
Il ne semble pas prendre en compte la sélection du texte dans le document n°1.

MACRO n°2 : appelée par la fonction CALL, et créant le cadre dans le document n°2 et y insérant le texte sélectionné dans le document n°1
Code : Tout sélectionner   AgrandirRéduire
' et ici ma routine appelée depuis n'importe quel appel de modèle
Sub f_callFun (sText as String)
   Dim MonDocument3 As Object, MonTexte As Object
   Dim MonCurseur  As Object
   Dim MonCadre As Object
   MonDocument3 = ThisComponent
   MonTexte = MonDocument3.Text
   MonCurseur= MonTexte.createTextCursor

   ' mon cadre
   MonCadre = MonDocument3.createInstance("com.sun.star.text.TextFrame")
       with MonCadre
          .AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE
          .HoriOrient = com.sun.star.text.HoriOrientation.NONE
          .HoriOrientPosition = 10000
          .VertOrient = com.sun.star.text.VertOrientation.NONE
          .VertOrientPosition = 1500
          .Height = 7000
          .Width = 7500
       End with
   MonTexte.insertTextContent(MonCurseur, MonCadre, false)
   MonCadre.Text.String = sText
   print sText
end sub

Le cadre est bien créé dans le document n°2 mais aucun texte n'y est inséré et la commande Print sText me montre que sText est vide, ce qui n'est pas étonnant puisque texteSel est vide aussi
Jean
AOO 4.1.3 sous OS X El Capitan 10.11.6
jean83fun
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 78
Inscrit le : 06 Fév 2013 22:10

Re: [Writer] délocaliser une partie du code

Messagepar Churay » 19 Juin 2017 17:05

re

jean83fun a écrit:la commande Print sText me montre que sText est vide, ce qui n'est pas étonnant puisque texteSel est vide aussi
CQFD
jean83fun a écrit:j'ai introduit une commande Print texteSel et qui ne Print rien du tout, un msgbox vide, quoi, sans erreur
Normal : L'objet CurseurVisible (monDocument2.CurrentController.ViewCursor) dispose bien d'une propriété .String, qui est vide.
Pour obtenir quelque chose, il faut s'intéresser à la propriété .String de l'objet .Text via texteSel = CurseurVisible.Text.String
Et là, immense déception : le contenu n'est pas celui qu'on espérait puisqu'on obtient
Print CurseurVisible.Text.String a écrit:<NOM Prénom> <Ici le texte à sélectionner>

Il ne semble pas prendre en compte la sélection du texte dans le document n°1.
Parce qu'il faut la chercher autrement.

Si l'on s'intéresse à monDocument2.CurrentSelection(0), la propriété .String de l'objet .Text, cela nous approche de la solution :

Print monDocument2.CurrentSelection(0).String.Text a écrit:Adresse :






Téléphone :


Accompagnant :




19/06/17



Ce qui ressemble fort à l'énumération du contenu d'un tableau...
Cela n'a rien d'anormal puisque tes informations sont contenues dans un tableau...

Moralité : il faut commencer par chercher le tableau (dans ton document, il s'appelle Tableau2).

Une aide efficace sera Xray


Pour en revenir à ma question précédente :
jean83fun a écrit: J'utilise des modèles ott très basiques.
Qu'est-ce qui détermine que c'est le modèle3 qui va être utilisé ?
Je crois comprendre que c'est toi qui choisit le sub Courrier3 parmi les 24.
Je posais cette question parce que l'utilisation d'une boîte de dialogue (ou un jeu de boutons ou de boutons radio ou de case à cocher) permettrait de n'avoir qu'un seul sub qui ferait lui même la sélection du bon modèle en fonction de ce qui a été cliqué.
 Ajout : Par ailleurs, une boîte de dialogue dans laquelle serait saisies les informations à passer au document final serait beaucoup plus simple pour récupérer les dites informations.
Writer devient rapidement une usine à gaz dès lors qu'il faut aller se balader dans un objet perdu au fin fond d'une multitude d'objets parents 
Dernière édition par Churay le 19 Juin 2017 17:14, édité 1 fois.
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 4.2.8.2 Debian 7.8 & Ubuntu 14.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
 
Message(s) : 2562
Inscrit le : 30 Avr 2009 06:54
Localisation : CATALUNYA

Re: [Writer] délocaliser une partie du code

Messagepar luky-luke » 19 Juin 2017 17:08

Bonjour
jean83fun a écrit:Il ne semble pas prendre en compte la sélection du texte dans le document n°1.

Et c'est normal, puisque tu cherche une sélection de texte dans le document2
Code : Tout sélectionner   AgrandirRéduire
      monDocument2 = ThisComponent
      CurseurVisible = monDocument2.CurrentController.ViewCursor
      texteSel = CurseurVisible.String

Churay a écrit:Moralité : il faut commencer par chercher le tableau (dans ton document

Suffit de chercher dans le bon document :wink:
Cordialement
Luke
AOO 4.1.1 et LibO 4.4.6 Ubuntu 14.04 LTS
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) : 805
Inscrit le : 27 Nov 2010 02:17
Localisation : gâtine deux-sèvrienne

Re: [Writer] délocaliser une partie du code

Messagepar Churay » 19 Juin 2017 17:17

aussi.... :fou:

 Ajout : Il n'en reste pas moins qu'une boite de dialogue simplifierait la récupérations des infos... 
cOOordialement
---
AOO 4.0.1 W7-PRO & LO 4.2.8.2 Debian 7.8 & Ubuntu 14.04 LTS
---
F1 : ça aide...
XRay + SDK :super:
---
Quand le NOT CONFIRMED sera corrigé (OOo et LO) , je serai heureux...
Avatar de l’utilisateur
Churay
ManitOOu
ManitOOu
 
Message(s) : 2562
Inscrit le : 30 Avr 2009 06:54
Localisation : CATALUNYA

Re: [Writer] délocaliser une partie du code

Messagepar jean83fun » 19 Juin 2017 18:53

luky-luke a écrit:Et c'est normal, puisque tu cherche une sélection de texte dans le document2


ah oui, chronologiquement, étant donné que je fais créer document n°2 d'abord, le ThisComponent de ma macro de copie de sélection concerne le document que je viens de créer, c'est le document n°2. Donc il faut que je passe le code de copie du texte avant celui d'ouverture du document n°2, comme ça ThisComponent concerne bien le document n°1. J'ai bon ?
Jean
AOO 4.1.3 sous OS X El Capitan 10.11.6
jean83fun
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 78
Inscrit le : 06 Fév 2013 22:10

Re: [Writer] délocaliser une partie du code

Messagepar jean83fun » 19 Juin 2017 19:10

La macro suivante fonctionne parfaitement puisque j'ai pris soin de placer en premier la procédure de copie du texte sélectionné.

Code : Tout sélectionner   AgrandirRéduire

REM *** SELECTION DU TEXTE PUIS OUVERTURE D'UN MODELE ***

Sub appel_Courrier01

' sélection du texte

   Dim monDocument As Object, CurseurVisible As Object
   Dim texteSel As String
   monDocument = ThisComponent
   CurseurVisible = monDocument.CurrentController.ViewCursor
   texteSel = CurseurVisible.String
   
' appel du modèle Courrier 01

  Dim monDocument2 As Object, adresseDoc As String
  adresseDoc = convertToURL("/Users/moi/Documents/données/Courrier01.ott")
  monDocument2 = StarDesktop.loadComponentFromURL(adresseDoc, "_blank", 0, Array() )

' appel de la routine qui fait le cadre et colle le texte

  Call f_callFun texteSel

End Sub

REM *** ROUTINE APPELEE PAR CALL ***

Sub f_callFun (sText as String)
   Dim MonDocument3 As Object, MonTexte As Object
   Dim MonCurseur  As Object
   Dim MonCadre As Object
   MonDocument3 = ThisComponent
   MonTexte = MonDocument3.Text
   MonCurseur= MonTexte.createTextCursor

   ' mon cadre
   MonCadre = MonDocument3.createInstance("com.sun.star.text.TextFrame")
       with MonCadre
          .AnchorType = com.sun.star.text.TextContentAnchorType.AT_PAGE
          .HoriOrient = com.sun.star.text.HoriOrientation.NONE
          .HoriOrientPosition = 10000
          .VertOrient = com.sun.star.text.VertOrientation.NONE
          .VertOrientPosition = 1500
          .Height = 7000
          .Width = 7500
       End with
   MonTexte.insertTextContent(MonCurseur, MonCadre, false)
   MonCadre.Text.String = sText
 
end sub


Là, on s'approche de ce que je veux, j'ai au moins isolé la routine qui crée le cadre et je n'ai qu'elle à modifier si je veux changer les paramètres du cadre.
Maintenant il me faut essayer en ajoutant des macros d'appel d'autres modèles mais qui iront solliciter, chacune, cette procédure délocalisée de création d'un cadre.

Suspens....

La modération a écrit:ENCORE UNE FOIS...Merci de ne pas poster plusieurs messages à la suite !
Si vous devez ajouter un complément d'information, le bouton "Editer" à la droite du message permet d'y remédier.

En attendant une prochaine réponse, vous pouvez participer également en répondant à d'autres questions sur notre forum.
Jean
AOO 4.1.3 sous OS X El Capitan 10.11.6
jean83fun
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 78
Inscrit le : 06 Fév 2013 22:10

Re: [Writer] délocaliser une partie du code

Messagepar jean83fun » 20 Juin 2017 09:54

Churay a écrit:
 Ajout : Par ailleurs, une boîte de dialogue dans laquelle serait saisies les informations à passer au document final serait beaucoup plus simple pour récupérer les dites informations.
Writer devient rapidement une usine à gaz dès lors qu'il faut aller se balader dans un objet perdu au fin fond d'une multitude d'objets parents 


Bonjour,

Je ne maîtrise pas du tout les boîtes de dialogue. J'ai cherché des tutos adaptés pour faire connaissance, et pour l'heure je n'ai rien trouvé de concret.
J'en parlerais volontiers, mais j'imagine que là n'est pas la place. Où dois-je ouvrir un nouveau sujet ? Je pourrais y exposer mon projet et demander si et comment une boîte de dialogue me serait utile.
Jean
AOO 4.1.3 sous OS X El Capitan 10.11.6
jean83fun
Membre OOrganisé
Membre OOrganisé
 
Message(s) : 78
Inscrit le : 06 Fév 2013 22:10


Retour vers Macros et API

Qui est en ligne ?

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