ciao Bart, Emanuele,

Alle 22:14, domenica 15 gennaio 2006, Bart Aimar ha scritto:
[...]
> Io non ho nemmeno capito quale sia la Sub principale... cioè quella da
> eseguire  :-(
>
> Da quale Sub la attivi?

Sub TestRangeSelection



>
> Ne hai scritta una nuova che non c'era nel codice di Paolo?

Rispondo io per Emanuele:
Non c'è bisogno di nessun codice aggiuntivo, non è che mi diverto a mandare 
degli esempi "tranello" :-)

Il problema è che non ho tenuto conto della 
Prima Legge di Bart:
"per quante prove tu faccia prima di spedire un esempio chiarificatore, una 
volta a destinazione il tuo esempio si rifiuterà di funzionare e se 
funzionerà lo farà in modo completamente casuale e ingovernabile con 
risultati completamente opposti a quelli desiderati"

:-)
Non è colpa tua Bart, mi spiace e faccio ammenda.
L'esempio andava benissimo se uno aveva già qualche idea di base.
Cioè, serviva solo ad illustrare il concetto, ma non conteneva tutte le 
"sicurezze" che normalmente si mettono in un'applicazione del mondo reale.
Avevo pensato di non appesantirlo con queste cose per evidenziare meglio il 
concetto centrale.

Comunque alla fine del post ho messo una versione migliorata dell'esempio.

>
> > Il listener è in pratica e molto poco "tecnicamente" (e sono pronto ad
> > essere smentito) un sistema che ti permette di lanciare una particolare
> >...zot...
> > nell'oggetto viene premuto deve eseguire la macro
> > "miaMacro_actionperformed"
> > Lo so, la descrizione è molto lacunosa, ma è un'inizio...
>
> Credo comunque di aver capito...

Ringrazio Emanuele per l'ottimo contributo.
Segnalo inoltre che nel manuale di Andrew Pitonyak c'è un capitolo dedicato ai 
listener (Listeners Write Up) scritto tra l'altro da un bravo guaglione 
italiano :-)

>
> > A me accetta anche la selezione di una sola cella.
>
> Si  certo anche a me... ma continuo a non vedere ciò che restituisce...

avevo piazzato un msgbox nella routine oDocView_done proprio per sottolineare 
che il range selezionato si estrae proprio li.

Inutile dire che tu non hai mai visto il msgbox oppure lo hai visto solo in 
circostanze casuali e del tutto imprevedibili :-) (dico bene?)


> > oEvent rappresenta (molto grossolanamente, ma solo perchè non son sicuro
> > nemmeno io) l'oggetto che ha "lanciato" l'evento.

Non proprio (ma quasi).
L'oggetto che lancia l'evento (il broadcaster - "stazione trasmittente" ) 
aggiunge alla chiamata un parametro che descrive l'evento.

Questo descrittore è sempre un oggetto ma le sue proprietà variano a seconda 
dell'evento, ad esempio:
se l'evento è un mouse_click l'oggetto descrittore avrà le proprietà 
oEvent.X
oEvent.Y
oEvent.Button

rispettivamente le coordinate X e Y del click e il numero di pulsante premuto 
(sx=1, centrale=2, dx=3)

Se invece si tratta di un evento TextChanged di un controllo testo, troveremo 
probabilmente la proprietà Text 

In questo modo nella routine che gestisce l'evento è possibile manipolare 
queste informazioni per i propri scopi.

In ogni caso, c'è una proprietà che è sempre presente : source
Questa proprietà contiene un riferimento all'oggetto sorgente dell'evento 
ovvero il broadcaster.

Se si tratta di un evento textChanged di un controllo testo, la proprietà 
source del descrittore di evento conterrà un riferimento al controllo di 
testo stesso.


