+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 1 su 1

Da VBA (Office 2003) a Basic (openOffice 3.2)

  1. #1
    L'avatar di dragone bianco
    dragone bianco non è in linea Certosino
    Questa semplice Guida è dedicata a chi come me conosce la programmazione VBA e vorrebbe usare Basic
    Vi introdurrò nel mondo della programmazione Basic di OpenOffice, evidenziando differenze con il VBA
    L’intenzione è dare una infarinatura su dove mettere il vostro codice, come richiamarlo, gestire i Moduli e le finestre di Dialogo (in VBA le Form), richiamarle e usare alcuni suoi oggetti.
    Negli esempi userò codice classico (if, For Msgbox Inoput box ecc..) e non descriverò codice specifico di Openoffice (quel codice per interagire con calc, write ecc..).

    Indice**** Due Parole sul Basic ****
    In OpenOffice abbiamo un unica interfaccia che gestisce tutto (calc,Write,base ecc).
    Anche Basic è generico per tutto il pacchetto, quindi posso programmare anche senza aver aperto un File.
    Posso scegliere di associare il codice al File (Come in VBA) oppure di associarlo all’intero programma di OpenOffice, fruibile solo sul pc su cui lavoro.

    **** Gestione Macro ****
    Per creare Moduli è sufficiente andare in Strumenti>Macro>Organizza Macro>OpenOfiice.org Basic o premere ALT+F11
    Si apre una finestra di dialogo dove a sinistra avremo un elenco di voci:
    • Macro Personali (voce sempre presente): è dove memorizzeremo i moduli da usare in open office
    • Macro di OpenOffice.org (voce sempre presente): un elenco di moduli già pronti per l’uso
    • I nomi di tutti i file aperti: è dove memorizzeremo i moduli che conteranno le nostre macro, da inserire nei nostri file.
    a destra un elenco che conterrà tutte le nostre macro (una volta selezionato un modulo):
    Ora possiamo eseguire le seguenti operazioni:
    Nuova Macro: Selezioniamo il file (o la voce “macro Personali”) e clicchiamo su “Nuovo”.
    Se non esiste un modulo verrà chiesto il nome del modulo da creare e si aprirà in seguito l’editor di BASIC (vedi “Editor Basic (Panoramica)”)
    Modificare Macro: Selezioniamo un modulo e poi la Macro da modificare Clicchiamo su “Modifica”, si aprirà il’editor di BASIC (vedi “Editor Basic (Panoramica)”).
    Eliminare macro: Selezioniamo un modulo e poi la Macro da elimuinare e Clicchiamo su “Elimina”.
    Verrà elimina solo la macro che abbiamo selezionato, non il Modulo; per la gestione del modulo c’è una finestra di dialogo a parte (vedi “Gestione Moduli e Finestre di Dialogo”) accessibile anche dal pulsante “Gestisci”.

    **** Gestione Moduli e Finestre di Dialogo ****
    Per gestire i moduli e le Finestre di Dialogo è sufficiente andare in Strumenti>Macro>Organizza finestre di dialogo, si aprirà una nuova finestra Divisa in tre schede:
    Scheda Moduli, dove possiamo:
    • Creare moduli: Tramite il pulsante “Nuovo”, ci verrà chiesto il nome del modulo e verra inserito sulla voce che è selezionata a sinistra, in un file o nelle macro personali. Di default un Modulo conterrà la macro Main (è una macro vuota);
    • Eliminare Moduli: Selezionare il modulo da eliminare e cliccare sul pulsante “Elimina”;
    • Modificare Moduli: Selezionare il modulo e cliccare sul pulsante “modifica” aprirà l’editor di basic.
    Scheda Dialoghi, dove possiamo:
    • Creare Finestre di dialogo: Tramite il pulsante “Nuovo”, ci verrà chiesto il nome della Finestre di dialogo e verra inserito sulla voce che è selezionata a sinistra, in un file o nelle macro personali.
    • Eliminare Finestre di dialogo: Selezionare la Finestre di dialogo da eliminare e cliccare sul pulsante “Elimina”.
    • Modificare Finestre di dialogo: Selezionare la Finestre di dialogo e cliccare sul pulsante “modifica”; si aprirà l’editor di basic per la modifica della finestra di dialogo.
    Scheda Librerie
    Ai fini della guida non è necessario conoscere questa scheda.

    **** Editor Basic (Panoramica) ****
    E’ possibile accedere all’editor sia dalla gestione delle “Finestre di dialogo” (Strumenti>Macro>Organizza Finestre di dialogo, Vedi “Gestione Moduli e Finestre di Dialogo”) sia dalla finestra di gestione “Macro” (Strumenti>Macro>Organizza Macro>OpenOfiice.org Basic, Vedi “Gestione Macro”) basta creare un modulo o Finestra di dialogo o modificarne uno già esistente
    Una volta aperto l’editor in basso della schermata vediamo delle linguette, ognuna di essa rappresenta un modulo o una finestra di dialogo, facendo il click destro su di essa possiamo eliminare, rinominare, creare un modulo o una finestra di dialogo a seconda della scheda che selezioniamo cambia lo scenario sopra.

    **** Editor Basic (Scheda Moduli) ****
    Una volta che accediamo all’editor Basic e selezioniamo un modulo da modifcare ci apprirà una schermata simile all’editor VBA; al centro un aparte bianca dove possiamo scrivere il nostro codice (Come in VBA).

    esempio:
    REM  *****  BASIC  *****
    option explicit
    
    Sub Saluto
    Dim Nome as string
    'Richieata Nome
    Nome=inputbox("Inserire nome della persona da salutare","Saluta","Marco")
    
    'Verifico se premo annulla
    if nome="" then
               msgbox "non vuoi più salutare"
               exit sub
    end if
    
    msgbox Saluta_persona(nome)
    End Sub
    
    function Saluta_perosona (nome as string)as string
    Saluta_persona ="Ciao " + nome
    end function
    
    Il codice viene colorato diversamente dall’editor VBA:
    • le scritte in Grigiolino rappresentano i commenti, come in VBA basta anteporre l’apostrofo o scrivere REM prima del commento;
    • le scritte in blue sono le funzioni (SUB, Function, IF, Select, ecc...);
    • le scritte verdi sono variabili o i nomi delle funzioni che richiamiamo;
    • le scritte rosse i valori da passare alle variabili (testo, numeri ecc..).
    In alto, sopra al codice, c’è un casella combinata dove possiamo facilmente cambiare il file su cui lavoriamo (in VBA era rappresentato da un menu di cartelle e sotto cartelle posto a sinistra).
    Vicino ad essa ci sono vari pulsanti:
    Compila: esegue il Debug e assisa se ci sono errori;
    Esgui Programma Basic: Esegue la prima sub del modulo;
    Interrompi esecuzione macro: Ferma l’esecuzione della macro;
    Step Over,Step into, step out: Servono per l’esecuzione passo a passo del codice;
    Punto di interruzione On/Off: Inserisce o toglie un punto di interruzione sulla riga dove lampeggia il cursore, diversamente da VBA che bastava cliccare a sinistra del codice;
    Gestisci punti di interruzioni: Apre una finestra di dialogo per gestire i punti di interruzione.

    Non disponiamo di un metodo che ci suggerisce le funzioni (come avviene in VBA).

    **** Editor Basic (Scheda Finestre di dialogo) ****
    Una volta che accediamo all’editor Basic e selezioniamo una finestra di dialogo da modifcare ci apprirà, al centro schermo, la nostra finestra di dialogo, dove possiamo inserire tramite la barra degli strumenti, tutti i nostri controlli e caselle combinate, di testo ecc..
    Con il click destro è possibile accedere alle proprietà, simili al VBA.

    In alto sopra al Finestra di dialogo c’è un casella combinata dove possiamo facilmente cambiare il file su cui lavoriamo (in VBA era rappresentato da un menu di cartelle e sotto cartelle posto a sinistra).
    Vicino ad essa ci sono vari pulsanti:
    Inserisci elementi di controllo: menu a tendina che permette di inserire gli oggetti;
    Finestra di dialogo Importa: Permette di salvare la finestra di dialogo in un file;
    Finestra di dialogo Esporta: Permette di importare la finestra di dialogo da un file.

    **** Finestre di dialogo (Approfondimento) ****
    Le Finestre di dialogo sono simili alle form VBA.
    La differenza sostanziale sta nel fatto che la finestre di dialogo di openoffice non hanno un modulo per la gestione degli eventi; gli eventi devono essere associati ad una macro e scritti in un modulo (Vedere Capitolo “Gli Eventi”).
    Nelle proprietà degli oggetti c’è la scheda eventi (simile a VBA) e da qui con il pulsante “...” si apre una finestra di dialogo che ci permette di associare l’azione alla macro scelta.
    Consiglio quindi nella creazione di una finestra di dialogo di creare anche un modulo e rinominarlo usando per esempio il suffisso dlgF_ per la finestra di dialogo vera e propria e dlgM_ per il modulo che conterrà le macro per la finestra di dialogo.
    Esempio:
    dlgF_Finestra
    dlgM_Finestra
    (finestra è il nome della nostra finestra di dialogo).

    Le Finestre di dialogo come questa sono dette modali non consentono nessun altra azione del programma fino alla loro chiusura, il codice si interrompe e viene ripreso alla chiusura della maschera.

    Apertura Finestra di Dialogo
    per aprire le finestre di dialogo bisogna usare il seguente codice:
    Sub Apri_Maschera
    Dim Dlg As Object
    DialogLibraries.LoadLibrary("Standard")
    
    Dlg = CreateUnoDialog(DialogLibraries.Standard.NomeFinestra)
    Dlg.Execute()
    Dlg.dispose()
    end sub
    
    consiglio di dichiarare pubblica la variabile “Dim Dlg As Object” per poterla utilizzare in seguito nelle routine della finestra di dialogo.

    Chiusura finestra di dialogo
    Per chiudere una finestra di dialogo è possibile usare la X in alto a destra, nel menu titolo (se questa è stata resa visibile)
    oppure
    usare i pulsanti Ok Annulla (sono pulsanti normali ma la proprietà “tipo di pulsante” è settato su OK o Annulla, la loro etichetta è personalizzabile come un pulsante normale)
    oppure
    da codice
    Dlg.endexecute()
    
    Note: l’utilizzo dei pulsanti da la possibilità che Execute restituisca 1 se chiuso premendo il pulsante OK e 0 con pulsante annulla o La X in alto a destra.
    Per intercettare il valore usare questo codice:
    Sub Apri_Maschera
    Dim Dlg As Object
    DialogLibraries.LoadLibrary("Standard")
    
    Dlg = CreateUnoDialog(DialogLibraries.Standard.NomeFinestra)
    if Dlg.Execute()=0 then
        msgbox ”Premuto Annulla”
    else
        msgbox “Premuto OK”
    end if
    end sub
    
    Interazione con gli oggetti
    Per interagire con i controlli bisogna associarli ad delle variabili Object, usando il DLG.getcontrol(“nomeoggetto”)
    Attenzione il nome dell’oggetto è da riportare fedelmente (maiuscole incluse)
    Es:
    dim oControlModel as object
    'Modifico il testo
    oControlModel = Dlg.getControl("lblTest")
    oControlModel.model.label = testo
    end Sub
    
    Come potete notare, diversamente da VBA per riferirsi ad un suo controllo si usa la classe Model

    Gli Eventi
    In basic abbiamo detto che ogni evento (azione che fa eseguire una macro, come in vba), va legata ad una macro compilata in un modulo.
    Per chi conosce il VBA, sa che certi eventi forniscono delle informazioni aggiuntive (es movemouse da la X e La y di dove si trova il puntatore); in openoffice, per gestire questi eventi, bisogna usare un piccolo accorgimento, nella sub da richiamare tramite evento bisogna mettere una variabile di tipo object.
    Questa variabile verrà alimentata opportunamente dall’evento scelto r baterà richiamarla aggiungendo la proprietà da leggere:
    Es
    sub Mouse_Up(Event as object)
    Dim Testo as string
    testo=”ho premuto il pulsante “ & Event.buttons ‘restituisce un numero che indica il pulsante premuto
    testo=testo & chr(13) & Chr(10) “X:” & Event.X  ‘restituisce un numero che indica la coordinata X
    testo=testo & chr(13) & Chr(10) “Y:” & Event.Y ‘restituisce un numero che indica la coordinata Y
    msgbox Testo
    end sub
    
    Eventi del mouse
    Spostamento mouse = muove il mouse sull’oggetto
    Spostamento mouse con tasto premuto = muove il mouse sull’oggetto tenendo premuto un tasto del mouse
    Tasto del mouse premuto = l’utente preme un pulsante del mouse
    Tasto del mouse rilasciato = l’utente rilascia un pulsante del mouse
    Mouse Fuori = l’utente sposta fuori dall’oggetto corrente
    Mouse Dentro = l’utente sposta dentro all’oggetto corrente
    NB:
    Non esiste un evento Click o Doppioclick, per il click in alternativa si può usare l’evento “Tasto del mouse rilasciato”.

    Questo evento restituirà:
    X = valore long che indica la posizione X del Mouse sull’oggetto
    Y = valore long che indica la posizione X del Mouse sull’oggetto
    Buttons = valore che indica il pulsante con cui è stato effettuato l’evento

    per determinare i pulsanti premuti si possono usare le seguenti costanti:
    com.sun.star.awt.mousebutton.LEFT = pulsante di sinistra del mouse
    com.sun.star.awt.mousebutton.MIDDLE = pulsante centrale del mouse
    com.sun.star.awt.mousebutton.RIGHT = pulsante di destra del mouse

    Esempio
    Sub Mouse_Su(Event as object)
    Dim Messaggio
    
    Messaggio="Cliccato con il pulsante:" & chr(13) & chr(10)
    
    select case Event.Buttons
       case = com.sun.star.awt.MouseButton.LEFT
           messaggio=messaggio & "'Sinistro'"
       case = com.sun.star.awt.MouseButton.RIGHT
           messaggio=messaggio & "'Destro'"
       case = com.sun.star.awt.mousebutton.MIDDLE
           messaggio=messaggio & "'Centrale'"
       case else
           messaggio=messaggio & "'Sconosciuto'"
    end select
    
    messaggio=messaggio & chr(13) & chr(10) & chr(13) & chr(10) & "Posizione:"
    messaggio=messaggio & chr(13) & chr(10) & "X: " & Event.x
    messaggio=messaggio & chr(13) & chr(10) & "Y: " & Event.y
    msgbox messaggio
    end sub
    
    Eventi della tastiera
    Tasto Premuto = su pressione di un tasto della tastiera
    Dopo aver rilasciato un tasto = su rilascio di un tasto della tastiera

    Questo evento restituirà:
    KeyCode = valore short che indica il codice del tasto premuto
    per determinare i pulsanti premuti si possono usare le seguenti costanti:
    (ho elencato solo alcune)
    com.sun.star.awt.key.RETURN
    com.sun.star.awt.key.TAB

    KeyChart = valore strind che indica il carattere inserito

    esempio
    Sub Su_Pressione(Event as object)
    Dim Messaggio as string
    dim oControlModel as object
    
    Select Case Event.KeyCode
       Case com.sun.star.awt.Key.RETURN
           Messaggio = "Premuto:" & chr(13) & Chr(10) & "Invio"
       Case com.sun.star.awt.Key.TAB
           Messaggio = "Premuto:" & chr(13) & Chr(10) & "Tab"
       Case com.sun.star.awt.Key.DELETE
           Messaggio = "Premuto:" & chr(13) & Chr(10) & "Canc"
       Case com.sun.star.awt.Key.ESCAPE
           Messaggio = "Premuto:" & chr(13) & Chr(10) & "Esc"
       Case com.sun.star.awt.Key.DOWN
           Messaggio = "Premuta:" & chr(13) & Chr(10) & "freccia giù"
       Case com.sun.star.awt.Key.UP
           Messaggio = "Premuta:" & chr(13) & Chr(10) & "freccia su"
       Case com.sun.star.awt.Key.LEFT
           Messaggio = "Premuta:" & chr(13) & Chr(10) & "freccia sinistra"
       Case com.sun.star.awt.Key.RIGHT
           Messaggio = "Premuta:" & chr(13) & Chr(10) & "freccia destra"
       Case Else
           Messaggio = "Carattere Imesso:" & chr(13) & Chr(10) & Event.KeyChar
    End Select
    MsgBox Messaggio
    End Sub
    
    non elencherò tutti gli eventi, esistono anche altri eventi, ma ho descritto solo i più diffusi
    (per ulteriori informazioni consultate “Riferimenti”)

    il Multischeda
    La finestra di dialogo di openoffice ha la proprietà di multischeda
    Proprietà che permette di visualizzare alcuni controlli e alla pressione di un pulsante, nascondere quest’ultimi e visualizzarne altri. Il tutto grazie alla proprietà Step, presente sia nella finestra di dialogo che nei controlli.

    Nella finestra di dialogo ,Step indica la scheda da visualizzare (sia in modalità struttura, che in esecuzione), e per gli oggetti indica in che scheda sono visibili.
    Step uguale a zero è un caso speciale, per la finestra di dialogo visualizza tutti gli oggetti (indiscriminatamente dallo step impostato), per gli oggetti indica che saranno visibili in tutte le schede

    esempio del codice di 3 pulsanti (successivo e precedente e visualizza tutto)
     Sub Visualizza_Tutto()
    dim CmdSucessivo as object
    dim CmdPrecedente as object
    dim CmdTutto as object
    dim Etichetta as object
    
    'impostazione scheda
    dlg.model.step=0
    
    'set variabili
    CmdSucessivo=dlg.getcontrol("cmdSucessivo")
    CmdPrecedente=dlg.getcontrol("cmdPrecedente")
    CmdTutto=dlg.getcontrol("cmdTutto")
    
    'impostazione pulsanti
    CmdPrecedente.model.enabled = false
    CmdSucessivo.model.enabled = true
    CmdTutto.model.enabled = false
    
    'Modifica etichetta
    Etichetta=dlg.getcontrol("lblTitolo")
    Etichetta.model.label="Stai Visualizzando Tutte le Schede"
    end sub
    
    Sub Successivo()
    dim CmdSucessivo as object
    dim CmdPrecedente as object
    dim CmdTutto as object
    dim Etichetta as object
    
    'imposto la scheda
    dlg.model.step=dlg.model.step + 1
    
    'set variabili
    CmdSucessivo=dlg.getcontrol("cmdSucessivo")
    CmdPrecedente=dlg.getcontrol("cmdPrecedente")
    CmdTutto=dlg.getcontrol("cmdTutto")
    
    'impostazione pulsanti
    CmdTutto.model.enabled = true
    
    if dlg.model.step=1 then
               CmdPrecedente.model.enabled = false
    else
               CmdPrecedente.model.enabled = true
    end if
    
    if dlg.model.step=4 then
               CmdSucessivo.model.enabled = false
    end if
    
    'Modifica etichetta
    Etichetta=dlg.getcontrol("lblTitolo")
    Etichetta.model.label="Stai Visualizzandola Scheda N°" & dlg.model.step
    end sub
    
    Sub Precedente()
    dim CmdSucessivo as object
    dim CmdPrecedente as object
    dim CmdTutto as object
    dim Etichetta as object
    
    'imposto la scheda
    dlg.model.step=dlg.model.step - 1
    
    'set variabili
    CmdSucessivo=dlg.getcontrol("cmdSucessivo")
    CmdPrecedente=dlg.getcontrol("cmdPrecedente")
    CmdTutto=dlg.getcontrol("cmdTutto")
    
    'impostazione pulsanti
    CmdTutto.model.enabled = true
    CmdSucessivo.model.enabled = true
    
    if dlg.model.step=1 then
               CmdPrecedente.model.enabled = false
    end if
    
    'Modifica etichetta
    Etichetta=dlg.getcontrol("lblTitolo")
    Etichetta.model.label="Stai Visualizzandola Scheda N°" & dlg.model.step
    end sub
    
    NB:
    A differenza di VBA , dove le modifiche agli oggetti sono dirette ,in basic , invece, in quasi tutti i casi, si utilizza model
    in vba - CmdPrecedente.enabled=true
    in Basic - CmdPrecedente.model.enabled=true

    **** Riferimenti ****
    Alcune parti di codice sono state tratte dalla guida di stabasic 8, scaricabile da qui
    e consultabile via web da qui

    **** Esempi ****
    Associata a questa guida ci sarà un file creato con calc contenente tutti gli esempi citati
    File allegati File allegati
    Ultima modifica di dragone bianco; 22-10-2010 21:01 
    ℹ️ Leggi di più su dragone bianco ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. saldo conto con office o openoffice
    Da xmarcos nel forum Microsoft Word
    Risposte: 11
    Ultimo Post: 02-08-2010, 11:27
  2. Articolo: Da Acces (Office 2003) a Base (OpenOffice 3.0)
    Da dragone bianco nel forum LibreOffice, OpenOffice e altro
    Risposte: 1
    Ultimo Post: 02-03-2010, 18:45
  3. Articolo: Da PowerPoint (Office 2003) a Impress (OpenOffice 3.0)
    Da dragone bianco nel forum LibreOffice, OpenOffice e altro
    Risposte: 0
    Ultimo Post: 07-05-2009, 22:14
  4. Articolo: Da Excel (Office 2003) a Calc (Open Office 3.0)
    Da dragone bianco nel forum LibreOffice, OpenOffice e altro
    Risposte: 0
    Ultimo Post: 23-04-2009, 18:10
  5. Da Office 2003 a Office 2007
    Da Elimar nel forum Microsoft Word
    Risposte: 1
    Ultimo Post: 24-10-2008, 13:31