|
| La differenza principale tre il modello di oggetti in Excel e quello di OpenOffice è che nel modello Excel non si utilizzano del tutto le caratteristiche che costituiscono un classico ambiente di sviluppo orintato agli oggetti. Infatti in molte pubblicazioni il modello ad oggetti di Microsoft è considerato col termine "Object-like" e non "Object-oriented".
|
|
| In un vero modello di programmazione ad oggetti esiste il concetto di ereditarietà. Lereditarietà è il processo attraverso il quale un oggetto acquisisce le proprietà di un altro oggetto. Il modello di Microsoft non supporta questa caratteristica.
|
|
| Per illustrare lereditarietà consideriamo il seguente esempio. Abbiamo un oggetto "Shape" con un metodo "move()" che muove "Shape" sullo schermo. In un vero ambiente di sviluppo orientato agli oggetti, un nuovo oggetto chiamato "Circle" che deriva da "Shape", può essere implementato alla stessa maniera. Invece di creare un metodo "move()" per loggetto "Circle" ne eredita il metodo direttamente dalloggetto "Shape". |
|
| Ricerchiamo la cartella collegata al file MiaCartella.sxc. Nella cartella Standard creiamo un nuovo modulo cliccando il pulsante Nuovo. A questo punto entraimo nel modulo cliccando Modifica. Questo sarà lambiente di sviluppo che useremo nei prossimi esempi.
|
|
| Il paradigma usato in OpenOffice consiste di interfacce e servizi. Una interfaccia definisce metodi. Se un oggetto implementa una interfaccia allora quelloggetto deve supportare tutti i metodi definiti dallinterfaccia. Una interfaccia può derivare da unaltra interfaccia grazie allereditarietà. Assumiamo che linterfaccia di "Circle" erediti linterfaccia di "Shape". Gli oggetti che implementano linterfaccia di "Circle" devono implementare ogni metodo definito nellinterfaccia di "Circle" e nellinterfaccia di "Shape".
|
|
| Un servizio definisce un oggetto specificandone le interfacce e le proprietà che quelloggetto supporta. Un servizio può anche supportare altri servizi. Una interfaccia nel suo nome contiene sempre una "X". Per esempio linterfaccia "com.sun.star.drawing.XShape" definisce i metodi per controllare la posizione ed il dimensionamento di una forma. Il servizio "com.sun.star.drawing.Shape" (senza la X) definisce un oggetto che ha linterfaccia XShape. Sebbene servizi ed interfacce contengano nomi molto lunghi possono essere spesso abbreviati saltando la prima parte del nome; come ad esempio abbiamo visto per XShape.
|
|
| Capire il concetto di ereditarietà per un programmatore ExcelVBA che si accinge ad usare CalcSB è molto importante! Consideriamo lesempio seguente: prendiamo in Excel un range definito come Range("MyMatrix"). Esso rappresenta una matrice bidimensionale di celle in un foglio di lavoro. Per determinare il numero di righe si può accedere alla proprietà Range("MyMatrix").Rows.Count.
|
|
| Per trovare lequivalente informazione in CalcSB, prima di accedere al range, esiste un metodo definito dallinterfaccia XCellRange chiamato getCellRangeByName. Linterfaccia XcellRange è definita da molti servizi come: CellRange e Spreadsheet. Usando il metodo getCellRangeByName() possiamo allocare il range "MyMatrix" con la chiamata: .getCellRangeByName("MyMatrix"). Il servizio XColumnRowRange fornisce laccesso alle colonne ed alle righe del range. Da qui possiamo chiamare il metodo getRows() per restituire linsieme di righe del range. Tutto questo è consultabile nel dettaglio alla sezione "Spreadsheet" della OpenOffice Developer's Guide.
|
|
| A questo punto però non è chiaro come ottenere il numero di righe. Ricordando il concetto di ereditarietà, diciamo che la classe "rows" è una specializzazione della classe "collection", la quale contiene il metodo getCount() che restituisce il numero di occorrenze in un insieme.
|
|
Mettendo tutto insieme:
ThisComponent.CurrentController.ActiveSheet. _ getCellRangeByName("MyMatrix").getRows.getCount()
Questo è il codice SB per determinare il numero di righe in un range. Morale della favola per tradurre codice da ExcelVBA ad CalcSB è necessario ricorrere allereditarità.
|
|
|