Progresswheel dinamica

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 !

Grazie Horacio ci provo.

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”