Search code examples
libreofficebasicuno

simplest Unostructure that supports he getByName


In LibreOffice Basic sub I use a bunch of uno properties in an array. Which is the simplest Unostructure or UnoService that I must "embed" them, in order to use the getByName "function"?

Example:

dim props(1) as new com.sun.star.beans.PropertyValue

props(0).Name = "blahblah1"
props(0).Value = "blahblah1Value"
props(1).Name = "blahblah2"
props(1).Name = 3000

I want to be able to use something like:

b = props.getByName("blahblah2").Value

or something like (assuming I "assigned" them in a structure-like-object called "somestruct") :

 b = somestruct.getprops.getByName("blahblah2").Value

As I understand that this can be done by creating a "UnoService" which supports the getByName and then, somehow, assigning these props to this service Which is the "lightest" such service? (I mean the service that uses less resources)

Thanks in advance.


Solution

  • Really supporting the interface XNameAccess is not as easy. The services which implement this interface are supposed using this interface for existing named properties, not for own created ones.

    But you can use the service EnumerableMap to achieve what you probably want.

    Example:

    sub testEnumerableMap
    
     serviceEnumerableMap = com.sun.star.container.EnumerableMap
     oEnumerableMap = serviceEnumerableMap.create("string", "any")
    
     oEnumerableMap.put("blahblah1", "blahblah1Value")
     oEnumerableMap.put("blahblah2", 3000)
     oEnumerableMap.put("blahblah3", 1234.67)
    
     msgbox oEnumerableMap.get("blahblah1")
     msgbox oEnumerableMap.get("blahblah2")
     msgbox oEnumerableMap.get("blahblah3")
     'msgbox oEnumerableMap.get("blahblah4") 'will throw error
    
     msgbox oEnumerableMap.containsKey("blahblah2")
     msgbox oEnumerableMap.containsValue(3000)
    
     if oEnumerableMap.containsKey("blahblah4") then 
      msgbox oEnumerableMap.get("blahblah4")
     end if
    
    end sub
    

    But starbasic with option Compatible is also able supporting Class programming like VBA does.

    Example: enter image description here

    Create a module named myPropertySet. Therein put the following code:

    option Compatible
    option ClassModule
    
    private aPropertyValues() as com.sun.star.beans.PropertyValue
    
    public sub setProperty(oProp as com.sun.star.beans.PropertyValue)
     bUpdated = false
     for each oPropPresent in aPropertyValues
      if oPropPresent.Name = oProp.Name then 
       oPropPresent.Value = oProp.Value
       bUpdated = true
       exit for
      end if
     next
     if not bUpdated then 
      iIndex = ubound(aPropertyValues) + 1
      redim preserve aPropertyValues(iIndex) 
      aPropertyValues(iIndex) = oProp
     end if
    end sub
    
    public function getPropertyValue(sName as string) as variant
     getPropertyValue = "N/A"
     for each oProp in aPropertyValues
      if oProp.Name = sName then 
       getPropertyValue = oProp.Value
       exit for
      end if
     next
    end function
    

    Then within a standard module:

    sub testClass
    
     oPropertySet = new myPropertySet
     dim prop as new com.sun.star.beans.PropertyValue
    
     prop.Name = "blahblah1"
     prop.Value = "blahblah1Value"
     oPropertySet.setProperty(prop) 
    
     prop.Name = "blahblah2"
     prop.Value = 3000
     oPropertySet.setProperty(prop)
    
     prop.Name = "blahblah3"
     prop.Value = 1234.56
     oPropertySet.setProperty(prop)
    
     prop.Name = "blahblah2"
     prop.Value = 8888
     oPropertySet.setProperty(prop)
    
     msgbox oPropertySet.getPropertyValue("blahblah1")
     msgbox oPropertySet.getPropertyValue("blahblah2")
     msgbox oPropertySet.getPropertyValue("blahblah3")
     msgbox oPropertySet.getPropertyValue("blahblah4")
    
    end sub