Ordinamento veloce elementi listbox VB6

di Anonimizzato15375 il
21 risposte
Ciao a tutti,
ho una listbox dove carico ed ordino dei numeri in senso crescente.
Finché questi sono pochi (circa una cinquantina) l'ordinamento è veloce ma quanto il numero di elementi all'interno della list box diventa elevato (400-500 e oltre) l'ordinamento diventa lento impiegando svariati secondi. Potete darmi una mano a risolvere il problema, grazie.
Ecco il codice che ho utilizzato:

Public Sub Ordinacrescente()
Dim I As Integer
Dim J As Integer
Dim iCount As Integer
Dim Temp As Integer

iCount = schermata_volumi.lst_Numeri.ListCount
For J = 0 To iCount - 2
For I = 0 To iCount - 2
With schermata_volumi.lst_Numeri
If Val(.List(I)) > Val(.List(I + 1)) Then
Temp = .List(I + 1)
.List(I + 1) = .List(I)
.List(I) = Temp
End If
End With
Next I
Next J
End Sub

21 Risposte

  • Se i dati arrivano da un DB ordinali con SQL.

    Altrimenti caricali in un vettore e ordinali prima di caricarli nella listbox. Se lo fai direttamente nella listbox sarà comunque lento.

    Per ordinare i dati nel vettore usa l'algoritmo quicksort.
  • Ciao oregon, i dati vengono da un file mdb di access.
    Sto provando a risolvere il problema ma non ci riesco, sono poco pratico. Potresti aiutarmi?
  • Puoi aiutarmi?
    Ogni volta che ti rispondo ti aiuto. O no?

    Se i dati arrivano da Access probabilmente li prendi tramite una query. Se è così usa la clausola ORDER BY
  • Hai ragione..., è da sempre che mi aiuti... purtroppo non sono ancora abbastanza bravo nella programmazione...
    nella listbox carico i dati in questo modo:

    Public Function carica_volumi() 'CARICO LA LISTA CON GLI ID DEL DATABASE
    If rs.RecordCount = 0 Then
    schermata_volumi.lst_Volumi.Clear
    errormsg = MsgBox("Nessun documento caricato", vbCritical, "Attenzione!")
    Exit Function
    End If
    rs.MoveLast
    rs.MoveFirst
    max = rs.RecordCount
    rs.MoveFirst
    schermata_volumi.lst_Volumi.Clear
    For I = 1 To max
    schermata_volumi.lst_Volumi.AddItem rs("id")
    rs.MoveNext
    Next I
    End Function
  • Manca la parte di codice con cui ottieni il recordset rs
  • Option Explicit
    Public DB As Database
    Public rstInfo As Recordset
    Public rs As Recordset
    Public max As Long
    Public I As Long
    Public errormsg
    Public dbadd As Boolean
    Public dbedit As Boolean
    Dim Stringa As String

    Public Function ApriDB() 'LEGGO IL DATABASE
    Set DB = OpenDatabase(App.Path & "\libri.mdb", False, False, "; pwd=gianni24")
    Set rs = DB.OpenRecordset("Info", dbOpenTable)
    End Function
  • Non devi ottenere la tabella (con dbOpenTable) ma devi usare una SELECT

    OpenRecordset("SELECT * FROM Info ORDER BY Dato")

    mettendo al posto di Dato il nome del campo numerico con cui vuoi ordinare.
  • Si così va, soltanto che numera in ordine 1, 10, 100 invece di 1, 2 , 3, 4, 5, 6, 7, 8, 9, 10, 11, ...
  • Ma il campo che contiene il dato nel tuo db è numerico o testo?
  • TESTO
  • Sbagliato. Se sono numeri deve essere numerico.
  • Hai perfettamente ragione, ma quando selezione il numero id dalla listbox se è numerico mi da errore:

    Public Function seleziona_documento() 'DALLA LISTA CARICO I DATI NELLE TEXTBOX
    Set rs = DB.OpenRecordset("Select * from Info where id = '" & Trim(schermata_volumi.lst_Volumi.List(schermata_volumi.lst_Volumi.ListIndex)) & "'")
    rs.MoveFirst
    schermata_volumi.txt_id = rs("id")
    schermata_volumi.txt_autore = rs("autore")
    schermata_volumi.txt_titoloedizione = rs("titoloedizione")
    schermata_volumi.txt_testo = rs("testo")
    End Function
  • Di quale errore parli? Questo che c'entra con quello che hai chiesto fino ad ora?

    Ripeto ... il campo deve essere numerico.
  • Oregon è vero quello che dici, ma cliccando sui numeri dentro la listbox (inserito come campo numerico anzicché testo) mi da errore nel caricare gli altri campi del database nei textbox.
Devi accedere o registrarti per scrivere nel forum
21 risposte