domenica, ottobre 05, 2014

Programmazione in basic con LibreOffice

Se si vogliono fare degli esercizi di programmazione con strumenti multipiattaforma e senza avere la necessità di un ambiente di sviluppo troppo complesso, tra le alternative a disposizione c'è la suite LibreOffice / OpenOffice, che mette a disposizione un editor di macro e uno strumento di progettazione di finestre di dialogo che possono fare al caso nostro per piccoli esperimenti.

Quanto segue è stato testato su LibreOffice 4.2.6.3, ma dovrebbe funzionare senza problemi anche con altre versioni di LibreOffice / OpenOffice.

Creiamo un documento contenitore

Possiamo salvare il codice della nostra miniapplicazione sia nell'ambito del nostro spazio di lavoro personale sia in specifici documenti. Se vogliamo poter utilizzare ovunque il nostro codice, dovremo scegliere la seconda opzione.

Quindi, partiamo con il salvare un documento Calc (un foglio elettronico) con un nome, come ad esempio ProgrammareLOconVB.ods. Questo documento conterrà i nostri dati ma anche il codice che scriveremo e le finestre di dialogo che prepareremo.

Creare una finestra di dialogo

Per creare una finestra di dialogo, fare clic su Strumenti / Macro / Organizza finestre di dialogo....

Ci appare una finestra in cui possiamo lavorare con le nostre finestre di dialogo. Visto che ancora non ne abbiamo una, dobbiamo:

  1. selezionare il contenitore Standard del documento su cui stiamo lavorando;
  2. fare clic su Nuovo...;
  3. assegnare un nome alla finestra di dialogo (ad esempio, ShoppingListManager);
  4. fare clic su Modifica.

Si dovrebbe aprire l'editor delle finestre di dialogo, come nella seguente immagine:



Abbiamo a disposizione un insieme di controlli che potremo disporre nella finestra:



Se per caso non dovesse comparire, fare clic su Visualizza / Barre degli strumenti / Casella degli strumenti.

Aggiungere qualche controllo

Nella finestra di dialogo, aggiungiamo tre controlli, per preparare un esempio semplice: vogliamo una casella di testo in cui l'utente possa preparare una lista della spesa, scrivendo degli elementi in una casella di testo che verranno via via aggiunti alla lista (alla pressione di un pulsante).

Quando si seleziona un controllo, nella parte sinistra della finestra compare una scheda dove si possono definire le diverse proprietà. Attribuiamo un nome ai nostri tre controlli e impostiamo altre proprietà che desideriamo. Per selezionare la finestra di dialogo e cambiarne le proprietà, bisogna fare clic sul suo margine esterno.

Il risultato finale potrebbe essere simile al seguente:



Sono stati attribuiti i seguenti nomi ai controlli:

  • txtItem
  • cmdAddToItem
  • lstShoppingList

Far apparire la finestra

Il codice per far apparire la finestra, come riportato nel wiki di OpenOffice, è il seguente:

Dim oDialog AS Object

Sub StartShoppingListManagerDialog
  Dim oLibContainer As Object, oLib As Object
  Dim oInputStreamProvider As Object
  Const sLibName = "Standard"
  Const sDialogName = "ShoppingListManager"
  ' library container
  oLibContainer = DialogLibraries
  ' load the library
  oLibContainer.loadLibrary( sLibName )
  ' get library
  oLib = oLibContainer.getByName( sLibName )
  ' get input stream provider
  oInputStreamProvider = oLib.getByName( sDialogName )
  ' create dialog control
  oDialog = CreateUnoDialog( oInputStreamProvider )
  ' show the dialog
  oDialog.execute()
End Sub

Dove dobbiamo inserirlo? In un modulo, naturalmente. Nel documento Calc, fare clic su Strumenti / Macro / Organizza macro / LibreOffice Basic....
Selezionare il documento Calc, e fare clic su Nuovo. Viene chiesto un nome per il modulo. Possiamo confermare il nome Modulo1.
Sostituire il codice presente con quello riportato qui sopra. Si dovrebbe ottenere qualcosa di simile a questo:




