Servizio SFDialogs.Dialog

Il servizio Dialog contribuisce alla gestione delle finestre di dialogo create con l'Editor delle finestre di Basic. Ogni istanza della classe corrente rappresenta una singola finestra di dialogo visualizzata all'utente.

tip

Una finestra di dialogo può essere visualizzata in modalità modale o non modale.


In modalità modale, la finestra viene visualizzata e l'esecuzione del processo della macro è sospeso fino a che non viene premuto uno dei pulsanti OK o Annulla. Nel frattempo, le azioni eseguite dall'utente nella finestra possono richiamare specifiche azioni.

In modalità non modale, la finestra di dialogo è "mobile" sul desktop dell'utente e l'esecuzione del processo della macro continua normalmente. Una finestra non modale si chiude quanto viene terminata con il metodo Terminate() o con la conclusione della sessione di LibreOffice. Nelle finestre non modali, il pulsante di chiusura della finestra è inattivo.

Una finestra di dialogo scompare dalla memoria dopo la sua esplicita terminazione.

tip

Il servizio SFDialogs.Dialog è strettamente collegato al servizio SFDialogs.DialogControl.


Invocazione e utilizzo del servizio

Prima di usare il servizio Dialog è necessario caricare o importare le librerie ScriptForge:

note

• Le macro in Basic richiedono il caricamento della libreria ScriptForge usando la seguente istruzione:
GlobalScope.BasicLibraries.loadLibrary("ScriptForge")

• Gli script in Python richiedono un'importazione dal modulo scriptforge:
from scriptforge import CreateScriptService


Il servizio Dialog è invocato tramite il metodo CreateScriptService. Richiede tre argomenti posizionali per specificare la finestra di dialogo da attivare:

Container: "GlobalScope" per le librerie preinstallare o un nome di finestra come definito dal servizio ScriptForge.UI. Una stringa vuota "", che è il valore predefinito, indica il documento corrente.

Library: Il nome, sensibile alla differenza tra maiuscole e minuscole, di una libreria contenuta nel container. Il valore predefinito è "Standard".

DialogName: Una stringa, sensibile alla differenza tra maiuscole e minuscole, che determina la finestra.

I seguenti esempi in Basic e Python visualizzano la finestra dlgConsole che appartiene alla libreria condivisa ScriptForge:


      Dim oDlg As Object, lButton As Long
      Dim Container As String, Library As String, DialogName As String
      Set oDlg = CreateScriptService("SFDialogs.Dialog", "GlobalScope", "ScriptForge", "dlgConsole")
      '... in questo punto va inserita l'inizializzazione dei controlli...
      lButton = oDlg.Execute()
      'Modalità predefinita = Modal
      If lButton = oDlg.OKBUTTON Then
      '...In questo punto vanno inserite l'elaborazione dei controlli e l'esecuzione di quanto necessario
      End If
      oDlg.Terminate()
  

O usando Python:


    dlg = CreateScriptService('SFDialogs.Dialog', 'GlobalScope', 'ScriptForge', 'dlgConsole')
    #... in questo punto va inserita l'inizializzazione dei controlli...
    rc = dlg.Execute()
    # La modalità predefinita è Modal
    if rc == dlg.OKBUTTON:
        # ...In questo punto vanno inserite l'elaborazione dei controlli e l'esecuzione di quanto necessario
    dlg.Terminate()
  
note

Usare la stringa "GlobalScope" come argomento container se la finestra di dialogo è memorizzata in Macro e finestre di dialogo personali o in Macro e finestre di dialogo dell'applicazione.


Ricerca dell'istanza di Dialog che ha attivato un evento relativo alla finestra di dialogo

Un'istanza del servizio Dialog può essere trovata attraverso il servizio SFDialogs.DialogEvent, purché la finestra di dialogo sia stata inizializzata con il servizio Dialog. Nell'esempio seguente, oDlg contiene l'istanza di Dialog che ha attivato l'evento nella finestra di dialogo.


    Sub aDialogEventHander(ByRef poEvent As Object)
        Dim oDlg As Object
        Set oDlg = CreateScriptService("SFDialogs.DialogEvent", poEvent)
        ' ...
    End Sub
  

