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]