Page 1 sur 1

[Résolu][Basic] setPropertyValue pour les pseudos objets ?

Publié : 14 mai 2019 11:06
par gelinp
Bonjour,

Je cherche à affecter une valeur à une propriété d'un pseudo objet, connaissant le nom de la propriété dans une chaine de caractères. Je comprends qu'il faudrait pour cela utiliser une méthode introspective comme par exemple le propose la méthode setPropertyValue du service XPropertySet.

Le problème est que je n'arrive pas à mettre en oeuvre le service XPropertySet sur un module pseudo objet créé par moi. Je comprends que ce service pourrait être utilisé sur des objets instanciés par Uno, alors j'ai bien cherché à utiliser CreateIObject pour instancier un service (objet) de type Bean qui aurait pu supporter ce service mais je n'ai rien trouvé de semblable dans l'interface Uno proposée...

Quelqu'un connaitrait-il une solution pour attribuer la valeur à une propriété d'un pseudo objet, ou même une structure, connaissant le nom de cette propriété dans une chaine de caractères ?

Merci pour votre aide.

Re: [Basic] setPropertyValue pour les pseudos objets ?

Publié : 16 mai 2019 06:19
par Hubert Lambert
Bonjour,

Parmi les fonctions non documentées d'OpenOffice et Libreoffice (la plupart venant du monde du VBA) existe la fonction CallByName, qui pourrait répondre à ton besoin si je l'ai bien compris.
Un petit exemple :

Code : Tout sélectionner

Sub Main
	doc = thiscomponent
	print CallByName(doc, "Title", 2)
	'print doc.Title
End Sub
Cordialement.

Re: [Basic] setPropertyValue pour les pseudos objets ?

Publié : 16 mai 2019 13:54
par gelinp
Super ! C'est exactement ce que je cherchais ...

Mais après un test ce soir je comprends que ce n'est vraiment pas simple à utiliser car je comprends que ce n'est pas vraiment une fonction Ooo mais plutôt une function Visual Basic (Microsoft) utilisable par le biais du module de comaptibilité. Aussi je n'arrive pas à l'utiliser car mon programme plante sur l'appel de la première ligne de setOOoProp, c'est-à-dire : Set oSM = CreateObject("com.sun.star.ServiceManager")

Voici l’extrait de mon code : La funciton SetOOoProp est nécessaire pour mettre en forme l'argument utilisé dans CallByName ...

Code : Tout sélectionner

' #PUBLIC METHOD# ==================================================================
' Name...........: setOOoProp
' Description ...: 
' Parameters ....: 
' Syntax ........: 
' Return values .: 
' Author ........: 
' Modified.......: 
' Remarks .......: 
' Related .......:
' Link ..........:
' Example .......:
Function setOOoProp(cName As String, uValue As Variant) As Object
    
  Dim oPropertyValue As Object
  Dim oSM As Object
	
  Set oSM = CreateObject("com.sun.star.ServiceManager")    
  Set oPropertyValue = oSM.Bridge_GetStruct("com.sun.star.beans.PropertyValue")
  oPropertyValue.Name = cName
  oPropertyValue.Value = uValue
      
  Set setOOoProp = oPropertyValue

End Function

' #PUBLIC METHOD# ==================================================================
' Name...........: SetValue
' Description ...: 
' Parameters ....: 
' Syntax ........: 
' Return values .: 
' Author ........: 
' Modified.......: 
' Remarks .......: 
' Related .......:
' Link ..........:
' Example .......:
Public Sub SetValue(UnoObject As Object, Value As Variant)
	
	On local error goto Erreur
	
	If _TUOFIsAccessible Then
		Dim arg As Variant
		arg = setOOoProp("Titre", "TEST")
		CallByName(UnoObject, _TUOFFieldName, VbLet, arg)
	EndIf
	
Exit_Sub:
	On error resume next
	Exit Sub
Erreur:
	TraceError("ERROR", Err, Name, Erl)
	Stop
End Sub
Je marque le fil terminé.

Re: [Basic] setPropertyValue pour les pseudos objets ?

Publié : 21 mai 2019 18:38
par Hubert Lambert
gelinp a écrit :[...] je comprends que ce n'est pas vraiment une fonction Ooo mais plutôt une function Visual Basic (Microsoft) utilisable par le biais du module de comaptibilité
Non, je n'ai pas dit ça. La fonction n'est pas documentée et vient de l'univers VBA, mais elle est tout à fait disponible sans faire appel à l'option de compatibilité.
gelinp a écrit :Aussi je n'arrive pas à l'utiliser car mon programme plante sur l'appel de la première ligne de setOOoProp, c'est-à-dire : Set oSM = CreateObject("com.sun.star.ServiceManager")
Cette erreur n'a rien à voir. Je ne sais pas où tu l'as recopiée, mais elle contient 2 erreurs : le nom exact du service est "com.sun.star.lang.ServiceManager", et la fonction pour l'instancier est "CreateUnoService" :

Code : Tout sélectionner

xray CreateUnoService("com.sun.star.lang.ServiceManager")
Et pourquoi faire appel à ce service ? Si tu lis la documentation sur l'api UNO, tu verras qu'une propriété s'obtient comme ceci :

Code : Tout sélectionner

    dim prop(0) as new com.sun.star.beans.PropertyValue
    prop(0).Name = "Title"
    prop(0).Value = "TEST"
ou comme ceci : https://wiki.openoffice.org/wiki/FR/Doc ... a_document.

Les exemples sont innombrables sur le forum.