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]

Rispondere a