Pagina 1 di 1

[Risolto]Grid control in finestra dialogo calc

Inviato: sabato 25 febbraio 2017, 12:23
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

Re: Grid controllata in finestra dialogo calc

Inviato: sabato 25 febbraio 2017, 12:57
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

Re: Grid controllata in finestra dialogo calc

Inviato: sabato 25 febbraio 2017, 14:25
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.

Re: Grid controllata in finestra dialogo calc

Inviato: sabato 25 febbraio 2017, 15:32
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.

Re: Grid controllata in finestra dialogo calc

Inviato: sabato 25 febbraio 2017, 20:26
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?

Re: Grid controllata in finestra dialogo calc

Inviato: sabato 25 febbraio 2017, 23:26
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).

Re: Grid controllata in finestra dialogo calc

Inviato: domenica 26 febbraio 2017, 9:08
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) 

Re: Grid controllata in finestra dialogo calc

Inviato: domenica 26 febbraio 2017, 9:53
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.

Re: Grid controllata in finestra dialogo calc

Inviato: domenica 26 febbraio 2017, 18:07
da patel
la colonna ? come hai fatto ?

Re: Grid controllata in finestra dialogo calc

Inviato: domenica 26 febbraio 2017, 18:47
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.

Re: Grid controllata in finestra dialogo calc

Inviato: domenica 26 febbraio 2017, 19:34
da patel
ma l'unica possibilità di selezione è la riga, quindi sarà possibile solo visualizzare tutte le celle della riga

Re: Grid controllata in finestra dialogo calc

Inviato: lunedì 27 febbraio 2017, 11:05
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

Re: Grid control in finestra dialogo calc

Inviato: lunedì 27 febbraio 2017, 11:53
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)

Re: Grid control in finestra dialogo calc [RISOLTO]

Inviato: lunedì 27 febbraio 2017, 11:58
da maxrome84
Grazie ancora, perfetto! Inserisco risolto nel titolo

Re: Grid control in finestra dialogo calc

Inviato: lunedì 27 febbraio 2017, 12:16
da charlie
viewtopic.php?f=2&t=5661
È così che si mette Risolto :P

Re: [Risolto]Grid control in finestra dialogo calc

Inviato: lunedì 27 febbraio 2017, 12:20
da maxrome84
Sistemato!