O usando Python:


    def control_event_handler(event: uno):
        dlg = CreateScriptService("SFDialogs.DialogEvent", event)
        # ...
  

Tenere presente che negli esempi precedenti il prefisso "SFDialogs." può essere omesso se ritenuto appropriato.

Gestione delle eccezioni con i gestori degli eventi

Quando si crea un gestore degli eventi per la finestra di dialogo è buona pratica gestire gli errori all'interno della subroutine stessa. Per esempio, si ipotizzi che il seguente gestore degli eventi sia chiamato quando viene premuto il pulsante del mouse in una finestra di dialogo.


    Sub OnMouseButtonPressed(ByRef oEvent As Object)
    On Local Error GoTo Catch
        Dim oDialog As Object
        oDialog = CreateScriptService("DialogEvent", oEvent)
        ' Elabora l'evento
        Exit Sub
    Catch:
        MsgBox SF_Exception.Description
        SF_Exception.Clear
    End Sub
  
tip

Chiamare SF_Exception.Clear se non si desidera che l'errore si propaghi dopo che l'esecuzione della finestra di dialogo è terminata.


In Python usare i blocchi nativi try/except per gestire le eccezioni, come mostrato qui di seguito:


    def on_mouse_button_pressed(event=None):
        try:
            dlg = CreateScriptService("DialogEvent", event)
            # Elabora l'evento
        except Exception as e:
            # L'oggetto "bas" è un'istanza del servizio Basic
            bas.MsgBox(str(e))
  

Proprietà

Nome

Sola lettura

Tipo

Descrizione

OKBUTTON

Integer

Value = 1. È stato premuto un pulsante OK.

CANCELBUTTON

Integer

Value = 0. È stato premuto un pulsante Annulla.

Caption

No

String

Specifica il titolo della finestra di dialogo.

Height

No

Long

Specifica l'altezza della finestra di dialogo.

Modal

Boolean

Specifica se la finestra di dialogo è attualmente in esecuzione in modalità modale.

Name

String

Il nome della finestra di dialogo

Page

No

Integer

Una finestra di dialogo può contenere diverse pagine che possono essere sfogliate dall'utente passo passo. La proprietà Page dell'oggetto Dialog definisce quale pagina dell'oggetto è attiva.

Visible

No

Boolean

Specifica se la finestra di dialogo è visibile sul desktop. Per impostazione predefinita non è visibile fino a quando non è eseguito il metodo Execute(), da quel momento in poi diventa visibile.

XDialogModel

UNO
object

L'oggetto UNO che rappresenta il modello di finestra di dialog. Per informazioni dettagliate, fate riferimento a XControlModel e UnoControlDialogModel nella documentazione delle Application Programming Interface (API).

XDialogView

UNO
object

L'oggetto UNO che rappresenta la vista della finestra di dialogo. Per informazioni più dettagliate fate riferimento a XControl e UnoControlDialog nella documentazione delle Application Programming Interface (API).

Width

No

Long

Specifica la larghezza della finestra di dialogo.


Proprietà dell'evento

Restituisce una stringa URI con il riferimento allo script attivato dall'evento. Leggete la relativa specifica nella specifica URI del framework di scripting (in inglese).

Nome

Sola lettura

Descrizione della IDE di Basic

OnFocusGained

Al ricevimento del fuoco

OnFocusLost

Alla perdita del fuoco

OnKeyPressed

Tasto premuto

OnKeyReleased

Tasto rilasciato

OnMouseDragged

Spostamento del mouse con pulsante premuto

OnMouseEntered

Mouse dentro

OnMouseExited

Mouse fuori

OnMouseMoved

Movimento del mouse

OnMousePressed

Pulsante del mouse premuto

OnMouseReleased

Pulsante del mouse rilasciato


Elenco dei metodi del servizio Dialog

