Differenze nel modello ad oggetti di VBA e StarBasic (SB)

Sebbene OpenOffice Calc possa leggere i documenti Microsoft Excel, non Ŕ possible trasportare moduli VBA come funzioni in Calc, anche se VBA e StarBasic (SB) sono sintatticamente uguali. La ragione per cui le cartelle Excel/VBA non possano essere eseguite con Calc/SB Ŕ dovuta alle differenze di fondo tra il modello di oggetti in Excel e Calc.
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Ó. L’ereditarietÓ Ŕ il processo attraverso il quale un oggetto acquisisce le proprietÓ di un altro oggetto. Il modello di Microsoft non supporta questa caratteristica.
Per illustrare l’ereditarietÓ 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 l’oggetto "Circle" ne eredita il metodo direttamente dall’oggetto "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Ó l’ambiente 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 quell’oggetto deve supportare tutti i metodi definiti dall’interfaccia. Una interfaccia pu˛ derivare da un’altra interfaccia grazie all’ereditarietÓ. Assumiamo che l’interfaccia di "Circle" erediti l’interfaccia di "Shape". Gli oggetti che implementano l’interfaccia di "Circle" devono implementare ogni metodo definito nell’interfaccia di "Circle" e nell’interfaccia di "Shape".
Un servizio definisce un oggetto specificandone le interfacce e le proprietÓ che quell’oggetto supporta. Un servizio pu˛ anche supportare altri servizi. Una interfaccia nel suo nome contiene sempre una "X". Per esempio l’interfaccia "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 l’interfaccia 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 l’esempio 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 l’equivalente informazione in CalcSB, prima di accedere al range, esiste un metodo definito dall’interfaccia XCellRange chiamato getCellRangeByName. L’interfaccia 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 l’accesso alle colonne ed alle righe del range. Da qui possiamo chiamare il metodo getRows() per restituire l’insieme 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 all’ereditaritÓ.

Cognolato Studio ę 2005