Newsgroup: it.comp.lang.visual-basic
Titolo: Mi serve un buon algoritmo di ricerca: consigli?

Devo implementare una ricerca su di una griglia.
Più che altro devo fare una cosa del genere: move(numRiga) e mi nuovo alla
riga che cerco.
Ho realizzato una sub ma è lentissima! Con 15000 righe il programma si
blocca.
Vi dico già che posso utilizzare solo i metodi MoveNext, MovePrevious,
MoveFirst, MoveLast (non quelli dei recordset!), che nella griglia in
questione sono MOOOOOLTOOOOO lenti!
Ecco quello che ho scritto io...
Public Sub Move(lngRow As Long)
    ' TROPPO LENTO! DA MIGLIORARE O CAMBIARE!
    Dim vntOldBookmark As Long
    If lngRow = GridName.Bookmark Then Exit Sub
    GridName.Visible = False
    vntOldBookmark = GridName.Bookmark
    If lngRow > GridName.Bookmark Then
        While Not GridName.EOF
            GridName.MoveNext
            If lngRow = GridName.Bookmark Then
                GridName.Visible = True
                Exit Sub
            End If
        Wend
    Else
        While Not GridName.BOF
            GridName.MovePrevious
            If lngRow = GridName.Bookmark Then
                GridName.Visible = True
                Exit Sub
            End If
        Wend
    End If
    ' Non ho trovato nulla!!! - Find nothing!!!
    GridName.Bookmark = vntOldBookmark
    GridName.Visible = True
End Sub

Ciao, Sebastiano
non si capisce molto bene cosa ricerchi nella griglia.
Alla Move passi un long, che sembra un numeroriga.
Quest'ultimo lo confronti con un Bookmark, che poi ti
salvi in una variabile Variant (?) vntOldBookmark.
Un algoritmo di ricerca ci sarebbe, ma devi essere
più chiaro.
Attendo maggiori informazioni !
Ciao, Vito
-- 
Posted from 
smtp2.libero.it
 [193.70.192.52] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 piů chiaro.
Spero di essere stato abbastanza chiaro!!!

Scusa Seb,
non utilizzo mai DBGrid, ma sempre MSFlex o MSHFlex. Mi risulta, però, che
la Apex True DBGrid sia
proprio la DBGrid Standard di VB. Dovrebbe quindi avere le proprietà
DBGrid1.Row e   DBGrid1.Col.
Settando DBGrid1.Row = NumeroDiRiga dovrebbe funzionare. Lo so che è troppo
semplice, anche io mi
chiedo perchè la DBGrid (True o False che sia, scusa la battuta) non
possieda queste proprietà.
Fammi sapere
Ciao, Vito
-- 
Posted from 
smtp4.libero.it
 [193.70.192.54] 


 ha scritto nel messaggio
news:001101c05eda$44379a30$1c00...@spico.it...


 End Sub
In questo modo ti risparmi due test per ogni ciclo e l'accesso alle
proprietà dell'oggetto sempre in ogni ciclo. Ancora megli se metti tutti i
riferimenti alla grigli all'interno di un blocco with ... end with.
Insomma il succo è che devi per forza scorrerlo tutto ma nel farlo devi
cercare di fare meno operazioni possibili in ogni ciclo (comprese le letture
di proprietà che con il with ... end with diventano molto più veloci).
Inoltre se disponi delle informazioni relative al numero di righe puoi
ulteriormente ottimizzare il codice testando se la distanza  riga
richiesta - riga attuale è maggiore o minore della distanza riga richiesta -
prima riga (o ultima a seconda dei casi) e nel caso usare prima un metodo
MoveFirst (o MoveLast) e poi il ciclo iterativo.
Non conoscendo la griglia in questione non posso darti altri consiglio.
Ciao, Rick.
PS:
Per chi fosse interessato il costo di questo algoritmo in notazione O grande
sarebbe pari a O(n). Un po' di teoria ogni tanti fa bene.

Ciao, Seb
Ho scaricato True DBGrid 7.0 della Apex, e francamente non mi sembra ai
livelli della VSFlex Grid
(la sorella maggiore e maggiorata ..in tutti i sensi della MSFlex ). Ho
comunque trovato quello che
chiedi. Nella move devi solo inserire queste DUE istruzioni :
    TDBGrid1.MoveFirst
    TDBGrid1.MoveRelative lngRow  - 1
L'ho provato con il db NorthWind e funziona a meraviglia.
Ciao, Vito
.
-- 
Posted from 
smtp1.libero.it
 [193.70.192.51] 
