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

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 !

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

Messagepar gelinp » 14 Mai 2019 12:06

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.
Dernière édition par micmac le 16 Mai 2019 20:19, édité 4 fois.
Raison: Ajout de la coche verte
LibreOffice Version 6.0.6.2 - Linux Mint tara - 64 bits
gelinp
Membre lOOyal
Membre lOOyal
 
Message(s) : 42
Inscrit le : 12 Mars 2011 21:40

Re: [Basic] setPropertyValue pour les pseudos objets ?

Messagepar Hubert Lambert » 16 Mai 2019 07:19

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   AgrandirRéduire
Sub Main
   doc = thiscomponent
   print CallByName(doc, "Title", 2)
   'print doc.Title
End Sub

Cordialement.
AOOo 4.1.2 sur Win7
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
 
Message(s) : 1108
Inscrit le : 06 Avr 2016 08:26

Re: [Basic] setPropertyValue pour les pseudos objets ?

Messagepar gelinp » 16 Mai 2019 14:54

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   AgrandirRéduire
' #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é.
LibreOffice Version 6.0.6.2 - Linux Mint tara - 64 bits
gelinp
Membre lOOyal
Membre lOOyal
 
Message(s) : 42
Inscrit le : 12 Mars 2011 21:40

Re: [Basic] setPropertyValue pour les pseudos objets ?

Messagepar Hubert Lambert » 21 Mai 2019 19:38

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   AgrandirRéduire
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   AgrandirRéduire
    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.
AOOo 4.1.2 sur Win7
AOOo 4.1.x sur Linux Mint
LibreOffice 5.x/6.x sur Linux Mint
--
| « Nos défauts devraient nous donner une qualité : l'indulgence pour les défauts des autres » (Rivarol)
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
 
Message(s) : 1108
Inscrit le : 06 Avr 2016 08:26


Retour vers Macros et API

Qui est en ligne ?

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