Altra aggiustatina al codice, alcune novità, e inseriti alcuni esempi per mostrarle.
Per ricapitolare, la libreria fornisce la classe base CTable, e una serie di classi e oggetti di contorno, ed essenziali (o quasi) al corretto utilizzo di CTable. A parte alcune classi necessarie a CTable, ho diviso le funzionalità di gestione della griglia/tabella in due blocchi distinti: editor e renderer, ovvero oggetti che gestiscono il dato in modalità di editing, e altri che ne gestiscono la presentazione a video. Alcuni di questi oggetti possono avere abilità di esecuzione, ovvero al doppio-click lanciare un'apposito evento Click, con cui è possibile effettuare alcune operazioni nel resto dell'applicazione, oppure anche di sola presentazione (es. un'etichetta senza alcuno scopo attivo).
Nella lista seguente l'elenco degli oggetti esportati dalla libreria e una nota sulla loro funzionalità.
CTable | E' la classe principale, ovvero la griglia di gestione e presentazione dei dati. I dati da manipolare vengono forniti come array multidimensionale4 (righe,colonne), e possono essere di verso tipo, più o meno tutte le tipologie base gestite da Gambas (Integer, Date, Float, String). |
CTableCell | Classe usato da CTable per passare e gestire informazioni riguardanti una singola cella. |
CTableColumn | Classe usata per definire le proprietà di un'intera colonna (header e altro...). L'oggetto viene creato a parte e aggiunto poi alla CTable tramite le apposite funzioni. |
CTableColumns | Classe usato da CTable per passare e gestire informazioni riguardanti le colonne della tabella. |
CTableData | Classe usato da CTable per passare e gestire informazioni riguardanti una singola cella, in modalità rendering. |
CTableRow | Classe usato da CTable per passare e gestire informazioni riguardanti una singola riga. |
CTableRows | Classe usato da CTable per passare e gestire informazioni riguardanti le righe della tabella. |
CCellEditor | Classe base per gli oggetti editor. |
CCellButtonEditor | Derivata da CCellEditor, permette di eseguire funzioni esterne tramite intercettazione dell'evento Click (ad esempio aprire una Dialog). Si presenta come un pulsante |
CCellCheckEditor | Classe di editing per valori Boolean tramite CheckBox |
CCellColorEditor | Classe per la selezione di colori tramite ColorBox. |
CCellComboEditor | Classe per la selezione di valori all'interno di una ComboBox (non editabile). |
CCellCurrencyEditor | Classe per la gestione di valori in virgola mobile. |
CCellDateEditor | Classe per la gestione di valori di tipo Date (solo anno, mese e giorno). |
CCellDateTimeEditor | Classe per la gestione di valori di tipo Date/Time. |
CCellIPAddressEditor | Classe per la gestione di indirizzi IP. |
CCellMaskEditor | Classe per la gestione di valori di tipo String tramite MaskBox. |
CCellNumberEditor | Classe per la gestione di valori di tipo Float tramite TextBox. |
CCellPercentEditor | Classe per la gestione di valori di tipo percentuale (0/100%). |
CCellPictureEditor | Derivata da CCellEditor, permette di eseguire funzioni esterne tramite intercettazione dell'evento Click (ad esempio aprire una Dialog). Si presenta con una immagine. |
CCellProgressEditor | Classe per la gestione di valori Float (compresi tra 0 e 1). |
CCellSelectEditor | Classe per la gestione di valori di tipo String tramite ButtonBox. |
CCellSpinEditor | Classe per la gestione di valori di tipo Integer tramite SpinBox. |
CCellTextEditor | Classe per la gestione di valori di tipo String tramite TextBox. |
CCellTimeEditor | Classe per la gestione di valori di tipo Time. |
CCellRenderer | Classe base per gli oggetti di rendering. |
CCellButtonRenderer | Visualizza una String (es. quella editata con CCellButtonEditor). |
CCellCheckRenderer | Visualizza un valore Boolean. |
CCellColorRenderer | Visualizza un valore Color. |
CCellComboRenderer | Visualizza un valore String. |
CCellCurrencyRenderer | Visualizza un valore Float in formato valuta. |
CCellDateRenderer | Visualizza un valore Date. |
CCellDateTimeRenderer | Visualizza un valore Date/Time. |
CCellImageRenderer | Visualizza un'immagine. |
CCellIPAddressRenderer | Visualizza un indirizzo IP. |
CCellMaskRenderer | Visualizza una String nel formato definito nella Mask. |
CCellNumberRenderer | Visualizza un Float con il numero di decimali stabilito. |
CCellPercentRenderer | Visualizza una percentuale. |
CCellPictureRenderer | Visualizza un'immagine. |
CCellProgressRenderer | Visualizza un valore Integer tramite una barra colorata (0/100%). |
CCellSelectRenderer | Visualizza un valore String. |
CCellSpinRenderer | Visualizza un valore Integer. |
CCellTextRenderer | Visualizza un valore String. |
CCellTimeRenderer | Visualizza un valore Time. |
CSelect | Aggiunge alcune opzioni alla classe Select di Gambas, utili per CTable. |
CSort | Costanti statiche per il sorting dei dati in CTable. |
CTableHorizontalMoveColumnControls | Pannello orizzontale con pulsanti di movimento per le colonne in una CTable. Il collegamento alla CTable avviene tramite la proprietà Table. L'oggetto può essere inserito in qualsiasi punto di una Form. |
CTableVerticalMoveColumnControls | Pannello verticale con pulsanti di movimento per le colonne in una CTable. Il collegamento alla CTable avviene tramite la proprietà Table. L'oggetto può essere inserito in qualsiasi punto di una Form. |
CTableHorizontalMoveRowControls | Pannello orizzontale con pulsanti di movimento per le righe in una CTable. Il collegamento alla CTable avviene tramite la proprietà Table. L'oggetto può essere inserito in qualsiasi punto di una Form. |
CTableVerticalMoveRowControls | Pannello verticale con pulsanti di movimento per le righe in una CTable. Il collegamento alla CTable avviene tramite la proprietà Table. L'oggetto può essere inserito in qualsiasi punto di una Form. |
: alcuni degli oggetti di rendering sono stati creati pensando all'assonanza con le relative classi di editing. In alcuni casi il legame è molto stretto, per cui si consiglia di utilizzare per lo stesso dato la coppia renderer/editor.
Le classi di rendering e di editing le ho create cercando di coniugare l'aspetto grafico (es. i controlli utilizzati di base), e l'effettiva utilità pratica all'interno della griglia. Al momento, ho praticamente usato tutti i controlli, ma questo non preclude la possibilità di implementarne di nuovi, o di specializzati derivandoli da quelli già esistenti. A voi lascio la fantasia di crearne di nuovi.
La logica che ho implementato credo sia abbastanza malleabile da permettere di aggiungere ulteriori caratteristiche, senza dover necessariamente andare a mettere le mani sulla classe CTable. Come ho accennato nel primo post, l'idea è derivata dall'ambiente java e dall'esperienza e lo studio delle librerie utilizzate da questo linguaggio, e cercando di trasferirne la tecnologia anche su Gambas.
E' ovvio che alcuni limiti ci sono, per cui al momento la grafica è quella che è...