Il sabato 7 giugno 2008 14:40:48 Bart Aimar ha scritto:
> Paolo Mantovani ha scritto:
> > Ciao Bart,
>
> Ciao Paolo
>
> scusami... ma mi sembra opportuno quotare quasi tutto... e in molti
> punti mi ripeto...
>
> > Il mercoledì 4 giugno 2008 14:02:40 Bart Aimar ha scritto:
> >>..zot..
> >> Ma all'interno di codice complesso (diciamo pure un po' confuso) questo
> >> oggetto si perde e "barra_chiudi" non lo chiude!
> >
> > Questo è il problema vero da risolvere: L'oggetto non si dovrebbe perdere
>
> Si... concordo... ma una domanda che comunque riprenderò sotto è: ma se
> lo si perde si può ritrovarlo?

In generale no.


>
> >> Per riprodurre la situazione è sufficiente eseguire 2 volte di seguito
> >> Barra_apri...
> >
> > Ok il motivo della "perdita" è chiaro: quando crei un secondo
> > StatusIndicator e lo assegni alla variabile global il primo non è più
> > recuperabile.
>
> Si... detto così è chiaro... "assegnare" due oggetti diversi alla
> medesima variabile è un buon modo per far casino... :-)
>
> > Devi semplicemente assicurarti che l'oggetto StatusIndicator non venga
> > creato per più di una volta.
>
> Ma gli oggetti status indicator creabili sono più di uno...

Se ne devi creare più di uno devi gestire il codice in modo opportuno
Usa più variabili oppure usa un array.
La domanda però è: perchè usarne più di uno?
Hai più processi che girano in parallelo e devono mostrare il progresso 
all'utente? Non è così semplice creare architetture del genere in Basic e 
comunque sarebbe da evitare visto che il basic non ha gli strumenti per 
gestire task paralleli.

Perciò, tornando alla domanda precedente, se non devi gestire task paralleli 
ti basta un solo statusindicator.
(Ne potresti anche creare più di uno, ma non li useresti mai 
contemporaneamente)


> e se si mantengono puntati dalle rispettive variabili, possono venir
> terminati a piacimento..
>
> > Lo crei solo la prima volta e poi lo riutilizzi.
>
> ??? Ecco... ma oProgressBar.end lo termina nel senso che lo distrugge?
> Oppure no?

Accidenti ma un occhiatina alla documentazione proprio no?
vabè, controllo io: 

IDL documentation
:: com :: sun :: star :: task :: 
  interface XStatusIndicator
...
end
[oneway] void
  end();
  Description
stop the progress 
 Further calls of XStatusIndicator::setText(), XStatusIndicator::setValue() or 
XStatusIndicator::reset() must be ignored. Only XStatusIndicator::start() can 
reactivate this indicator. It's not allowed to destruct the indicator inside 
this method. The instance must be gone by using ref count or disposing.
...

A quanto sembra il metodo end() non distrugge l'oggetto. 




>
> >> Con xray non riesco ad indagare l'oggetto oProgressBar
> >
> > e perchè mai?
>
> Mi restituisce un oggetto senza nomi ne "identifcatori", nel senso che è
> un oggetto un po' fluttante...

E' un un normale servizio UNO, non capisco cosa intendi dire. 


> >> Non trovo il modo di verificare se esiste/non esiste, se la variabile
> >> (che dovrebbe contenerlo ??) sia vuota o piena...
> >
> > Usa la funzione IsNull() per controllare se la variabile oggetto contiene
> > già un riferimento valido.
>
> Pare non funzionare... vedi sotto...

Funziona.



[...]
> Allora... noi abbiamo due "cose":
>
> - La variabile (che è solo ad un puntatore ad un oggetto)
> - l'oggetto StatusIndicator vero e proprio
>
> Se si esegue questo codice:
>
> Global oPG2 as object
>
> Sub Main_1
>       xray oPG2
> if isNull (oPG2) then
>       print "null"
>     oPG2 = ThisComponent.CurrentController.Frame.CreateStatusIndicator
>     oPG2.Start("",100)'
>     oPG2.Value = 100
>     oPG2.Text = "Attendi pazientemente!"
>   else
>       print "Not null"
>     oPG2.end
> end if
> End sub
>
> noi creiamo l'oggetto ed una variabile che punta a quell'oggetto.

