[Résolu][Writer]Coller puis modifier une forme de dessin

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 !
ooSikas
Membre OOrganisé
Membre OOrganisé
Messages : 72
Inscription : 22 juil. 2017 08:33

[Résolu][Writer]Coller puis modifier une forme de dessin

Message par ooSikas »

Bonjour,

Je cherche a créer une macro qui :
-Copie une forme de dessin
-Colle à un repère de texte
-Renomme la forme collée
-Edite la chaîne de caractère de cette forme

J'ai pu me rapprocher de mon but grace aux deux topics suivants qui m'ont été d'une grande aide:

https://forum.openoffice.org/fr/forum/v ... pes#p87328
https://forum.openoffice.org/fr/forum/v ... cet#p79734

Mais je n'arrive pas à faire fonctionner la macro correctement :
La nouvelle forme se colle à la place de l'ancienne et non au repère de texte.
J'imagine que cela vient d'un problème de position du curseur, mais par manque d'expérience, je n'arrive pas à trouver la solution.

Merci par avance pour votre aide,

En PJ : le modèle Writer.

A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par ooSikas le 23 juin 2018 09:05, modifié 1 fois.
LibreOffice Version: 6.4.4.2 sous Windows 10
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25175
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Writer]Coller puis modifier une forme de dessin

Message par Dude »

Il aurait été bien de nous faciliter la vie. A savoir :
  1. fournir un document épuré des macros inutiles et centré uniquement sur le problème
  2. publier le code de la macro concernée directement dans le message
Si tu passes en mode pas-à-pas, tu verras que tu sélectionnes un objet dessin.
Par conséquent, l'accès au repère de texte ne fonctionne pas.
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Writer]Coller puis modifier une forme de dessin

Message par Piaf »

Bonjour
Dude a écrit : Si tu passes en mode pas-à-pas, tu verras que tu sélectionnes un objet dessin.
Par conséquent, l'accès au repère de texte ne fonctionne pas
Tu devrais jeter un coup d’œil à Re: [Writer] Comment désélectionner une forme ?.
Ensuite pour le copier coller, tu devrais peut-être utiliser la propriété transferable du controller.
CopyForme.png
A+
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
ooSikas
Membre OOrganisé
Membre OOrganisé
Messages : 72
Inscription : 22 juil. 2017 08:33

Re: [Writer]Coller puis modifier une forme de dessin

Message par ooSikas »

Bonjour Dude et Piaf et merci pour vos réponses.

Désolé, je tacherai d'épurer mon programme la prochaine fois et de clarifier mes postes pour une compréhension facile. C'est noté :super:

Suite à vos conseils j'ai ajouté la ligne suivante pour désélectionner ma forme avant d'envoyer le curseur visible

Code : Tout sélectionner

dispatcher.executeDispatch(document, ".uno:Escape", "", 0, Array())

Code : Tout sélectionner

           for cpt = 0 to oDrawpage.count -1
		objetTrouve = oDrawpage(cpt)
		buf = objetTrouve.name
'		msgbox ("texte : " & objetTrouve.string)
		if (strcomp(sNom, buf) = 0) then
'			Selectionne la forme à copier
			thisComponent.getCurrentController.select(objetTrouve)	
			Forme= ThisComponent.CurrentController.Frame
			dsp = createUnoService("com.sun.star.frame.DispatchHelper")
			dsp.executeDispatch(Forme, ".uno:Copy", "", 0, Array())
			'Déselectionner la forme 
			dispatcher.executeDispatch(document, ".uno:Escape", "", 0, Array())
			'Atteindre le repère de texte ou l'on veut coller
			AtteindreSignet(oDoc,"PASTE")
			' Coller à la position définie
			Forme= ThisComponent.CurrentController.Frame
			dsp.executeDispatch(Forme, ".uno:Paste", "", 0, Array())		
			msgbox("la forme a été trouvée et collée")
			' Donner un nom différent à ce dupli pour le retrouver ensuite
			oCurrCtrl = thisComponent.getCurrentController
			oSelect = oCurrCtrl.getSelection
			oDessin2 = oSelect.getByIndex(0)
			oDessin2.setName(sNom & "_2")
			msgbox("la forme a été renomée")		
		end if
		next cpt
