[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 !
gelinp
Membre OOrganisé
Membre OOrganisé
Messages : 58
Inscription : 12 mars 2011 21:40

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

Message 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.
Dernière modification par micmac le 16 mai 2019 21:19, modifié 4 fois.
Raison : Ajout de la coche verte
LibreOffice Version 7.4.6.2
Utilisation sur plusieurs systèmes d'exploitation (nomadisme sous windows et Linux)
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 09:26

Re: [Basic] setPropertyValue pour les pseudos objets ?

Message 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.
AOOo 4.1.7 sur Win10
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)
gelinp
Membre OOrganisé
Membre OOrganisé
Messages : 58
Inscription : 12 mars 2011 21:40

Re: [Basic] setPropertyValue pour les pseudos objets ?

Message 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é.
LibreOffice Version 7.4.6.2
Utilisation sur plusieurs systèmes d'exploitation (nomadisme sous windows et Linux)
Avatar de l’utilisateur
Hubert Lambert
SuppOOrter
SuppOOrter
Messages : 1214
Inscription : 06 avr. 2016 09:26

Re: [Basic] setPropertyValue pour les pseudos objets ?

Message 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.
AOOo 4.1.7 sur Win10
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)
Verrouillé