Il codice è tecnicamente corretto ma non ha molto senso.
Non si usa così il servizio status-indicator.

>
> La prima volta che si esegue va tutto bene... oPG2 è Null e crea
> l'oggetto statusIndicator, (lo possiamo vedere sulla riga di status)
> Alla seconda esecuzione xray su oPG2 ci visualizza il "contenuto" della
> var oPG2, che risulta essere un qualcosa ( no name )

Non tutti i servizi UNO hanno un implementation-name
In particolare, servizi creati "al volo" come questo, spesso non ce l'hanno

> ,  effettivamente 
> del tutto anonimo; per capire di cosa si tratti occorre andare in .Types
>   dove troviamo un array che all'elemento 1 riporta:
>    1 | Object : com.sun.star.reflection.XIdlClass -->
> com.sun.star.task.XStatusIndicator

Oppure si può cliccare su "interfaces" in alto a sx nel dialogo di XRay per 
consultare la lista delle interfacce supportate



> proseguendo oPG2 risulta "not null" ed esegue
> oPG2.end
> e la progressBar sparisce dalla riga di status, e ci si aspetta che
> quell'oggetto non esista più.

Cioè se un oggetto non si vede non esiste più ?



> Ma nessuno finora ha informato la var oPG2 che l'oggetto sia stato
> "terminato"...

1)l'oggetto non è affatto terminato
2) Come si fa ad informare una variabile di qualcosa?

> Infatti alla 3° esecuzione xray ci ripropone quell'oggetto (no name)...
> Ma cosa significa?

Significa che l'oggetto è ancora li e non è successo nulla di particolare.



> Che oPG2 ancora punta ad un oggetto che in realtà non c'è più?
> (infatti la riga di status è "normale"...)
> Oppure l'oggetto status indicator esiste ancora come zombie vagante in
> qualche limbo?

L'oggetto è solo invisibile



> In pratica oPG2 risulta not Null e la macro continua testardamente a
> cercare di "terminare" l'oggetto status indicator (anziché ricrearlo)

L'oggetto è solo invisibile non va ricreato, devi solo chiamare il metodo 
start per ricominciare un altro progress


> Nel caso l'Oggetto status Indicator sia stato realmente terminato 

Non è stato terminato un bel nulla

> c'è modo di informare anche oPG2 del fatto?

Le variabili non si possono informare. 
Tu puoi controllare se una variabile oggetto contiene un riferimento ad un 
oggetto con la funzione IsNull()


>
> Infine
> l'oggetto status indicator NON e univoco per ciascun frame...  (infatti
> ne posso creare più di uno (con diversi testi), e se ciascuno
> correntemente puntato da una viariabile, esplorabile e "terminabile" in
> modo indipendente.)
> Ma c'è un modo per distinguerli l'uno dall'altro o per trovarli senza
> l'aiuto di una Var Global?

Ho già risposto a questo, all'inizio del post



>
> Grazie Paolo per la pazienza
>
> Bart
>
> PS
> Se invece non hai pazienza grazie ugualmente...

eh no! io la pazienza ce la metto, però a questo punto un paio di cosette le 
devo dire :-)

1) hai iniziato il thread dicendo (più o meno):

"Ho questo codice che è corretto, ma nel contesto del mio programma non 
funziona"

Ma io dico: hai un problema nel tuo programma e alleghi l'unica parte di 
codice che funziona??? 

2) sei partito dall'assunto che il metodo end() terminasse l'oggetto quando la 
documentazione dice esattamente il contrario

3) basandoti su questo falsa assunzione hai fatto tutta una serie di 
considerazioni ovviamente errate (per forza di cose)

4) sulla base di queste hai modificato il pezzo di codice che funzionava 
rendendolo inservibile.

5) con il codice rappezzato che ovviamente non funziona, ora poni tutta 
un'altra serie di domande sul perchè non funziona
....

Siamo partiti dallo statusindicator e siamo andati a toccare i tipi di 
variabile, persistenza, visibilità, garbage collector, tutta roba che c'entra 
poco o nulla e comunque meriterebbe delle discussioni a parte.

Ripeto, io la pazienza ce la metto tutta, in fin dei conti a me fa piacere 
chiacchierare di macro e starbasic, però non riesco a starti dietro!


ciao
Paolo M



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

Rispondere a