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?
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...
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?
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...
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...
E, in ogni caso, c'è modo di azzerarla ?
Cosa vuol dire "azzerare" una variabile oggetto?
mi spiego sotto... dopo l'esempio...
Ti ricordo che una variabile oggetto è un riferimento, un puntatore, non
un "contenitore"
Ad esempio potresti avere più variabili object che si riferiscono ad una
stessa istanza di un oggetto.
Detto questo, vuoi "azzerare" la variabile o l'oggetto vero e proprio?
Così di getto direi entrambi...
Cioè sono interessato sia a "terminare" lo status indicator da me
creato, sia far si che la Var che lo puntava (e mi consentiva di
"trattarlo") cambi il suo stato in modo che si possa sapere se l'Oggetto
a cui lei puntava esiste ancora... anche qui vedi sotto... dopo l'esempio
E comunque a mio parere si tratta di una domanda oziosa, perchè non dovresti
aver bisogno di "azzerare" oggetti e se questo accade, dovresti piuttosto
ripensare a come hai organizzato il codice.
Son qui per questo! :-)
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.
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 ), 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
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ù.
Ma nessuno finora ha informato la var oPG2 che l'oggetto sia stato
"terminato"...
Infatti alla 3° esecuzione xray ci ripropone quell'oggetto (no name)...
Ma cosa significa?
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?
In pratica oPG2 risulta not Null e la macro continua testardamente a
cercare di "terminare" l'oggetto status indicator (anziché ricrearlo)
Nel caso l'Oggetto status Indicator sia stato realmente terminato c'è
modo di informare anche oPG2 del fatto?
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?
Grazie Paolo per la pazienza
Bart
PS
Se invece non hai pazienza grazie ugualmente...
usando il codice di Sergio o il mio workaround la cosa su OOo 2.4 pare
comunque funzionare...
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]