[Risolto]Grid control in finestra dialogo calc

Creare una macro - Scrivere uno script - Usare le API
Rispondi
maxrome84
Messaggi: 55
Iscritto il: mercoledì 1 giugno 2016, 18:37

[Risolto]Grid control in finestra dialogo calc

Messaggio da maxrome84 »

Salve a tutti.Ho trovato questa macro che permette di creare una tabella nelle finestre di dialogo di calc.Da quello che ho letto va creato tutto tramite codice, visto che nell'editor non è prevosto.Ho provato il codice è funziona bene.
Ora il mio obiettivo sarebbe visualizzare nella tabella i dati di un foglio.
Ci sono anche riuscito con un ciclo for next , ma dopo un certo numero di righe diventa lento.
C'È un sistema magari per passare un array e velocizzare la procedura?
Qualcuno sa dove potrei reperire esempi su questa funzionalità? Questo codice è tutto quello che ho trovato.
Dalle api sembrerebbe possibile anche filtrare i dati, ma senza esempi non so da dove iniziare.
Grazie a tutti.

Sub GridOnDialog()
dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
dlgmodel = dlg.getModel()

' create new grid control
gridmodel = dlgmodel.createInstance("com.sun.star.awt.grid.UnoControlGridModel")
with gridmodel
.PositionX = 10
.PositionY = 10
.Width = 150
.Height = 100
end with

' add columns
columnmodel = gridmodel.ColumnModel
col = columnmodel.createColumn()
col.Title = "Name"
columnmodel.addColumn(col)
col = columnmodel.createColumn()
col.Title = "Value"
columnmodel.addColumn(col)

' insert grid control to the dialog
dlgmodel.insertByName("grid", gridmodel)


' fill the grid with data
datamodel = gridmodel.GridDataModel
datamodel.addRow("a", Array("foo", 100))
datamodel.addRow("b", Array("bar", 200))
datamodel.addRow("c", Array("hoge", 300))
datamodel.addRow("d", Array("huga", 400))

dlg.execute()
dlg.dispose()
End Sub
Ultima modifica di maxrome84 il lunedì 27 febbraio 2017, 12:20, modificato 2 volte in totale.
Open Office 4 beta
windows 7
Gaetanopr
Volontario
Volontario
Messaggi: 3291
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Grid controllata in finestra dialogo calc

Messaggio da Gaetanopr »

Si purtroppo questa datagrill che poi non è altro che una listbox multicolonna non è prevista sull'editor, io la utilizzo su diversi files.
Allega il tuo file e spiega cosa vuoi ottenete
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
maxrome84
Messaggi: 55
Iscritto il: mercoledì 1 giugno 2016, 18:37

Re: Grid controllata in finestra dialogo calc

Messaggio da maxrome84 »

Ora sono fuori, non posso allegarlo , il prima possibile lo farò.intanto cerco di spiegarmi.
Ho un foglio con una tabella e varie righe tipo:
Progressivo | Data | totale|

Quindi sotto queste intestazioni di colonna ho varie righe di dati.Ecco io vorrei riportare questa tabella nella dataGrill.
E dovrebbe essere abbastanza veloce la procedura visto che sono presenti svariare righe.
Grazie per la risposta.
Open Office 4 beta
windows 7
maxrome84
Messaggi: 55
Iscritto il: mercoledì 1 giugno 2016, 18:37

Re: Grid controllata in finestra dialogo calc

Messaggio da maxrome84 »

Ecco il file di esempio come promesso.Questo è quello che voglio ottenere.L'unico inconveniente è che oltre un tot di righe diventa molto lento nel riempire la griglia.
Facendo un paragone con la listbox , io utilizzo una procedura che ora non ho sottomano che in pratica da un range di celle riempie un array e questo veniva passato alla listbox, rendendo il caricamento della lista immediato anche con 4000 - 5000 righe.
Inoltre sarei curioso anche del metodo per filtrare il gridmodel che mi sembra di aver letto fra le api-
grazie ancora per la pazienza.
Allegati
Senza nome 1.ods
(15.65 KiB) Scaricato 285 volte
Open Office 4 beta
windows 7
Gaetanopr
Volontario
Volontario
Messaggi: 3291
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Grid controllata in finestra dialogo calc

