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]

Rispondere a