Activate
Center
Controls

EndExecute
Execute
GetTextsFromL10N

Resize
SetPageManager
Terminate


Activate

Imposta il fuoco sull'istanza corrente di Dialog. Restituisce True se la messa a fuoco è riuscita.

Questo metodo è chiamato da un evento di una finestra o di un controllo, o quando una finestra di dialogo è visualizzata in modalità non modale.

Sintassi:

svc.Activate(): bool

Esempio:


      Dim oDlg As Object
      Set oDlg = CreateScriptService(,, "myDialog")
      oDlg.Execute()
      ' ...
      oDlg.Activate()
   

Gli esempi in Python e LibreOffice Basic presumono che la finestra di dialogo sia memorizzata nella libreria Standard del documento corrente.


     dlg = CreateScriptService(,,'myDialog')
     dlg.Execute()
     # ...
     dlg.Activate()
   

Center

Centra l'istanza corrente della finestra di dialogo nel mezzo di una finestra genitore. Senza argomenti, il metodo centra la finestra di dialogo nel mezzo della finestra corrente.

Il metodo restituisce True se eseguito correttamente.

Sintassi:

svc.Center(opt Parent: obj): bool

Parametri:

Parent: un oggetto opzionale che può essere uno tra:

Esempio:

In Basic

     Sub TriggerEvent(oEvent As Object)
         Dim oDialog1 As Object, oDialog2 As Object, lExec As Long
         Set oDialog1 = CreateScriptService("DialogEvent", oEvent) ' la finestra di dialogo che ha attivato l'evento
         Set oDialog2 = CreateScriptService("Dialog", ...) ' Apre una seconda finestra di dialogo
         oDialog2.Center(oDialog1)
         lExec = oDialog2.Execute()
         Select Case lExec
             ...
     End Sub
  
In Python

     def triggerEvent(event: uno):
       dlg1 = CreateScriptService('DialogEvent.Dialog', event) # La finestra di dialogo che ha attivato l'evento
       dlg2 = CreateScriptService('Dialog', ...) # Apre una seconda finestra di dialogo
       dlg2.Center(dlg1)
       rc = dlg2.Execute()
       if rc is False:
         # ...
   

Controls

Eseguite uno tra:

Sintassi:

svc.Controls(): str[0..*]

svc.Controls(controlname: str): svc

Parametri:

ControlName : Un nome valido di un controllo, in formato stringa sensibile alla differenza tra maiuscole e minuscole. Se assente, viene restituito l'elenco dei nomi dei controlli in formato di matrice con indice a partire da zero.

Esempio:


      Dim myDialog As Object, myList As Variant, myControl As Object
      Set myDialog = CreateScriptService("SFDialogs.Dialog", , "Standard", "Dialog1")
      myList = myDialog.Controls()
      Set myControl = myDialog.Controls("myTextBox")
   

     dlg = CreateScriptService('SFDialogs.Dialog','', 'Standard', 'Dialog1')
     ctrls = dlg.Controls()
     ctrl = dlg.Controls('myTextBox')
   

EndExecute

Termina la visualizzazione di una finestra modale e fornisce l'argomento come valore di ritorno per l'azione Execute() in esecuzione in quel momento.

EndExecute() di solito è contenuto nel processo di una macro attivata da un evento di una finestra di dialogo o di un controllo.

Sintassi:

svc.EndExecute(returnvalue: int)

Parametri:

returnvalue: Il valore passato al metodo Execute() in esecuzione.

Esempio:

Usando LibreOffice Basic:


      Sub OnEvent(poEvent As com.sun.star.lang.EventObject)
          Dim oDlg As Object
          Set oDlg = CreateScriptService("SFDialogs.DialogEvent", poEvent)
          oDlg.EndExecute(ReturnValue := 25)
      End Sub
   

Usando Python:


     from com.sun.star.lang import EventObject
     def on_event(event: EventObject):
         dlg = CreateScriptService("SFDialogs.DialogEvent", event)
         dlg.EndExecute(25)
   