Messaggio da Gaetanopr »

maxrome84 ha scritto:L'unico inconveniente è che oltre un tot di righe diventa molto lento nel riempire la griglia
Invece del metodo add.row devi usare add.rows
cambia questa parte di macro

Codice: Seleziona tutto

 for i = 2 to 5000
  datamodel.addRow("a", Array(sheet.getcellByPosition(0,i).string , sheet.getcellByPosition(1,i).string , sheet.getcellByPosition(2,i).string ))
  next i
con questa

Codice: Seleziona tutto

 Arr() = sheet.getcellRangeByName("A2:C5000").GetDataArray
datamodel.addRows(Arr, Arr)
naturalmente il range è da adattare
maxrome84 ha scritto: Inoltre sarei curioso anche del metodo per filtrare il gridmodel che mi sembra di aver letto fra le api-
Cosa intendi per filtrare?
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
maxrome84
Messaggi: 55
Iscritto il: mercoledì 1 giugno 2016, 18:37

Re: Grid controllata in finestra dialogo calc

Messaggio da maxrome84 »

Grazie infinite per l'aiuto!!! Appena posso lo testo ma è proprio quello che cercavo!!!
Per quanto riguarda il filtro ti linko la pagina dove ho trovato questo riferimento.
Però rileggendo bene forse si tratta solo di ordinare i dati per una determinata colonna. http://www.openoffice.org/api/docs/comm ... le-ix.html
In particolare XSortableMutableGridDataModel

Se posso chiederti un'ultima cosa, un array così ottenuto lo posso utilizzare anche per riempire una listbox tramite addItems? (Naturalmente di una sola colonna).
Open Office 4 beta
windows 7
Gaetanopr
Volontario
Volontario
Messaggi: 3291
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Grid controllata in finestra dialogo calc

Messaggio da Gaetanopr »

maxrome84 ha scritto: Se posso chiederti un'ultima cosa, un array così ottenuto lo posso utilizzare anche per riempire una listbox tramite addItems? (Naturalmente di una sola colonna).
In questo modo non puoi devi sempre estrarti i dati della colonna e creare un array ad una dimensione
Esempio:

Codice: Seleziona tutto

a= oSheet.getCellRangeByName("A2:A10").getdataarray
 Dim Items(ubound (a))
    for i = 0 to ubound (a)
        Items(i) = a(i)(0)
    next i
  oListBox.addItems(a, 0) 
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
maxrome84
Messaggi: 55
Iscritto il: mercoledì 1 giugno 2016, 18:37

Re: Grid controllata in finestra dialogo calc

Messaggio da maxrome84 »

Grazie ancora!Ora l'ultima giuro! Nella tabella come ottengo la stringa di una cella? Ho trovato solamente come trovare l'indice della colonna.
Open Office 4 beta
windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4016
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Grid controllata in finestra dialogo calc

Messaggio da patel »

la colonna ? come hai fatto ?
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Gaetanopr
Volontario
Volontario
Messaggi: 3291
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Grid controllata in finestra dialogo calc

Messaggio da Gaetanopr »

Devi spiegarti meglio quando chiedi qualcosa, se vuoi sapere che dato contiene la colonna 2 sulla riga 2 ti basta fare in questo modo, gli indici iniziano da 0, quindi (1, 1) sta per colonna 2 e riga 2.

Codice: Seleziona tutto

datamodel.getCellData(1, 1)
Se invece vuoi ottenere il dato selezionato(il caso più frequente e più utile) bisogna attivare un listener sul datagril e tramite questo si può ricavare tutto sulla riga selezionata.
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
patel
Volontario attivo
Volontario attivo
Messaggi: 4016
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Grid controllata in finestra dialogo calc

Messaggio da patel »

ma l'unica possibilità di selezione è la riga, quindi sarà possibile solo visualizzare tutte le celle della riga
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
maxrome84
Messaggi: 55
Iscritto il: mercoledì 1 giugno 2016, 18:37

Re: Grid controllata in finestra dialogo calc

Messaggio da maxrome84 »

