Ordinamento veloce elementi listbox VB6

di il
21 risposte

Ordinamento veloce elementi listbox VB6

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

  • Re: Ordinamento veloce elementi listbox VB6

    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.
  • Re: Ordinamento veloce elementi listbox VB6

    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?
  • Re: Ordinamento veloce elementi listbox VB6

    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
  • Re: Ordinamento veloce elementi listbox VB6

    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
  • Re: Ordinamento veloce elementi listbox VB6

    Manca la parte di codice con cui ottieni il recordset rs
  • Re: Ordinamento veloce elementi listbox VB6

    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
  • Re: Ordinamento veloce elementi listbox VB6

    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.
  • Re: Ordinamento veloce elementi listbox VB6

    Si così va, soltanto che numera in ordine 1, 10, 100 invece di 1, 2 , 3, 4, 5, 6, 7, 8, 9, 10, 11, ...
  • Re: Ordinamento veloce elementi listbox VB6

    Ma il campo che contiene il dato nel tuo db è numerico o testo?
  • Re: Ordinamento veloce elementi listbox VB6

    TESTO
  • Re: Ordinamento veloce elementi listbox VB6

    Sbagliato. Se sono numeri deve essere numerico.
  • Re: Ordinamento veloce elementi listbox VB6

    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
  • Re: Ordinamento veloce elementi listbox VB6

    Di quale errore parli? Questo che c'entra con quello che hai chiesto fino ad ora?

    Ripeto ... il campo deve essere numerico.
  • Re: Ordinamento veloce elementi listbox VB6

    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