tip

Le menzioni a com.sun.star.lang.EventObject riportate sopra sono opzionali. Tali annotazioni consentono di identificare le Application Programming Interface (API) di LibreOffice.


Execute

Visualizza la finestra di dialogo e, se modale, attende la sua chiusura da parte dell'utente. Il valore restituito è uno tra:

Per le finestre di dialogo non modali il metodo restituisce sempre 0 e l'esecuzione della macro continua.

Sintassi:

svc.Execute(modal: bool = True): int

Parametri:

modal: False se la finestra di dialogo non è modale. Predefinito = True.

Esempio:

In questo esempio in Basic la finestra di dialogo myDialog è memorizzata nella libreria Standard del documento corrente.


      Dim oDlg As Object, lReturn As Long
      Set oDlg = CreateScriptService("SFDialogs.Dialog", , , "myDialog")
      lReturn = oDlg.Execute(Modal := False)
      Select Case lReturn
          ' ...
      End Select
   

Questo codice in Python visualizza la finestra di dialogo modale DlgConvert della libreria Euro condivisa con Basic.


     dlg = CreateScriptService("SFDialogs.Dialog", 'GlobalScope', 'Euro', "DlgConvert")
     rc = dlg.Execute()
     if rc == dlg.CANCELBUTTON:
         # ...
   

GetTextsFromL10N

Sostituisce tutti i testi fissi di una finestra di dialogo con la loro versione tradotta basata sull'istanza del servizio L10N. Questo metodo traduce le seguenti stringhe:

Il metodo restituisce True, se eseguito correttamente.

Per creare un elenco delle stringhe traducibili della finestra di dialogo usate il metodo AddTextsFromDialog del servizio L10N.

Sintassi:

svc.GetTextsFromL10N(l10n: svc): bool

Parametri:

l10n: un'istanza del servizio L10N dalla quale saranno recuperate le stringhe tradotte.

Esempio:

L'esempio seguente carica le stringhe tradotte e le applica alla finestra di dialogo "MyDialog".

In Basic

     oDlg = CreateScriptService("Dialog", "GlobalScope", "Standard", "MyDialog")
     myPO = CreateScriptService("L10N", "/home/user/po_files/")
     oDlg.GetTextsFromL10N(myPO)
     oDlg.Execute()
   
In Python

     dlg = CreateScriptService("Dialog", "GlobalScope", "Standard", "MyDialog")
     myPO = CreateScriptService("L10N", "/home/user/po_files/")
     dlg.GetTextsFromL10N(myPO)
     dlg.Execute()
   
tip

Per approfondire l'argomento sulla gestione dei file PO e POT, consultare la pagina servizio L10N della guida.


Resize

Sposta l'angolo superiore sinistro della finestra di dialogo alle nuove coordinate e/o modifica le sue dimensioni. Tutte le distanze sono espresse in 1/100 di mm. Senza argomenti il metodo reimposta le dimensioni iniziali. Restituisce True se il ridimensionamento è stato eseguito correttamente.

Sintassi:

svc.Resize(opt Left: num, opt Top: num, opt Width: num, opt Height: num): bool

Parametri:

Left: la distanza orizzontale dall'angolo superiore sinistro

Top: la distanza verticale dall'angolo superiore sinistro

Width: la larghezza del rettangolo che contiene la finestra di dialogo

Height: l'altezza del rettangolo che contiene la finestra di dialogo

Gli argomenti con valori negativi od omessi sono lasciati immutati

Esempio:

In Basic

     oDialog.Resize(1000, 2000, Height := 6000) ' La larghezza non viene modificata
   
In Python

Con Python:


     oDialog.Resize(1000, 2000, Height = 6000) # La larghezza non viene modificata
   

SetPageManager

Definisce quali controlli in una finestra di dialogo sono responsabili per lo sfogliare le pagine, rendendo più semplice gestire la proprietà Page di una finestra di dialogo e dei suoi controlli.

