Sincronizza Indice |
Scarica il progetto |
Testo dell'articolo |
Stampa l'articolo |
Ho un ListBox con molte righe, e dovrei cercare tra tutte queste righe
una stringa particolare... La soluzione al problema è alquanto semplice e richiede l'invio di un semplice messaggio API alla ListBox da cui ricercare i dati. Mediante un primo messaggio è possibile ricercare il testo esatto richiesto, mentre con un altro messaggio è anche possibile ricercare la prima occorrenza che inizia con il testo specificato. Abbiamo un semplicissimo form contenente fondamentalmente una ListBox di nome lstElenco contenente i dati, una TextBox di nome txtCerca in cui inserire il testo da ricercare, un CommandButton di nome cmdCerca per effettuare la ricerca esatta ed una CheckBox di nome chkCercaAuto per determinare se cercare automaticamente il testo che inizia con la stringa specificata.
Prima di poter vedere il corretto funzionamento è necessario dichiarare la funzione e le costanti API:
La funzione SendMessage dichiarata alla riga 3 è utilizzata in parecchi articoli per inviare un messaggio ad una finestra di cui si conosce l'handle. I messaggi da inviare saranno specificati alle due righe successive: LB_FINDSTRING recupera l'indice dell'elemento della ListBox il cui testo iniziare per il valore specificato; analogamente LB_FINDSTRINGEXACT restituisce l'indice dell'elemento della ListBox il cui testo corrisponde esattamente al testo ricercato. La ricerca non fa differenza tra maiuscole e minuscole!
Al caricamento del form la ListBox viene popolata con 20000 stringhe generate casualmente sia in contenuto che in lunghezza mediante due cicli For alle righe 13-19.
Il click sopra il pulsante cmdCercaEsatto richiamerà la funzione SendMessage con il messaggio LB_FINDSTRINGEXACT per ricercare la stringa specificata; l'argomento wParam della funzione assumerà la posizione dalla quale iniziare la ricerca. Il valore -1 specifica di iniziare la ricerca dall'inizio. L'argomento lParam riceverà invece il puntatore della stringa da ricercare. Il valore restituito dalla funzione identifica l'elemento della ListBox contenente il testo desiderato.
In maniera analoga alla routine precedente abbiamo deciso che in base al valore della CheckBox chkCercaAuto (righe 27-29) durante la digitazione verrà automaticamente ricercato il primo elemento somigliante alla stringa specificata. La ricerca è fatta come la precedente, ad eccezione del messaggio utilizzato che sarà invece LB_FINDSTRING.
La dimostrazione del progetto è davvero molto semplice: all'avvio del form la ListBox è popolata con 20000 elementi casuali; basterà digitare qualcosa nella casella di testo in basso e premere il pulsante Cerca per recuperare la riga corrispondente esattamente al testo specificato. Selezionando invece la CheckBox in basso, la ricerca dell'elemento sarà effettuata durante la digitazione del testo da ricercare. Come già detto, però, la ricerca non fa distinzione tra
maiuscole e minuscole, per cui non può sempre essere utilizzata
come soluzione definitiva ad una ricerca dati. |
Un progetto molto semplice la cui soluzione richiede giusto poche righe di codice per guadagnare tanta velocità nella ricerca degli elementi necessari. Nessun particolare rischio è rilevato dall'uso di questa soluzione. La stessa soluzione può essere utilizzata per ricercare un elemento da un controllo ComboBox; basterà utilizzare le corrispondenti costanti API CB_FINDSTRING e CB_FINDSTRINGEXACT. Fibia
FBI
|
Torna all'introduzione delle Richieste dei lettori |