Ciao a tutti. Ho una funzione generica che mi carica una listbox passandogli una query.
Per velocizzare il caricamento rendo invisibile la listbox (ho anche liste con più di 20000 record).
Ho scoperto da poco il controllo progresswheel che mi piacerebbe mostrare sul form parent su cui si trova la listbox finchè questa è invisibile per poi scomparire quando torna visibile. Non riesco a scrivere questa procedura, potreste aiutarmi? Non compare mai la progresswheel sulla window ho provato con visible poi refresh ma non compare mai.
Grazie
Lanci la procedura e attivi un timer che visualizza la progress wheel poi quando la lista completa il timer si disattiva e progresswheel sparisce.
fatto ma non funziona ho messo la progresswheel visible true prima del ciclo che carica la listview e visible false alla fine del ciclo.
Forse il problema che la creo genericamente? Come faccio a legarla alla stessa finestra che contiene la listview? Devo aggiungerla al container come si fa in vb.net? Se si come?
Hai usato il timer ? il timer che deve rendere visibile o invisibile la wheel.
Tieni presente che tutto ci che riguarda la grafica viene eseguito sempre a fine procedura/method indipendentemente dalla posizione in cui lo scrivi nel codice per questo anche se scrivi visible true all inizio e poi visible false alla fine, anche se c un kilometro di codice in mezzo , nn cambia niente, gli aspetti grafici vengono realizzati sempre alla fine.
L’ho scoperto da poco nel forum inglese… mi si aperto un mondo !
Ci sei riuscito?
Altrimenti posso darti altri suggerimenti o chiarimenti.
No Antonio perch io ho un application module in cui ho una funzione carica griglia che non fa altro che alimentare una listbox passata come parametro con una query passata come secondo.
Rendo la griglia invisibile perch effettivamente ho notato che le prestazioni migliorano decisamente, ma non so come dire metti la progresswheel sul form contenitore della listbox finche’ la griglia non carica. Il timer non sono riuscito ad utilizzarlo.
Ciao Marco,
un modo un po “strano” ma che funziona questo:
aggiungi alla finestra (o al container control) una progressWheel. Posizionala da qualche parte, dopo la spostiamo, e rendila non visibile.
Ora devi separare il tuo metodo di popolare la lista in due parti diciamo che il tuo metodo si chiama PopolaLista(list as listbox, rs as recordset)
Crei un nuovo metodo (abbiamo parametri diversi per cui non va in conflitto)
Public Sub PopolaLista(prog as ProgressWheel, list as Listbox, rs as RecordSet)
dim d as new Dictionary //Creo un dictionary con i parametri, ci servir dopo
d.Value("list")=list
d.Value("rs")=rs
d.Value("prog")=prog
if rs.RecordCount>1000 then //Decidi tu il limite per cui vuoi popolare o meno la lista facendo vedere la pw
showProgress prog, list, true //mostra/nasconde la lista e loa progressWheel
d.Value("mode")=true
xojo.core.Timer.CallLater(5, WeakAddressOf PopolaLista, d) //Dove popoliamo la lista
//facendolo con 5ms di ritardo diamo tempo alla finestra di aggiornarsi, controlla questo valore, magari da aumentare di poco
else
d.Value("mode")=False
fillList d //Dove popoliamo la lista
end if
End Sub
Public Sub showProgress(prog as ProgressWheel, list as listbox, mode as Boolean)
if mode then //posiziono la pw esattamente come la listbox
prog.Left=list.Left
prog.top=list.top
prog.Width=list.Width
prog.Height=list.Height
end if
prog.Visible=mode
list.Visible=not mode
End Sub
Public Sub PopolaLista(d as auto)
dim dc as Dictionary=d //Riesplicito i parametri
dim list as Listbox=dc.Value("list")
dim rs as RecordSet=dc.Value("rs")
dim mode as Boolean=dc.Value("mode")
list.DeleteAllRows
..... popolo la lista
//Se necessario mostro la lista e nascondo la pw
if mode then showProgress(dc.Value("prog"), list, False)
End Sub
Il metodo corretto sarebbe con un thread in modo da non bloccare l’utente, ma non potendo toccare la UI in un thread la cosa difficile.
In ogni caso, a mio avviso, meglio filtrare i dati e evitare di mostrare migliaia di record alla volta, con troppi dati l’utente di perde
grazie antonio sempre prezioso e gentilissimo la provo e ti faccio sapere
Ho risolto col tuo sistema l’unico problema che l’oggetto microscopico e non ruota pensavo fosse animata la rotellina.
C’e’ modo per ingrandirla?
Ps il popolalista qui mi dava problemi perche’ la chiamata
xojo.core.Timer.CallLater(5, WeakAddressOf PopolaLista, d) //Dove popoliamo la lista
non funziona per le procedure che non restituiscono nulla
ShowProgress la ridimensiona, certo non si ingrandisce molto. Se non ti soddisfa o per cambiare grafica consiglio una sotto classe di canvas dove disegni tu qualcosa ( pi difficile a spiegarlo che a farlo non ti preoccupare)
PopolaLista(d) la variante con un solo parametro, sta a te scriverla (per errore l’ho chiamata fillList in quella che decide cosa fare)
Se in quella multiparametro rs nil deve richiamare la versione senza progress (come quella con meno di 1000 record), basta mettere rs<>nil and rs.recordCount>1000
… sempre se ho capito bene cosa intendi per “non funziona per le procedure che non restituiscono nulla”