PDA

Ver la Versión Completa : Autocompletado en un Edit


david_uh
29-06-2007, 01:13:15
estoy haciendo que mientras escribo en un edit en la lista se muestre el elemento que coincida con lo escrito en el edit, ejem:
http://www.geocities.com/david_uh/problema/lista.JPG
el codigo de busqueda es esta funcion que da -1 si no encuentra lo que busca asi de esta manera la lista se deselecciona

function buscar (Var lista: TListBox ; cad: String; i,s: Integer): Integer;
var a: Integer;
begin
a := LENGTH(cad);
if CompareText(copy(lista.Items[i],1,a),cad) = 0 then
Result := i
else
if CompareText(copy(lista.Items[s],1,a),cad) = 0 then
Result := s
else
if (i=s) or (i=s-1) then
Result := -1
else
if CompareText(copy(lista.Items[(i+s) div 2],1,a),cad)>0 then
Result := buscar(lista,cad,i,(i+s) div 2)
else
Result := buscar(lista,cad,(i+s) div 2,s);

end;

pero la hacer la busquda encuentra la primera palabra ejem
Jose
y me aparacen todos lo que su nombre empieza con jose bien hasta ahi
pero en la lista existe digamos jose amanqui al dijitar la 'a' ya no encuentra nada

Estare agradecido por cualquier aporte

reevil
29-06-2007, 01:57:52
no seria mas facil utilizar un combobox?
ese componente ya tiene esa opcion, solo tienes que poner en true la propiedad auocomplete

droguerman
29-06-2007, 02:15:11
gracias reevil me diste la idea!!!!:


procedure TForm1.Edit1Change(Sender: TObject);
var
i : integer;
begin
listbox1.itemIndex := -1;
for i:= 1 to length(edit1.text) do
SendMessage(listbox1.Handle, WM_CHAR, integer(edit1.text[i]), 0);
if (listbox1.itemIndex>=0) and (pos(lowercase(edit1.text), lowercase(listbox1.items[listbox1.itemIndex]))<>1) then
listbox1.itemIndex := -1;
end;

por cierto coincido con reevil, más sencillo usar un combo, la propiedad style tiene el valor de cssimple que puede dar la sensación de ser un edit.

saludos

david_uh
29-06-2007, 17:58:32
Bien "seria más fácil" pero el hecho no es ese sino el PORQUE no funciona el algoritmo como debiera esa era mi inquietud

gracias

droguerman
29-06-2007, 20:57:37
Bien "seria más fácil" pero el hecho no es ese sino el PORQUE no funciona el algoritmo como debiera esa era mi inquietud

gracias

no lo he probado pero debe ser cosa del compareText, porque no intentas comparar las mismas cadenas pero quitando los espacios en blanco con el stringReplace

david_uh
29-06-2007, 21:03:37
si bien gracias, el algoritmo esta bien lo que sucedia es que al momento de comparar jose con josé daba que josé es mayo lo cual distorsionaba la búsqueda binaria, además lo que tambien distorsiona la búsqueda es el espacio en blanco demas, por ejemplo
"jose lopez" es menor que "jose lopez", -entre jose y lopez existen dos espacios en blanco:eek: - lo cual tambien distorsiona la búsqueda.

Muchas gracias por sus aportes