Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Autocompletado en un Edit (https://www.clubdelphi.com/foros/showthread.php?t=45326)

david_uh 29-06-2007 01:13:15

Autocompletado en un Edit
 
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

Código Delphi [-]
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!!!!:

Código Delphi [-]
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

Cita:

Empezado por david_uh
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


La franja horaria es GMT +2. Ahora son las 22:07:24.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi