Newsgroup: it.comp.lang.delphi
Titolo: RICERCA ...ListBox

Salve a tutti...
Scusate, qualcuno sa come ricercare in modo efficiente una stringa in
una ListBox ?

Ciao, prova questo:
Metti un Button e un Edit:
procedure TForm1.Button1Click(Sender: TObject);
var
  search: string;
begin
  search := edit1.Text;
  if SendMessage(ListBox1.Handle, lb_selectstring, - 1, Longint(PChar(search))) <> LB_ERR then
    ShowMessage('Item selected: ' + IntToStr(ListBox1.ItemIndex));
end;
Buon Lavoro...!
Ciao!
-- 
Questo articolo e` stato inviato dal sito web 
http://www.nonsolonews.it

una ListBox ?
Dipende che intendi per "efficiente".
La proprietà Items è una TStrings quindi possiede il metodo IndexOf().

 una ListBox ?
Per curiosità: stai cercando di implementare un filtro
dinamico tipo i nomi dei newsgroups?
Andrea

 dinamico tipo i nomi dei newsgroups?
Niente di tutto questo, devo fare un confronto tra due listbox con
combinazioni del tipo nxm.
Non so se portarne il contenuto su due array e operare su di essi
oppure basarmi sul componente le cui performance non conosco.
Grazie ad Andrea per l'indicazione indexof a cui non avevo pensato e a
Ghiri.
Ho cercato on-line e ho visto che si parla di ricerca dicotomica, ne
sapete qualcosa ? O per meglio dire come funziona la indexof, credo
che Borland non faccia una ricerca sequanziale nella indexof...
// Ricerca Dicotomica
function cerca(oldmedio,primo,ultimo:integer;parola:string):integer;
var medio, fl : integer;
begin
medio := (primo+ultimo) div 2;
if(medio<>oldmedio)and(copy(lista.items[medio],
1,length(parola))<>parola)
then begin
if(parola>lista.items[medio]) then
medio:=cerca(medio,medio,ultimo,parola)
   else if(parola<lista.items[medio]) then
medio:=cerca(medio,primo,medio,parola);
   end; cerca := medio;
end;
begin
  c1 := cerca(0,0,lista.items.count-1,'StrigaDaCercare');
  if(c1>=0) then Lista.itemindex := c1;
Ciao e saluti.

 che Borland non faccia una ricerca sequanziale nella indexof...
Il discorso cambia molto se si parla di due liste ordinate oppure no...
La ricerca dicotomica, a quanto ne so (quindi posso sempre sparare 
carpiate), funziona solo su una lista ordinata. Se la lista non è 
ordinata, c'è poco da fare: o la si ordina prima e si usa una ricerca 
dicotomica (o meglio un Quicksort), oppure devi scorrerti tutta la lista 
finché non trovi il valore cercato.
-- 
Jax

 sapete qualcosa ?
Perché sia possibile una ricerca dicotomica, i dati devono essere ordinati.
E' una ricerca ricorsiva altamente efficiente, che tende a spezzare i dati
in sottogruppi le cui dimensioni descrescono in maniera esponenziale, però
presuppone un ordinamento a priori. Il metodo IndexOf() di TStrings non
lavora purtroppo in maniera dicotomica, anche se i dati sono ordinati.
E' possibile implementare per conto proprio (purtroppo, visto che la
libreria di Delphi è sprovvista a riguardo) delle strutture dati che
agevolino le ricerche, mantenendo bilanciato l'ordinamneto dei dati a mano
a mano che si riempiono.  Un caso tipico (utilizzato anche per la
costruzione degli indici dei database) è quello dei B-tree o dei Red-Black
tree.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Grazie a entrambi... A buon rendere spero presto !