Ca fonctionne quand j'exécute le sous programme en direct mais pas quand je clique sur le bouton.
Dans mon vrai programme je n'appelle pas le sous programme par un bouton donc ça ne fait rien, mais par curiosité j'aimerai bien comprendre pourquoi ça ne fonctionne pas..
Ensuite pour le copier coller, tu devrais peut-être utiliser la propriété transferable du controller.
Piaf, je n'ai pas compris ce que tu voulais dire ? qu'entends tu par "la propriété transférable"?

En tout cas, merci à tous deux pour votre aide précieuse.
LibreOffice Version: 6.4.4.2 sous Windows 10
Piaf
GourOOu
GourOOu
Messages : 5622
Inscription : 25 nov. 2011 18:07
Localisation : Guyane

Re: [Writer]Coller puis modifier une forme de dessin

Message par Piaf »

Bonsoir
ooSikas a écrit :Dans mon vrai programme je n'appelle pas le sous programme par un bouton donc ça ne fait rien, mais par curiosité j'aimerai bien comprendre pourquoi ça ne fonctionne pas.
Voir Bug 70883
ooSikas a écrit : Piaf, je n'ai pas compris ce que tu voulais dire ? qu'entends tu par "la propriété transférable"?

Code : Tout sélectionner

sub CopyPasteShape()
dim odoc as object, oDrawpage as object
dim cpt as integer
dim objetTrouve as object
dim oCurrCtrl as object
dim oSelect as object
dim oDessin2 as object
dim buf as string
dim sNom as string
dim oCopy as object
	odoc= thisComponent
	oDrawpage = odoc.drawPage
	sNom="Shape_NEWBAT"
	' chercher l'objet image dont le nom est 'sNom'
	for cpt = 0 to oDrawpage.count -1
		objetTrouve = oDrawpage(cpt)
		buf = objetTrouve.name
'		msgbox ("texte : " & objetTrouve.string)
		if (strcomp(sNom, buf) = 0) then
'			Selectionne la forme à copier
			thisComponent.getCurrentController.select(objetTrouve)	
			oCopy =  thisComponent.getCurrentController.getTransferable()
			Deselection
			AtteindreSignet(oDoc,"PASTE")
			oDoc.CurrentController.insertTransferable(oCopy)
			msgbox("la forme a été trouvée et collée")
			' Donner un nom différent à ce dupli pour le retrouver ensuite
			oCurrCtrl = thisComponent.getCurrentController
			oSelect = oCurrCtrl.getSelection
			oDessin2 = oSelect.getByIndex(0)
			oDessin2.setName(sNom & "_2")
			msgbox("la forme a été renomée")
			Exit For		
		end if
		next cpt
		'Rechercher l'objet que l'on vient de coller et lui ajouter du texte
		for cpt = 0 to oDrawpage.count -1
			objetTrouve = oDrawpage(cpt)
			buf = objetTrouve.name
	'		msgbox ("texte : " & objetTrouve.string)
			if (strcomp(sNom & "_2", buf) = 0) then
				objetTrouve.string = objetTrouve.string & "J'ai réussi a ajouter du texte !!!"
				Exit For				
			end if
		next cpt
end sub

sub DeSelection
Dim document as object, dispatcher as object
	document   = ThisComponent.CurrentController.Frame
	dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
	dispatcher.executeDispatch(document, ".uno:Escape", "", 0, Array())
End Sub
A+
Libre Office Version: 6.1.6 et Apache OpenOffice 4.1.6 Sur Xubuntu 18.04 AMD64
ooSikas
Membre OOrganisé
Membre OOrganisé
Messages : 72
Inscription : 22 juil. 2017 08:33

Re: [Writer]Coller puis modifier une forme de dessin

Message par ooSikas »

Je n avais pas connaissance de cette propriété.

Je te remercie Piaf. Mon problème est résolu :)
LibreOffice Version: 6.4.4.2 sous Windows 10