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]