Newsgroup: it.comp.lang.visual-basic
Titolo: [?]Ultimo problema con listbox (forse :-)

Sempre riguardo al mio programma per ascoltare mp3..
C'č una listbox che contiene i titoli e un bottone "Salva playlist" che
salva su file l'elenco con questo codice:
Private Sub salva_Click()
    With cdialog 'Apri cdialog per salvare
        .Filter = "File playlist | *.pli"
        .Flags = cdlOFNPathMustExist Or cdlOFNExplorer
        .FileName = "Playlist"
        .ShowSave
    End With
        nomesv = cdialog.FileName
Open nomesv For Append As #1
posiz = elenco.ListIndex
elenco.ListIndex = -1
Print #1, "Un po di avvertenze per chi edita il file"
Print #1, Str(elenco.ListCount) 'Numero titoli
For X = 0 To elenco.ListCount - 1
    elenco.ListIndex = elenco.ListIndex + 1
    Print #1, elenco.Text
Next
Close #1
elenco.ListIndex = posiz
End Sub
Funziona tutto perfettamente, perň il computer rimane bloccato fino a che
non ha finito di scorrere tutte le voci dell'elenco, che possono essere da 1
a 10000. Questo č un problema quando le canzoni in elenco sono tante perchč
non tutti hanno un 2 ghz con 512 mb di ram (neanke io :-)
come posso fare a creare una funzione di salvataggio piů veloce?
Ciao, Devaraja

 ha scritto nel messaggio
news:eNv4a.266042$AA2.10...@news2.tin.it...


 Next
qui prova ad usare una cosa piu' semplice:
For X = 0 To elenco.ListCount - 1
    Print #1, elenco.List(i)
Next
cosi' non deve fare alcun aggiornamento grafico, dovrebbe essere nettamente
piu' veloce (anche se certamente... memorizzare il contenuto della list in
un vettore parallelo gia' in origine sarebbe probabilmente piu' efficiente)
ciao, assa.

 Ciao, Devaraja
Ciao
Andrea

 decidi di usare un ciclo.
con doevents lo rallenta parecchio...

 Ma non fa semrare bloccato il PC....
Vero.
Ma hai una vaga idea dei disastri che può combinare il doevents in una
procedura che dura molto, se non viene correttamente gestito?
Prova questo codice (progettino vuoto, commandbutton ed esegui)
Private Sub Command1_Click()
Dim fil As Integer
Dim n As Long
fil = FreeFile()
Open "d:\temp\pippo.txt" For Output As #fil
For n = 1 To 1000000
    Print #fil, "Riga numero " & CStr(n)
    DoEvents
Next n
Close fil
call msgbox("Finito")
End Sub
Prova a premere il commandbutton, e aspetta che finisca.
Poi, premi il commandbutton e, prima che abbia finito il ciclo, premilo
nuovamente.
Ciao
Alberto

 Ma non fa semrare bloccato il PC....
la domanda non era sul refresh (in senso lato), era sulla velocita'...

 PC sia bloccato, tutto qui....:-)
vero :)
in effetti, quando l'operazione e' lunga, i controlli sono comunque un
problema.
se li rinfreschi, rallenti e, come nota albe, corri rischi.
se non li rinfreschi, puo' venire la dormia.
prob la cosa migliore e' quello che suggeriva assa, caricare tutto in una
matrice sganciata dai controlli e lavorare su quella. se il controllo e' un
filebox, usare dir$, ecc.
ciao

Che rimanga intesa una cosa:
Io ho preventivamente supportato i consigli già dati.
Gli ho però voluto dire come sistemare la cosa del "Pc bloccato".
Ciao
Andrea

End Sub
command1.enabled=true
:-)
Ciao,
	Negus

 command1.enabled=false
command2.enabled=false
command3.enabled=false
command4.enabled=false
command5.enabled=false
command6.enabled=false
command7.enabled=false
command8.enabled=false
command9.enabled=false
command10.enabled=false
command11.enabled=false
command12.enabled=false
.....
Più controllare il query_unload, più controllare tutti gli eventuali
controlli bound, ecc...
So che può essere gestito (infatti il mio post diceva "se non opportunamente
gestito"), ma ritengo che il DoEvents sia una cosa di una
pericolosità/comodità smisurata, e che venga consigliato con troppa
leggerezza.
Tutto qui.
Ciao
Alberto

 controlli bound, ecc...
e magari anche il gestore degli errori....
--
Salutoni
Sergio

non pensavo di ricevere così tante risposte :-))
ho scelto di usare la soluzione di assa perchè mi sembra la più semplice e
non volevo usare un DoEvents (mi avete spaventato, è così pericoloso? :-)
Ciao, Devaraja

 pericoloso? :-)
Devaraja, non c'e l'ho con te, ma mi scappa di dirlo....
Perchè tutti si fermano agli slogan?
DoEvents è pericoloso!
DoEvents è una istruzione come tante, e fa quello per cui è stata costruita. Per
alcune cose mi sembra sia indispensabile, ma restituendo il controllo a windows
rompe (o può rompere) la sequenzialità dell'esecuzione delle istruzioni
all'interno del codice.
Si tratta di vedere se utilizzata in un certo contesto può fare dei danni e
quanto "costa" scrivere il codice che evita quei danni. Punto.
--
Salutoni
Sergio

 leggerezza.
Però bisogna ammettere che l'interfaccia utente di un sistema
multitasking funziona così, e va usata come tale. Non _puoi_
inchiodare il PC all'utente per una routine lunga. E' una rogna,
è complesso, è lento e delicato, ma va gestito.
Tutto questo IMVHO, naturalmente. :-)
Bye, G.

 è complesso, è lento e delicato, ma va gestito.
Ritenevo, mettendo le due parole pericolosità e comodità così vicine, di
essere stato sufficientemente chiaro.
Ciao
Alberto

"Albe V°" ha scritto nel messaggio

Invece rileggendo il mio post mi sa che io sono sembrato
polemico... non era nelle mie intenzioni, chiedo scusa :-).
Bye, G.