Le finestre di dialogo possono avere più pagine e la pagina correntemente visualizzata è definita dalla proprietà Page della finestra di dialogo. Se la proprietà Page non viene modificata, la pagina visibile predefinita è uguale a 0 (zero), il che significa che non è definita un pagina particolare e tutti i controlli visibili sono visualizzati indipendentemente dal valore impostato nella loro proprietà Page.

Se la proprietà Page di una finestra di dialogo viene modificata in qualche altro valore tipo 1, 2, 3 e via discorrendo, saranno visualizzati solo i controlli la cui proprietà Page corrisponde all'attuale pagina della finestra di dialogo.

Usando il metodo SetPageManager è possibile definire quattro tipi di gestori per le pagine:

tip

È possibile usare contemporaneamente più di un meccanismo di gestione delle pagine.


Si presume che questo metodo sia chiamato solamente una volta prima di chiamare il metodo Execute. Le chiamate successive saranno ignorate.

Se l'esecuzione va a buon fine questo metodo restituisce True.

Sintassi:

svc.SetPageManager(pilotcontrols: str = "", tabcontrols: str = "", wizardcontrols: str = "", opt lastpage: int): bool

Parametri:

pilotcontrols: un elenco separato da virgole con i nomi dei controlli ListBox, ComboBox o RadioButton da usare come gestori delle pagine. Per i controlli RadioButton, specificare il nome del primo controllo nel gruppo da usare.

tabcontrols: un elenco separato da virgole con i nomi dei pulsanti da usare come gestori delle pagine. L'ordine nel quale sono indicati in questo argomento corrisponde al numero della pagina alla quale sono associati.

wizardcontrols: un elenco separato da virgole con i nomi dei due pulsanti da usare come pulsanti Precedente/Successiva.

lastpage: il numero dell'ultima pagina disponibile. Si raccomanda di specificare questo valore quando si usano i pulsanti Precedente/Successiva come gestore delle pagine.

Esempio:

Si consideri una finestra di dialogo con tre pagine. La finestra di dialogo contiene un controllo ListBox denominato "aPageList" che sarà usato per controllare le pagine visibili. Inoltre, sono presenti due pulsanti denominati "btnPrevious" e "btnNext" che saranno usati come pulsanti Precedente/Successiva all'interno della finestra di dialogo.

In Basic

    oDialog.SetPageManager(PilotControls := "aPageList", _
                           WizardControls := "btnPrevious,btnNext", _
                           LastPage := 3)
    oDialog.Execute()
  
In Python

    dlg.SetPageManager(pilotcontrols="aPageList",
                       wizardcontrols="btnPrevious,btnNext",
                       lastpage=3)
    dlg.Execute()
  

Terminate

Termina il servizio Dialog per l'istanza corrente. Restituisce True se la terminazione è riuscita.

Sintassi:

svc.Terminate(): bool

Esempio:

I seguenti esempi in Basic e Python aprono le finestre di dialogo non modali DlgConsole e dlgTrace. Queste sono memorizzate rispettivamente nelle librerie condivise ScriptForge e Access2Base. I pulsanti di chiusura delle finestre sono disabilitati e viene eseguita una terminazione esplicita alla fine di un processo in esecuzione.

In questo esempio un pulsante in DlgConsole sostituisce la chiusura della finestra che è inibita:

In Basic

     oDlg = CreateScriptService("SFDialogs.Dialog","GlobalScope","ScriptForge","DlgConsole")
     oDlg.Execute(modal:=False)
     Wait 5000
     oDlg.Terminate()
   

Con Python:

In Python

     from time import sleep
     dlg = CreateScriptService('SFDialogs.Dialog',"GlobalScope",'Access2Base',"dlgTrace")
     dlg.Execute(modal=False)
     sleep 5
     dlg.Terminate()
   
warning

Tutte le routine e gli identificatori Basic di ScriptForge che iniziano con un carattere di sottolineatura "_" sono riservati per uso interno. Non è previsto il loro utilizzo nelle macro in Basic o negli script in Python.