Alle 19:12, lunedì 16 gennaio 2006, Emanuele ha scritto:
> >>Premetto che a me funziona quasi perfettamente la macro di
> >>Paolo, ad eccezione del fatto che apparentemente non rimuove il listener
> >>quando si chiude la finestrella per la selezione ed ogni volta mi mostra
> >> un msgbox in più risetto alla volta precedente, ma forse sfugge qualcosa
> >> anche a me... :-)
> >
> >nella risposta a Bart ho messo una versione migliorata dell'esempio, che
> >dovrebbe risolvere questo problema
>
> Dato che sei già in modalità "maestro", posso sfruttarti per risolvere
> una mia curiosità? :-)
> Perchè bisogna rimuovere il listener 2 volte?
Non è che viene tolto 2 volte.
Le due routine "done" e "aborted" vengono eseguite una sola volta:
per intenderci, o una o l'altra, ma mai tutte e due.
Siccome non puoi prevedere se la selezione finirà con un "aborted" o con un
"done" devi preoccuparti di "fare pulizia" in entrambi i casi.
>
> Ho provato a rimuovere quelli contenuti in "oDocView_done" e
> "oDocView_aborted", ma in tal caso mi ripete 2 volte il messaggio con
> l'indirizzo.
in effetti con la nuova versione del codice non servirebbe più, dato che le
pulizie vengono effettuate all'inizio della routine TestSelectionListener
solo che ho dimenticato di togliere queste istruzioni.
> E' un problema/feature del listener RangeSelection oppure è qualcosa che
> può presentarsi anche con altri listener?
[...]
Si e no.
Tutto dipende dal caso specifico.
Ci possono essere listener usa-e-getta come questo, oppure ci possono essere
listener che vengono aggiunti e rimossi esplicitamente da un comando
dell'utente, come ad esempio ho fatto nel BasicMacroRecorder con il
XSelectionChangeListener
In realtà, anche in questo caso si potrebbe creare il listener una sola volta
e usare sempre quello anche nelle chiamate successive.
Invece se noti, nella nuova versione ho fatto cosi:
----------------------
Sub TestRangeSelection()
oDocView = ThisComponent.currentController
If Not IsNull(oRangeSelectionListener) Then
oDocView.removeRangeSelectionListener(oRangeSelectionListener)
End If
oRangeSelectionListener = _
createUnoListener("oDocView_","com.sun.star.sheet.XRangeSelectionListener")
oDocView.addRangeSelectionListener (oRangeSelectionListener)
...
...
----------------------
Cioè se il listener esiste già viene comunque rimosso e poi ricreato e
aggiunto.
In genere invece faccio semplicemente:
----------------------
...
If IsNull(listener) Then
listener = CreateUnoListener("prefix_","bla.bla.XListener")
End If
oDocView.addBlaBlaListener(listener)
...
...
----------------------
In questo caso però mi ero accorto che lanciando la macro da IDE il listener
smetteva di funzionare correttamente e non si poteva riutilizzarlo.
Allora, per maggior precauzione ho deciso di ricrearlo ogni volta.
Non so se questo si possa considerare un bug perchè il listener non dovrebbe
essere chiamato se il documento attivo non è Calc
Va anche detto che questo listener è una mia vecchia conoscenza :-)
In passato infatti, avevo già segnalato un bug ben più grave su questo
listener e in effetti questo bug minore pare il risultato di un fix
incompleto del precedente.
Magari tornerò alla carica su IZ appena ho un po di tempo per fare delle
prove.
Come vedi le tecniche per gestire "l'esistenza in vita" degli oggetti possono
variare a seconda delle circostanze... :-)
In questo caso ho fatto una piccola 'variazione sul tema' per evitare di
incappare in un (possibile) piccolo bug
saluti
Paolo
--
iscriviti anche tu al corso di sopravvivenza nel mondo linux:
t'insegnano come accendere una periferica sfregando due banchi di memoria
--madmachine
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]