> Qui non capisco...
> Il mio livello di programmazione è basso... circa quello di un utente...
> (mai fidarsi dell'utente...)
> E per me un oggetto esiste solo se lo si è definito... e oEvent non mi
> sembra definito da nessuna parte...

mai usato gli eventi in VBA / Excel ? 
Forse non ti sei accorto che nelle routine che appaiono quando fai doppio 
click su un controllo ci sono sempre dei parametri che sembrano non essere 
definiti da nessuna parte.

Bisogna ricordarsi che un evento non è altro che una routine scritta da te ma 
richiamata da qualcun'altro (da un controllo oppure dal documento) al 
verificarsi di un certo evento.

Quando registri un listener, come nel mio esempio, in realtà stai facendo un 
contratto con un oggetto dell'api di openoffice.

In pratica, nel caso specifico, tu stai chiedendo al documento (oDocView) di 
richiamare una certa routine (sub oDocView_done()) al verificarsi di un certo 
evento ( "l'utente ha selezionato un range" )
(oltre a questo ci sono gli eventi oDocView_aborted - "l'utente non ha 
selezionato nulla" e oDocView_disposing - "sto morendo", ma l'importane per 
ora è il conceto)

Nel contratto tra te e il documento avete pure stabilito che il documento 
dovrà passare un parametro mentre chiama la tua routine.
Nella fattispecie, il parametro che io ho chiamato oEvent

Nel contratto è stabilito inoltre che oEvent sarà un oggetto (o meglio una 
struttura) con le seguenti proprietà:

oEvent.RangeDescriptor
  (una stringa che descrive il range selezionato, es: $Tabellla1.$A$1)

oEvent.source
  (un riferimento alla sorgente dell'evento, in questo caso il documento 
stesso - oDocView)

La tua parte del contratto stabilisce che tu dovrai garantire l'esistenza 
delle routines (e quindi le dovrai scrivere) e che dette routines avranno i 
nomi prestabiliti e il numero di parametri prestabiliti (nel nostro caso 1):

sub oDocView_done(oEvent)

sub oDocView_aborted(oEvent)

sub oDocView_disposing(oEvent)



[...]
> Quando invece eseguo la:
> Sub TestRangeSelection()
>
> mi appare la finestrella e posso - FINALMENTE - "cliccare"...
>
> (ho anche inserito una bella prompt adatta all'uso...)
>
> Ma proprio non ho capito come estrarre quei dati...

dopo che l'utente ha cliccato sul range desiderato la faccenda si sposta nella 
routine oDocView_done

pertanto dovrai aggiungere li il codice per estrarre il range selezionato:
e tutto il rimanente codice per fare le altre cose che devi fare con sto 
benedetto range selezionato

es:

sub oDocView_done(oEvent)

'questa routine viene chiamata dal documento 
'dopo che l'utente ha finito di selezionare il range

'estrai il rang selezionato
  sRangeSelezionato = oEvent.RangeDescriptor

'....fai altre cose utili
'....fai altre cose utili
'....fai altre cose utili

'...ricordati di rimuovere il listener
  oEvent.source.removeRangeSelectionListener(oRangeSelectionListener) 
End Sub




[....]
> riesci a darmi qualche indicazione di più?

segue esempio 'migliorato' con qualche commento in più.

ciao
Paolo M


REM  *****  BASIC  ***** 

Global oRangeSelectionListener As Object

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)


  Dim mArgs(2) As New com.sun.star.beans.PropertyValue 
  mArgs(0).Name = "InitialValue"
  mArgs(0).Value = "A1" 
  mArgs(1).Name = "Title" 
  mArgs(1).Value = "My Title" 
  mArgs(2).Name = "CloseOnMouseRelease" 
  mArgs(2).Value = True 

  oDocView.startRangeSelection(mArgs()) 
 
End Sub

sub oDocView_done(oEvent)
'questa routine viene chiamata dal documento 
'dopo che l'utente ha finito di selezionare il range
  MsgBox oEvent.RangeDescriptor
  oEvent.source.removeRangeSelectionListener(oRangeSelectionListener) 
End Sub

sub oDocView_aborted(oEvent)
'questa routine viene chiamata dal documento 
'se l'utente non ha selezionato nessun range
  oEvent.source.removeRangeSelectionListener(oRangeSelectionListener) 
End Sub

sub oDocView_disposing(oEvent)
'questa routine viene chiamata dal documento 
'in caso di dipartita del compianto listener

End Sub

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Rispondere a