[Résolu][Calc] Fonction Presse papier sous LibO 6

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 !
Denis_21
Membre lOOyal
Membre lOOyal
Messages : 43
Inscription : 04 août 2017 08:08

[Résolu][Calc] Fonction Presse papier sous LibO 6

Message par Denis_21 »

Bonjour,

Les fonctions BASIC pour le presse papier (vider, remplir, lire) trouvéeshttps://forum.openoffice.org/fr/forum/v ... 4&p=186906 fonctionnaient parfaitement en version Libre Office 5 mais plantage en version 6
Version: 6.0.7.3 (x64)
Build ID: dc89aa7a9eabfd848af146d5086077aeed2ae4a5
Threads CPU : 2; OS : Windows 6.1; UI Render : par défaut;
Locale : fr-FR (fr_FR); Calc: group

Les fonctions Function EmptyClipboard Lib "user32" () As Long et Function SetClipboardData Lib "user32" _
(ByVal wFormat As Long, ByVal hMem As Long) As Long ne fonctionnent plus
Est-ce une histoire de 64 bits à la place de 32 ?
Merci de vos avis si vous avez rencontré ce pb
Cordialement
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
Dernière modification par Denis_21 le 20 mars 2019 16:24, modifié 2 fois.
LibreOffice Version: 6.0.7.3 (x64)
Win 7 Professionnel
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc]Fonction Presse papier et version 6

Message par Dude »

Dans le fil que tu donnes, pourquoi ne suis-tu pas la piste que j'évoque ?
Denis_21 a écrit :Est-ce une histoire de 64 bits à la place de 32 ?
As-tu au moins vérifié que la bibliothèque user32 existait ?
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16960
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: [Calc] Fonction Presse papier sous LibO 6

Message par jeanmimi »

