Esecuzione comando Window.Visible = False lentissimo

Come indicato nell’oggetto per non perdere i valori continuti in 2 combobox di 12000 righe ciascuna la una window che le contiene invece che fare il self.close la rendo invisibile per poi riaprirla quando mi serve l’unico problema è che per eseguire il comando Window.Visible = False ci mette 11 secondi che mi sembrano francamente tanti, se qualcuno ha qualche suggerimento per risolvere la cosa lo ringrazio in anticipo.

Premetto che non so quanto tempo ci mette per caricare i valori su le 2 combobox.
Si potrebbe provare a chiudere e riaprire la finestra ma con una compilazione della combobox tramite timer in modo che, mentre si compila, l’utente può già utilizzare il resto dei controlli ed in realtà anche le combobox
Chiaramente l’auto completamento prenderà in considerazione solo i campi inseriti fino al momento dell’utilizzo della combobox ma nel frattempo continuerà ad aggiungere righe.
Questo approccio lo uso per copilare le tabelle da database in modo da non rallentare l’applicazione, non l’ho mai provato per le combobox

2 combobox da 12000 righe ciascuna?
Mi sembra tanto!

In effetti si
Comunque se sono indispensabili si potrebbe provare come ho scritto.
Vorrei solo precisare che, ovviamente, non funzionerebbe mettendo tutta la lista direttamente nel Timer.
Ma nel timer deve aggiungere una riga alla volta.
In pratica dev’essere impostato con un RunMode=Multiple e Period anche 1
Es. codice Timer Action:

Dim s1, s2 As String

s1=FunzioneCheMirichiamaLaStringa(self.ComboBox1.LastRowIndex+1)
s2=FunzioneCheMirichiamaLaStringa(self.ComboBox2.LastRowIndex+1)
If s1<>"" Then Self.ComboBox1.AddRow(s1)
If s2<> "" Then Self.ComboBox2.AddRow(s2)
If s1="" And s2="" Then Me.RunMode=Timer.RunModes.Off

E fai una funzione che ti ritorna una stringa in base all’indice Es.:

Function FunzioneCheMirichiamaLaStringa(index As Integer) As String
Select Case index
Case 0
Return "Stringa 1"
Case 1
Return "Stringa 2"
Case 3
Return "Stringa 3"
Case Else
Return ""
End Select
End Function

Così dovrebbe funzionare. Anche se scrivere 12000 condizioni nel metodo FunzioneCheMirichiamaLaStringa non è proprio una cosa divertente (sopratutto se le due combobox hanno un elenco diverso…in quel caso le funzioni sono 2)
Mi faccia sapere se così va bene

Sono l’elenco di tutti i comuni e stati con il codice di riferimento (Es L219 Torino) in italia sono circa 12000 compreso gli stati stranieri aggiornato a gennaio 2023

Grazie ma non posso utilizzare questo metodo in quanto devo poter entrare e uscire dalla Window parecchie volte perchè è un’applicazione di controllo accesso tramite il documento quindi devono essere sempre in linea, grazie comunque

Comunque quello che non capisco è il perchè deve essere così lento mentre se si fa il self.close è immediato, anche il richiamo della window con Window.Visible = True è immediato, misteri di Xojo

Questo non lo so neanche io onestamente, però si potrebbe fare tutto su un unica pagina senza aprire la finestra.
Usando un PagePanel, quando normalmente si avvia l’evento del Window.Visible=True semplicemente si cambi l’indice della pagina e poi quando serve la si fa ritornare nella pagina precedente.
Se invece è indispensabile una nuova finestra si può pensare di usare il metodo del timer ma con un database sqlite che viene generato nella cartella dell’applicazione così anche se non ha caricato tutto si può filtrare dinamicamente anche son i semplici comandi sql.

Chiaramente, se si decidesse di usare il database l’evento Action del timer dovrebbe occuparsi semplicemente di procedere con le righe del RowSet che dev’essere una variabile almeno a livello di finestra
Serve un metodo che genera il RowSet e avvia il timer:

Sub CompilaComboBox(ByRef sql As SQLiteDatabase, selection As String, table As String)
myRowSet=sql.SelectSQL("SELECT * FROM "+table+" WHERE "+selection+";")
Self.ComboBox.RemoveAllRows
Me.RunMode=Timer.RunModes.Multiple
End Sub

Es. nell’evento Action del Timer:

If Not myRowSet.AfterLastRow Then
Self.ComboBox.AddRow(myRowSet.Column(columnName).StringValue)
myRowSet.MoveToNextRow
Else
Me.RunMode=Timer.RunModes.Off
End If

Chiaramente è solo a scopo esemplificativo senza controlli ed andrebbero trattati con 2 record set differenti

Ciao Pietro,

io ho fatto un test veloce e non vedo il problema che segnali, sicuro che non ci sia qualche procedura che viene eseguita ogni volta che la finestra viene visualizzata o nascosta?

test

No all’uscita torna al menù principale dove ci sono solo delle selezioni ma non fa alcuna operazione intermedia

Ciao Pietro, dimmi se ho capito bene: nel primo combobox carichi i comuni italiani/stati esteri, nel secondo i codici corrispondenti (es. L219 per Torino).

Se così fosse, potresti risparmiarti il secondo combo (12000 righe in meno da caricare) ed inserire i codici comuni nel RowTagAt: forse i tempi delle varie operazioni si accorciano…

Ciao no in tutte e due le combobox ci sono gli stessi dati perché una mi serve per il comune di nascita e l’altra per quello di residenza, comunque penso di avere risolto i saprò essere più preciso domani perché stasera lo collaudo sul “campo”.
Grazie per il tuo interesse buon weekend

RISOLTO con PagePanel grazie a tutti per consigli