Scusate, volevo dire riga all'ultimo post!
E si avrei bisogno di conoscere il dato della prima colonna della riga selezionata.
Scusate avevo scritto di fretta e non mi sono accorto che non ero stato chiaro
Open Office 4 beta
windows 7
Gaetanopr
Volontario
Volontario
Messaggi: 3291
Iscritto il: mercoledì 21 novembre 2012, 20:07

Re: Grid control in finestra dialogo calc

Messaggio da Gaetanopr »

Ho modificato la macro sistemando pure l'errore che si ha all'inizio in quanto mancava la parte che carica la libreria per il dialogo.

Codice: Seleziona tutto

REM  *****  BASIC  *****
Dim oListener As Object
Dim grid, datamodel As Object, dlg

Sub GridOnDialog()
  DialogLibraries.LoadLibrary( "Standard" )
  dlg = CreateUnoDialog(DialogLibraries.Standard.Dialog1)
  dlgmodel = dlg.getModel()
  document = thisComponent
  sheets=document.sheets
  sheet = sheets.getByName("Foglio1")
  
  ' create new grid control
  gridmodel = dlgmodel.createInstance("com.sun.star.awt.grid.UnoControlGridModel")
  
 
  with gridmodel
    .PositionX = 10
    .PositionY = 10
    .Width = 150
    .Height = 100
  end with
  
  ' add columns
  columnmodel = gridmodel.ColumnModel
  
  col = columnmodel.createColumn()
  col.Title = "NUMERO"
  columnmodel.addColumn(col)
  
  col = columnmodel.createColumn()
  col.Title = "DATA"
  columnmodel.addColumn(col)
  
  col = columnmodel.createColumn()
  col.Title = "TOTALE"
  columnmodel.addColumn(col)
  
  ' insert grid control to the dialog
  dlgmodel.insertByName("grid", gridmodel)
   grid = dlg.getControl("grid")
  oListener = (CreateUnoListener("grid_", "com.sun.star.awt.grid.XGridSelectionListener"))
  grid.addSelectionListener(oListener)
  
  ' fill the grid with data
  datamodel = gridmodel.GridDataModel
  Arr() = sheet.getcellRangeByName("A2:C28").GetDataArray
  datamodel.addRows(Arr, Arr)
 ' datamodel.addRow("b", Array("bar", 200))
  'datamodel.addRow("c", Array("hoge", 300))
  'datamodel.addRow("d", Array("huga", 400))
  
  dlg.execute()
  dlg.dispose()
End Sub

Sub grid_disposing(ev)
MsgBox "chiusura datagrid"
End Sub

Sub grid_selectionChanged(ev)
Dim rows()
  rem riga che scatena l'evento
  rows = ev.Source.getSelectedRows()
  msgbox datamodel.getRowData(rows(0))(0)
    
End Sub
Se vuoi ottenere i dati delle altre colonne basta cambiare l'indice di colonna da 0 a seguire

Codice: Seleziona tutto

datamodel.getRowData(rows(0))(1)
LibreOffice 7.2.2.2 windows 10
Openoffice 4.1.13 su windows 10
maxrome84
Messaggi: 55
Iscritto il: mercoledì 1 giugno 2016, 18:37

Re: Grid control in finestra dialogo calc [RISOLTO]

Messaggio da maxrome84 »

Grazie ancora, perfetto! Inserisco risolto nel titolo
Open Office 4 beta
windows 7
Avatar utente
charlie
Site Admin
Site Admin
Messaggi: 8785
Iscritto il: mercoledì 19 dicembre 2012, 10:50
Contatta:

Re: Grid control in finestra dialogo calc

Messaggio da charlie »

viewtopic.php?f=2&t=5661
È così che si mette Risolto :P
charlie
macOS 14.3 Sonoma: Open Office 4.1.15 - LibreOffice 7.5.7.2
http://www.charlieopenoffice.altervista.org
maxrome84
Messaggi: 55
Iscritto il: mercoledì 1 giugno 2016, 18:37

Re: [Risolto]Grid control in finestra dialogo calc

Messaggio da maxrome84 »

Sistemato!
Open Office 4 beta
windows 7
Rispondi