Paolo Mantovani ha scritto:
Ciao Bart,
Ciao Paolo,
Il lunedì 11 febbraio 2008 19:23:10 Bart Aimar ha scritto:
[...]
Quindi la domanda:
vi viene in mente come si possa attivare una normale finestra (un
dialogo ad esempio), che:
- non fermi il codice
Dovresti usare gli eventi.
Io ho usato una tecnica del genere in passato.
E' un po sporchina ma efficace, solo che non sono sicuro che possa adattarsi
al tuo caso (vedi prossimo commento)
Vedo volentieri questi "eventi".
- rimanga costantemente in primo piano anche quando il codice sposta il
focus su altre finestre
Quasi sicuramente questa è una fonte di problemi.
I dialoghi sono modali rispetto ad una sola finestra, non a tutte quante.
Tre sono le situazioni:
1) Trasferimento di dati da un computo ad un altro. Un delirio peloso ma
non si utilizza tutti i giorni; si passa da un doc ad un altro
trasferendo/duplicando dei dati ... (una vera acrobazia)... impossibile
(se ne era già parlato) evitare di rendere correnti/attivi i diversi
doc(ma che sono poi solo 2) .
2) La duplicazione di dati da un prezzario (doc1) al Computo (doc2); la
cito per completezza... ma questa non da problemi perchè si trasferisce
una sola voce per volta in formato testo e non presenta problemi (nel
senso che non serve una "Clessidra").
3) Le normali operazioni all'interno del doc di Computo: alcune di
queste sono un po'"gravose" e necessiterebbero di una avviso: "Tieni le
mani in tasca" sempre in primo piano al doc
E' anche vero che recentemente è stata introdotta la proprietà DesktopAsParent
nel dialog model, che dovrebbe proprio fare allo scopo, ma non sono mai
riuscito a farci nulla di utile...
Indagherò... ma sei puoi antiparmi qualcosa tu...
Se vuoi ti passo un esempio così puoi provare,
Un esempio funzionante mi piacerebbe vederlo
grazie :-)
però se a mio avviso dovresti
prima cercare di ripulire il codice in modo da non dover attivare e
disattivare le finestre ove possibile.
Francamente ho molte resistenze in merito.
Paradossalmente ho la sensazione le macro che fanno ampio uso del select
siano nell'uso più chiare... si è meno spaesati... malgrado i vari salti
da un posto all'altro.
Comunque si... hai ragione... ma c'è molto codice da riscrivere e -
dove possibile - lo sto facendo (ma pian pianino)
Ma ci sono anche situazioni dove l'unico espediente che ho trovato è
quello di rendere attivo un range (o cella che sia)
Il termine probabilmente non è appropriato... ma intendo:
ThisComponent.CurrentController.Select(Qualcosa)
Un esempio base è quello di confermare il dato immesso in una cella...
se l'utente scrive, non preme enter, e aziona direttamente il pulsante
della macro, il dato NON viene confermato;
e se la macro aveva bisogno di quel dato immesso (solo "per finta")
succedono poi cose antipatiche.
In passato con l'aiuto di Lido, si era risolto con un complesso
ambaradan che per capire se si era ancora in "editing mode" andava a
fare i conti delle barre aperte... ma tutto saltava se si cercava di
lavorare a "schermo intero".... o se si toglieva o aggiungeva qualche
barra...
Adesso, banalmente, in testa alla macro scrivo:
ThisComponent.CurrentController.Select(Una_cella_qualsiasi_diversa_da_quella_dove_andrò_a_prelevare_il_dato)
E funziona egregiamente. :-)
Altre volte invece ho bisogno di spostare la visualizzazione su una
tabella specifica e diversa da quella da cui si era partiti.
Qui l'utente sarà sollecitato a prendere una decisione in base a quello
che vede (con un click appropriato...)
----
Tornando alla Clessidra (sempre con Lido) si era messa a punto una
strategia che consisteva in:
disattivare tastiera e mouse
oMouseClickHandler = createUnoListener
keyHandler_KeyReleased = False
aprire una progressbar sulla riga di status
ThisComponent.CurrentController.Frame.CreateStatusIndicator
Ovviamente, alla fine di uno step vanno:
eliminati i listeners riattivando tastiera e moouse
riattivata la riga di status standard
Ma per ragioni che mi sfuggono (errori nell'esecuzione del codice o
nella scrittura del codice o altro anche altro) erano troppe le volte
che si perdeva mouse, tastiera e riga di status.
Infatti avevo messo a menù un'applicazione "Ripristina Controlli" che
era probabilmente la più usata di tutto l'applicativo. :-(
(Semplicemente - via macro - facevo l'equivalente di Menu > Finestra >
nuova ... e cancellando la vecchia...)
Siccome quell'ambaradan non l'ho eliminato, ma reso on/off mediante
l'impostazione di una variabile, ogni tanto ci riprovo.. con risultati
unespected.
Ieri ad esempio l'autosalvataggio di OOo mi copriva la riga di status
con una delle mie frasi minatorie...
Oggi invece non succede...
Giusto una frase del tipo:
Attendi che la macro sia terminata!
per "disincentivare" l'interazione dell'utente io suggerirei un :
"ATTENZIONE - SCARICHE ELETTRICHE AD ALTO VOLTAGGIO! - MANTENERE ARTI,
TENTACOLI E SPORGENZE VARIE ADERENTI ALLA SAGOMA DEL CORPO FINO AL CESSATO
PERICOLO"
:-)
E se invece scrivessimo delle barzellette? raggruppate per categorie e
Tarate sulla lunghezza prevista dell'attesa...
Ovviamente un funzione random preleverà una storiella diversa ogni volta
dal magazzino della categoria giusta per l'occasione...
Cerchiamo di accattivarci questi utenti... :-)
Bart
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]