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" :
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.