Macro, Dialog, lista con immagini

Ciao ragazzi, sto sviluppando una macro con Calc. Lavoro con Grid (controllo tabella), e volevo inserire nella grid delle piccole immagini, simili ad icone, come è possibile fare con le listview di Windows per intenderci.
Non ho trovato nulla circa inserire icone o piccole immagini nelle Grid, ma non riesco a trovare nulla neanche per gli altri controlli (avevo pensato di utilizzare una casella di riepilogo, listbox, andrebbe bene lo stesso, ma nulla…)
Qualcuno di voi sa come gestire liste con immagini in codice base nelle macro libreoffice? Per avere un’idea su ciò che cerco di fare, guardate l’allegato.
Luca
Annotation 2023-02-24 224256

Ho trovato qualcosa… codice un po’ da pazzi ma sembra funzionare, lo allego per chi avesse bisogno di visualizzare piccole immagini nella grid. Questa è la fonte:
https://listarchives.libreoffice.org/global/users/2015/msg06655.html

Il codice funziona ma … come personalizzare l’icona visualizzata? Mi sembra di capire che la piccola immagine sia “dentro” la funzione GetPicHexString(), che contiene delle stringhe esadecimali… come modificarla con un’icona / immagine personalizzata?

Graphic_test.ods (11.9 KB)

Pure io stavo lavorando a questo tipo di soluzione, però mi funziona solo con openoffice, devo fare ulteriori prove e sistemarla per libreoffice

REM  *****  BASIC  *****

Sub Main
 xgraphic  =  GetGraphFromHexString(GetPicHexString("file://C:/Users/gaeta/OneDrive/Desktop/medaglia.png"))
 makegrid(xgraphic)
End Sub

function GetGraphFromHexString(sHex as String) as Any
    oStorageFac = createUnoService("com.sun.star.embed.StorageFactory")
    oStorage    = oStorageFac.createInstance
	oStream = oStorage.openStreamElement("ms777", com.sun.star.embed.ElementModes.READWRITE)

	oDataOutputStream = createUNOService ("com.sun.star.io.DataOutputStream")
    oDataOutputStream.setOutputStream(oStream)
    for k=0 to len(sHex)/2-1
      i = CInt("&H" & Mid(sHex, 2*k+1,2))
      if i >=128 then i = i-256
      oDataOutputStream.writeByte(i)
	next k

    oDataOutputStream.flush
    oDataOutputStream.closeOutput

    oProvider = createUnoService("com.sun.star.graphic.GraphicProvider")
    Dim oProps(0)as new com.sun.star.beans.PropertyValue
    oProps(0).Name  = "InputStream"
    oProps(0).Value = oStream
    GetGraphFromHexString = oProvider.queryGraphic(oProps())
end function


Sub makegrid(xgraphic)
Dim dlg As Object, km As Object
Dim gdatam As Object, gcolm As Object, uneColonne As Object

DialogLibraries.loadLibrary("Standard")
dlg = CreateUnoDialog(DialogLibraries.getByName("Standard").getByName("Dialog1"))

gcolm = CreateUnoService("com.sun.star.awt.grid.DefaultGridColumnModel")
uneColonne = CreateUnoService("com.sun.star.awt.grid.GridColumn")
uneColonne.Title = "Production"
gcolm.addColumn(uneColonne)
uneColonne = CreateUnoService("com.sun.star.awt.grid.GridColumn")
uneColonne.Title = "Info"
gcolm.addColumn(uneColonne)
uneColonne = CreateUnoService("com.sun.star.awt.grid.GridColumn")
uneColonne.Title = "Result"
gcolm.addColumn(uneColonne)

gdatam = CreateUnoService("com.sun.star.awt.grid.DefaultGridDataModel")
dim ass() as variant

gdatam.addRow("France", array(xgraphic,"aaaa", -217))
gdatam.addRow("Germany", Array(xgraphic,"bbbb", 1234))
gdatam.addRow("Sweden", Array(xgraphic,"cccc", 951.23))
'gdatam.RowHeaderWidth = 30


km = dlg.Model.createInstance("com.sun.star.awt.grid.UnoControlGridModel")
km.PositionX = 15
km.PositionY = 15
km.Width = 200
km.Height = 150
km.Name = "Grid1"
km.GridDataModel = gdatam
km.ColumnModel = gcolm
km.GridLineColor = RGB(0, 0, 0)
km.TextColor =     RGB(0,0,150)
km.ShowColumnHeader = True
km.ShowRowHeader = True
km.HeaderBackgroundColor = RGB(255, 255, 0)

dlg.Model.insertByName(km.Name, km)

dlg.execute
dlg.dispose
End Sub

Function GetPicHexString(sPath)
 sPath = "file://C:/Users/gaeta/OneDrive/Desktop/medaglia.png"
  sfa = CreateUnoService("com.sun.star.ucb.SimpleFileAccess")
  io = sfa.openFileRead(sPath)
  bytes = nothing

  n = io.readBytes(bytes, &HFFFF / 2)
  io.closeInput()
  
  if n > 0 then
    s = ""
    for i = 0 to ubound(bytes) step 1
      b = bytes(i)
      if b < 0 then b = 256 + b
      a = hex(b)
      if b < 16 then
        s = s & "0" & hex(b)
      else
        s = s & hex(b)
      end if
    next
    
 end if
 GetPicHexString = s
End Function

Ho usato un indirizzo fisso dell’immagine, da cambiare, puoi usare un riferimento alle celle contenenti i dati dove in una colonna indichi il nome del file da caricare
xgraphic = GetGraphFromHexString(GetPicHexString(“file://C:/Users/gaeta/OneDrive/Desktop/medaglia.png”))

Molto interessante… ho sostituito la funzione GetPicHexString con la tua, ma nulla mi va in crash il calc… ho creato un’immagine 16x16 png, forse crea problemi? Intanto faccio altre prove, vediamo di venirne a capo perché ci siamo quasi…

Con OpenOffice funziona perfettamente, puoi creare i codici delle immagini con OpenOffice e usarli su LibreOffice, fin quando non troviamo la soluzione per libre

Con il datagrid la vedo dura, non so se sia possibile(credo di no) puoi usare dei controlli affiancati, di quanti item parliamo, il numero è variabile?

Ciao grazie della risposta, si purtroppo gli elementi sono variabili… stavo provando a fare come da tuo consiglio… vediamo se riusciamo ma anche se riusciamo a generare a runtime immagini e label, il problema rimane il numero da gestire e riposizionare nel Dialog… un caos insomma… peccato questi controlli siano così difficili da gestire con le immagini…