Grande Paolo!!
Non sapevo che anche le "normali" finestre di dialogo potessero restituire
un valore e per questo ho sempre usato la funzione endExecute().
Scusate se invado questo thread ma ho una domanda che credo sia in tema:
quando vengono distrutte le variabili locali della finestra di dialogo?
Te lo chiedo per cercare di migliorare alcuni aspetti di una mia macro:
provo a spiegare.
Ho una finestra di dialogo con una listbox e se l'utente fa clic su OK
voglio sapere nel modulo principale (dove chiamo la finestra di dialogo)
l'elemento della listbox selezionato.
Al momento ho usato un meccanismo ben poco elegante ossia
una variabile globale booleana bButtonOKClicked
una variabile globale String sSelectedStringInListBox
una subroutine subButtonOKClicked che e' invocata quando l'utente preme OK.
Come immaginerai, subButtonOKClicked funziona su per giu' cosi':
Sub subButtonOKClicked()
[leggi la stringa selezionata nella listbox e scrivila in
sSelectedStringInListBox]
[setta la variabile booleana TRUE]
[chiama la funzione endExecute()]
End Sub
Nel modulo principale ho poi
bButtonOkClicked = FALSE
...
oDlg.execute()
If bButtonOKClicked Then
[qualche istruzione]
End If
Come ho scritto, se l'oggetto listbox non viene distrutto quando la funzione
oDlg.execute() ritorna potrei fare a meno delle variabili globali.
Riguardo ai casi in cui (credo!!) endExecute() sia non indispensabile ma
almeno comoda, sempre in una mia macro ho una finestra di dialogo con una
decina di opzioni che ho associato a dei pulsanti. Quando l'utente preme uno
dei pulsanti voglio che il controllo ritorni al modulo principale e per
evitare di dover comunicare al modulo principale quale bottone e' stato
premuto, ho scritto una sub per ciascuno dei pulsanti che per prima cosa
appunto chiude la finestra di dialogo con endExecute().
Ciao e Buon Anno a tutta la lista,
Michele
On 30/12/05, Paolo Mantovani <[EMAIL PROTECTED]> wrote:
>
> Alle 14:49, giovedì 29 dicembre 2005, Bernardini Lido ha scritto:
> > Caro Paolo
> > hai proprio ragione i problemi sono nella chiusura della finestra di
> > dialogo
> >
> > ho usato close() come mi hai detto tu e ha funzionato
> >
> > a questo punto ho chiuso manualmente la finestra di dialogo della mia
> > applicazione e ho messo un bottone in un foglio di calc assegnato alla
> > macro di chiusura hanno funzionato tutte e due sia con close() che l'
> altra
>
> Ok, un problema risolto!
> Ora vediamo come risolverlo meglio :-)
>
> [...]
> riassumo qui qualche informazione in merito all'uso delle finestre di
> dialogo
> in ooo, e qualche info sui vari metodi close() endExecute() e dispose()
>
> Quando pensi ad finestra di dialogo di ooo devi penare a qualcosa di molto
> vicino ad un msgbox o ad un inputbox.
> Cos'hanno in comune i dialoghi di ooo con queste finestrelle?
>
> Senza dubbio sai che la finestrella msgbox può essere trattata come
> funzione,
> in quanto restituisce un risultato numerico.
> Ad esempio se l'utente schiaccia OK il msgbox restituisce 1, con Annulla
> restituisce 2
> Per una descrizione completa puo consultare la guida, ma quello che
> importa il
> meccanismo:
> -------------
> iresult = msgbox ("distruggere l'HD?", 1)
>
> if iresult = 1 then
> 'l'utente ha scelto OK,
> 'distruggo l'hard disk!!!
> elseif iresult = 2 Then
> 'peccato, l'utente ha scelto Annulla....
> end if
>
> -------------
>
> Ebbene anche i dialoghi di ooo si possono comportare come funzioni:
>
> -------------
> oDlg = createUnoDialog(DialogLibraries.Standard.MioDialogo)
>
> 'finche l'utente non decide di uscire (con OK o Annulla)
> 'siamo bloccati su questa riga:
> iresult = oDlg.execute
>
>
>
> If iresult = 1 Then
> 'l'utente ha scelto ok perciò si può procedere
> 'con il seguito del programma
> ElseIf iresult = 0 Then
> 'l'utente ha scelto annulla, non fare niente
> End If
> -------------
>
> Per sfruttare questo meccanismo occorre inserire almeno un pulsante OK sul
> dialogo ed eventualmente anche uno 'Annulla' (anche in assenza di questo
> vale
> sempre il tasto ESC')
>
> Ovviamente non basta inserire un pulsante e impostare l'etichetta con
> 'OK',
> noi vogliamo che il pulsante si *comporti* da pulsante OK,
> indipendentemente
> dall'etichetta.
> In altri termini, vogliamo che il pulsante faccia chiudere il dialogo e
> faccia
> restituire il risultato = 1 al metodo execute()
>
> Per fare questo occorre andare nelle proprietà del pulsante e impostare
> "Tipo di pulsante" = OK
>
> La stessa cosa per l'eventuale pulsante 'Annulla' (o 'Cancel')
>
> Come avrai già capito, cosi facendo non hai più bisogno di gestire la
> chiusura
> del dialogo in modo esplicito usanto endExecute()
>
> Per questo motivo nell'altro post avevo detto che in condizioni normali
> non ci
> dovrebbe essere la necessità di usare il metodo endExecute()
>
> Con questo non voglio dire che usare endExecute() sia sbagliato, solo che
> andrebe usato in quei pochi casi particolari dove è veramente
> indispensabile.
> In tutti gli altri casi è più semplice e pulito usare il metodo del
> "pulsante
> OK"
>
> Riguardo la chiusura dei documenti;
> Tralascio volutamente i vari dispatches (".uno:Quit" , ".uno:Close"
> eccetera)
> A mio parere, la tecnica dei dispatches andrebbe usata solo in mancanza di
> alternative per motivi che non sto ad approfondire (magari ne riparliamo
> in
> futuro)
>
> Esistono 2 modi per chiudere un documento:
> ThisComponent.close(true)
> ThisComponent.dispose()
>
> Il primo è da preferire, perchè di più alto livello
> Pe intenderci, dispose è un metodo di basso livello che è comune non solo
> ai
> documenti ma a tutti i componenti dell'API.
>
> Dispose è brutale. scarica dalla memoria l'oggetto e punto.
>
> Nel caso di oggetti complessi come i documenti, una chiamata a dispose può
> avere effetti collaterali, per esempio nel case di un salvataggio in corso
> o
> altre operazioni delicate.
> Perciò non ti ho suggerito di usarlo.
>
> Close invece è una richiesta meno perentoria:
> "oh documento: guarda che stiamo chiudendo, se devi fare qualcosa falla
> subito
> e poi avvisa cosi possiamo procedere"
>
> Il documento a questo punto si mette fare le cose che deve fare (tipo
> chiedere per il salvataggio o chiudere le varie finestre) ma se qualcuna
> va
> storta allora rispnde
> "guarda non si può proprio chiudere, ci ho un dialogo modale aperto che mi
> tiene bloccata la finestra...."
>
> da qui il messaggio "controller disagree..."
>
> Infatti il controller, che si occupa della vista del documento non poteva
> essere daccordo con la chiusura dato che forse era bloccato da un dialogo
> modale.
> (almeno io ho interpretato cosi la faccenda)
>
> spero di aver fatto un po di luce su questi meccanismi
>
> detto questo....
> Auguro un buon capodanno a tutti (e non tirate i mortaretti!!!) :-)
>
> Paolo M.
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]
>
>