Bonjour,
Denis_21 a écrit : mais plantage en version 6
Comment reproduit-on le plantage ?
LibreOffice : Version : 24.2 (x64)(12 avril 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
Denis_21
Membre lOOyal
Membre lOOyal
Messages : 43
Inscription : 04 août 2017 08:08

Re: [Calc] Fonction Presse papier sous LibO 6

Message par Denis_21 »

Bonjour,

Dans le module1 lancer la procédure qui devrait mettre une phrase dans le presse-papier
LibreOffice Version: 6.0.7.3 (x64)
Win 7 Professionnel
Denis_21
Membre lOOyal
Membre lOOyal
Messages : 43
Inscription : 04 août 2017 08:08

Re: [Calc] Fonction Presse papier sous LibO 6

Message par Denis_21 »

Oui User32 et Kernel32 sont bien en c:\windows\system32
elles sont liées à Windows, il n'y a eu que le changement de LibO5 en LibO6
LibreOffice Version: 6.0.7.3 (x64)
Win 7 Professionnel
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Fonction Presse papier sous LibO 6

Message par Dude »

Et donc...
Dude a écrit :Dans le fil que tu donnes, pourquoi ne suis-tu pas la piste que j'évoque ?
Je ne vois aucun intérêt à utiliser des DLL propriétaires Windows.
Sauf à vouloir se retrouver dans la situation où tu es.
Avatar de l’utilisateur
jeanmimi
Grand Maître de l'OOffice
Grand Maître de l'OOffice
Messages : 16960
Inscription : 03 mars 2006 16:02
Localisation : Venise verte

Re: [Calc] Fonction Presse papier sous LibO 6

Message par jeanmimi »

Je n'ai pas de plantage mais seulement l'affichage des boites de dialogue (en anglais) cérites dans la Macro.
LibreOffice : Version : 24.2 (x64)(12 avril 2024)
Adoptium JRE ou Oracle JRE (x64), Windows 10, Thunderbird, Firefox
Denis_21
Membre lOOyal
Membre lOOyal
Messages : 43
Inscription : 04 août 2017 08:08

Re: [Calc] Fonction Presse papier sous LibO 6

Message par Denis_21 »

Sur le fond, Dude a raison, il faut éviter des Dll Windows pour pleins de raisons et préférer le Dispatcher

C'est ce que je fais quand il s'agit de copier des cellules ou zones Calc dans le presse-papier mais s'agissant de champs de formulaire, je n'arrive pas à copier directement la valeur d'un champ de formulaire dans le presse-papier
Je dois passer par 2 étapes, copie de la valeur du champ dans une cellule puis cellule dans le presse-papier
Cela fonctionne mais c'est loin d'être élégant

Voir exemple joint simple à partir une boite de dialogue

Peut-être faut-il faire évoluer le titre, il s'agit là de copier un champ de formulaire dans le presse papier à partir du Dispatcher

Merci
Vous ne pouvez pas consulter les pièces jointes insérées à ce message.
LibreOffice Version: 6.0.7.3 (x64)
Win 7 Professionnel
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Fonction Presse papier sous LibO 6

Message par Dude »

Il faut se servir du service SystemClipboard.
Un peu complexe car il faut le coupler à de l'écoute sur les opérations de transfert avec le presse-purée.

Il suffit d'ajouter une routine pour la copie et les 3 listeners afférents.
On notera la déclaration en global d'une variable pour le transfert.

Code : Tout sélectionner

' Du code fourni depuis le forum OpenOffice
' https://forum.openoffice.org/fr/forum/viewtopic.php?f=8&t=60087
Global sTransfert$

Sub CopieDansPP()
	Dim oDude as object
	oPP = createUnoService ("com.sun.star.datatransfer.clipboard.SystemClipboard")
	oTR = createUnoListener("TR_", "com.sun.star.datatransfer.XTransferable")
	oPP.setContents(oTR, oDude)
End sub	
	
Function TR_getTransferData(aF as com.sun.star.datatransfer.DataFlavor )
   If (aF.MimeType = "text/plain;charset=utf-16") Then TR_getTransferData = sTransfert
End Function

Function TR_getTransferDataFlavors()
   Dim aF as new com.sun.star.datatransfer.DataFlavor
   aF.MimeType             = "text/plain;charset=utf-16"
   aF.HumanPresentableName = "Unicode-Text"
   TR_getTransferDataFlavors = Array(aF)
End Function

Function TR_isDataFlavorSupported(aF as com.sun.star.datatransfer.DataFlavor) as Boolean
   TR_isDataFlavorSupported = (aF.MimeType = "text/plain;charset=utf-16")
End Function
Puis de corriger ton code existant en y ajoutant simplement deux lignes :

Code : Tout sélectionner

Sub CopierChampFormulaireDansPressePapier(oev as object)
Dim oDocument as object, oFeuille as object, oCellule as object
Dim monChamp as object, monTexte as string
monChamp=oev.source.context.GetControl("monChamp")

	sTransfert = monChamp.text
	CopieDansPP()

end sub
Denis_21
Membre lOOyal
Membre lOOyal
Messages : 43
Inscription : 04 août 2017 08:08

Re: [Calc] Fonction Presse papier sous LibO 6

Message par Denis_21 »

Très fort et propre, ça fonctionne parfaitement

J'ai aussi le problème symétrique pour coller le presse-papier dans un champ de formulaire, comme pour remplir le presse-papier, je m'en sors avec une bidouille Dispatcher et cellule intermédiaire mais lourd et pas très élégant
Avant de mettre résolu, pour être complet sur le sujet, est-il possible récupérer le contenu du presse-papier sans passer par les fonctions API


Merci
LibreOffice Version: 6.0.7.3 (x64)
Win 7 Professionnel
Avatar de l’utilisateur
Dude
IdOOle de la suite
IdOOle de la suite
Messages : 25181
Inscription : 03 mars 2006 07:45
Localisation : 127.0.0.1

Re: [Calc] Fonction Presse papier sous LibO 6

Message par Dude »

Encore un problème XY !
Franchement, je ne vois toujours pas l'intérêt de passer par un tiers pour de l'échange de donnée.
Tiers qui est du ressort du système d'exploitation et dont tu ne peux maîtriser le contenu.

Pour cette opération, on utilise un service de conversion afin de récupérer du texte brut :

Code : Tout sélectionner

Function RecupDepuisPP() As String
	oPP = createUnoService("com.sun.star.datatransfer.clipboard.SystemClipboard")
	oSC = createUnoService("com.sun.star.script.Converter")
	oContenu = oPP.getContents
	oType = oContenu.getTransferDataFlavors()
	For i = 0 To UBound(oType)
    	If oType(i).MimeType = "text/plain;charset=utf-16" Then Exit For
	Next i
	RecupDepuisPP = oSC.convertToSimpleType _
                        (oContenu.getTransferData(oType(i)), _
                        com.sun.star.uno.TypeClass.STRING)
End Function
A toi ensuite d'adapter suivant le contexte pour coller l'information.
Denis_21
Membre lOOyal
Membre lOOyal
Messages : 43
Inscription : 04 août 2017 08:08

[Résolu] [Calc] Fonction Presse papier sous LibO 6

Message par Denis_21 »

Fonctionne parfaitement
Fonctions mise dans le presse papier et récupération à privilégier (enfin selon moi surtout pour du simple texte) effectivement par rapport au Dispatcher ou API
Grand merci
Cordialement
LibreOffice Version: 6.0.7.3 (x64)
Win 7 Professionnel