Paolo Mantovani ha scritto:

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.

K... definitivo!


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.

Ecco... qui tocchiamo uno dei miei problemi... non è che io li voglia avviare deliberatamente. Alle volte il codice è lento ad eseguirsi... e succede che l'utente avvi nel frattempo qualcos'altro. Succede per esempio in apertura di un doc... dove in Ultimus deve eseguire parecchie cose... io i controlli li blocco... ma se l'utente dal file manager clicca su un altro doc.odt è un disatro.
Questo comunque è un altro problema... ma volevo giustificarmi.


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)

k Chiaro!

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

Paolo, guardare la documentazione non significa necessariamente capirla... :-(

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.

L'avevo intuito... ma non trovo tra i metodi qualcosa in grado di distruggerla... Sull'opportunità di distruggerla possiamo discuterne... ma comunque (accademicamente) consentimi la domanda:
si può fare?
e se si, come?


Usa la funzione IsNull() per controllare se la variabile oggetto contiene
già un riferimento valido.
Pare non funzionare... vedi sotto...

Funziona.

... ?  ....


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.

Ecco... ho rigirato il codice sopra in tutti modi che mi venivano in mente... ma non ho risolto.

Dove sto sbagliando?

Come andrebbe scritto il codice?

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

k ... definitivo.. allora... questo sevizio non ha un nome!

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

si certo... ma sapere che supporta l'interfaccia com.sun.star.task.XStatusIndicator continua ad essere un qualcosa di generico...


...zot...
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ù ?

Messa in questo modo inevitabilmente NO: l'oggetto continua ad esistere

Ma a questo punto sarebbe necessario poterlo "mostrare" nella riga di status, oppure "NON mostrarlo".
E per poterlo fare dovremmo sapere il suo "stato" di visibilità.


Ma nessuno finora ha informato la var oPG2 che l'oggetto sia stato
"terminato"...
1)l'oggetto non è affatto terminato

k... ormai questo mi è strachiaro... :-)

2) Come si fa ad informare una variabile di qualcosa?

se si tratta di una variabile stringa direi qualcosa del tipo:

sVAR = "Tu hai il morbillo"

ma se cambiamo tipo di variabile la cosa mi sfugge un po'...
oVar = NULL non credo funzioni...

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.
k

L'oggetto è solo invisibile
k

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

Non è stato terminato un bel nulla
k


Non vorrei complicare il tutto... ma a me sembra che avere qualcosa li appeso (non so dove) mentre apro diversi doc sul mio desktop non sia una buona cosa.
Non sarebbe meglio terminare distruggere il mio oggetto?

(devo parlare al mio analista di questa mia pulsione alla distruzione?)


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

mmm... si, ma la mia variabile, una volta che è stata "riempita" con il riferimento all'oggetto, sembra giustamente mantenere il riferimento.

Ma a questo punto, se l'oggetto viene solo reso invisibile,
interrogare la variabile mi sembra poco utile... perché isNull ci dice solo che l'oggetto esiste, e non il suo stato di visibilità.

E, nel caso non si sia in grado (o non si voglia) distruggere l'oggetto, mi pare che conoscere il suo "stato" di visibilità sia la cosa veramente importante.

(Su quanto sopra sono certo che hai delle idee precise...)


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???

:-)

Paolo... sono 46 moduli... e quasi tutti superano le 1500 linee..
Ho cercato di postare il nocciolo del problema...
Un po' di decenza mi è rimasta... :-)

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

Da qualche parte un qualche errore ci doveva pur essere... altrimenti non avrei chiesto aiuto! :-)

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

Quale era il codice che funzionava?
la domanda non è polemica... ma tecnica e specifica!

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

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.

Vero... si... e se continui a maltrattarmi apro 4 nuovi thread in merito...

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!

Invece ci riesci benissimo... :-)
e sono certo che 20 righe di codice "buono" sarebbero risolutive!

grazie

Bart




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

Rispondere a