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]