Siamo pronti per far apparire la finestra di dialogo. È sufficiente, nel foglio di lavoro, fare clic su Strumenti / Macro / Esegui macro..., selezionare la macro StartShoppingListManagerDialog e fare clic su Esegui.

Se vogliamo, possiamo aggiungere un pulsante e un gestore di eventi al foglio elettronico Calc, in modo da velocizzare l'operazione. In Calc, far visualizzare i controlli per formulario (Visualizza / Barre degli strumenti / Controlli per il formulario), selezionare tra essi il pulsante e posizionarlo nel foglio di lavoro. Facendoci clic con il pulsante destro del mouse, si attiva la scheda per la definizione delle proprietà e degli eventi. Impostare un nome e un testo da far comparire; poi, nella scheda eventi, associare all'evento "Eseguire l'azione" la procedura di avvio della finestra di dialogo.



Attenzione: per poter provare il funzionamento del pulsante che abbiamo definito, bisogna fare clic su Modo bozza (sì/no) della barra degli strumenti Controlli del formulario.

Gestire gli eventi della finestra

Nella finestra di dialogo, possiamo associare al pulsante una macro per gestire l'evento "Eseguire l'azione". Visto che desideriamo che il valore presente nel campo di testo venga aggiunto alla lista, il codice sarà simile al seguente:

Sub cmdAddToList_click

  Dim txtItem as Object, lstShoppingList as Object
  txtItem = oDialog.getControl("txtItem")
  lstShoppingList = oDialog.getControl("lstShoppingList")

  lstShoppingList.addItem(txtItem.Text, lstShoppingList.getItemCount())

  txtItem.setText("")
  txtItem.setFocus()

End Sub

Dovremo poi associare la macro all'evento "Eseguire l'azione" del pulsante, come visto precedentemente.

Ulteriori informazioni

Una descrizione degli eventi gestibili per i vari controlli è disponibile nel wiki di LibreOffice.

Informazioni sulle proprietà e i metodi di caselle di riepilogo e caselle di testo sono nel wiki di OpenOffice.

Quando un oggetto viene istanziato, è possibile verificarne a tempo di esecuzione quali sono le sue proprietà, i suoi metodi e le sue interfacce.

Ad esempio, avendo a disposizione il nostro oggetto txtItem, potremo aggiungere al nostro codice

  MsgBox txtItem.dbg_methods
  MsgBox txtItem.dbg_supportedInterfaces
  MsgBox txtItem.dbg_properties
 
e far comparire i messaggi informativi che ci servono.

Note sulla sicurezza

L'esecuzione di una macro di cui non si conosce la provenienza è potenzialmente pericolosa. Per questo motivo, in LibreOffice / OpenOffice è disattivata.
Facendo clic su Strumenti / Opzioni / LibreOffice / Sicurezza e poi sul pulsante Sicurezza delle macro... viene offerta la possibilità di configurare il livello appropriato. Se si ricevono documenti con delle macro, ricordarsi di controllarne sempre il contenuto prima di eseguirle (impostando il livello di sicurezza su "Medio", all'apertura del documento viene chiesto se si vogliono eseguire, e potremo rispondere di no per dare un'occhiata al codice).

Esportazione del codice sorgente

Se si desidera esportare il codice sorgente di un'applicazione, ad esempio per utilizzare un sistema di controllo di versione, è possibile sfruttare il fatto che i file ods sono semplici file zip con all'interno dei documenti XML. In particolare, troveremo all'interno del file ods un file XML per ogni modulo visual basic e per ogni finestra di dialogo impostata.



File di esempio

Il file completo, ProgrammareLOconVB.ods, è disponibile nella sezione didattica / foglio elettronico del mio sito.