Foros Club Delphi

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

lucas05 23-11-2011 20:12:24

Busqueda incremental en un Edit
 
Hola estoy usando Delphi 7 y MySQL. Quería saber como hacer una búsqueda incremental, como la de los buscadores de Internet. Mi intención es que mientras escriba dentro de un Edit, abajo de este aparezcan las distintas opciones, luego presionar Enter y que la opción elegida pase a una grilla.

Muchas Gracias.

microbiano 23-11-2011 21:14:46

en la parte inferior de este hilo tiens muchos enlaces

ecfisa 23-11-2011 21:45:40

Hola.

Creo que vas a lograr un efecto similar a lo que buscas usando un TComboBox con su propiedad Style = csSimple:
Código Delphi [-]
...
implementation
CONST
  CBOX_HEIGHT = 21;

procedure TForm1.FormCreate(Sender: TObject);
begin
  with ComboBox1 do
  begin
    Style:= csSimple;
    CharCase:= ecUpperCase;
    Text:= '';
    Height:= CBOX_HEIGHT;
  end;
end;

procedure TForm1.ComboBox1Change(Sender: TObject);
begin
  with TComboBox(Sender) do
  begin
    if Text > '' then
    begin
      Query.Close;
      Query.SQL.Clear;
      Query.SQL.Add('SELECT CAMPO FROM TABLA');
      Query.SQL.Add('WHERE CAMPO LIKE UPPER(:VALOR)');
      Query.ParamByName('VALOR').AsString:= ComboBox1.Text+'%';
      Query.Open;
      while not Query.Eof do
      begin
        if Items.IndexOf(Query.FieldByName('CAMPO').AsString) = -1 then
          ComboBox1.Items.Add(Query.FieldByName('CAMPO').AsString);
        Query.Next;
      end;
      Height:= DropDownCount * CBOX_HEIGHT;
    end
    else
    begin
      Clear;
      Height:= CBOX_HEIGHT;
    end;
  end;
end;

Saludos.

lucas05 24-11-2011 03:00:56

Gracias ecfisa por la ayuda.

dekorone16 07-05-2012 20:46:06

Aque te refieres cuando pones VALOR ?????????

dekorone16 07-05-2012 21:25:40

Ya puede resolver, VALOR es una propiedad del combobox, otra pregunta, como puedo hacer para que al momento que encuentre un resultado y al darle click o enter se desaparezca la ventanita?????????????????

ecfisa 07-05-2012 21:32:20

Cita:

Empezado por dekorone16 (Mensaje 432009)
Aque te refieres cuando pones VALOR ?????????

Hola dekorone16.

VALOR es el nombre del parámetro que se le envia a la consulta SQL. Dentro de la consulta y para que pueda ser reconocido como parametro siempre debe ir precedido de dos puntos ( : ).

Por ejemplo si tomando en cuenta el código anterior hicieramos:
Código Delphi [-]
   ShowQuery.ParamByName('VALOR').AsString:= 'PER'+'%';
La consulta que se efectuaría sería:
Código SQL [-]
SELECT CAMPO FROM TABLA
WHERE CAMPO LIKE UPPER('PER%')
Mostrando aquellos campos que comienzan por PER y por haber usado la función UPPER también per, Per, pER, etc.

Saludos.

ecfisa 07-05-2012 21:45:36

Cita:

Empezado por dekorone16 (Mensaje 432023)
Ya puede resolver, VALOR es una propiedad del combobox, otra pregunta, como puedo hacer para que al momento que encuentre un resultado y al darle click o enter se desaparezca la ventanita?????????????????

Hola.

No entiendo bien... ¿ Donde haces el click y que es lo que deseas que desaparezca ?

Saludos.

dekorone16 07-05-2012 21:51:28

Hy
 
Por ejemplo:

Si escribo la letra "J" me aparecen todos los posibles resultados con la letra "J" como JUAN,JOSE,JULIAN, ahora si selecciono JOSE se pone el nombre en el TComboBox pero sigue apareciendo la lista de los resultados.

¿Como se elimina esa lista al momento de que hayas seleccionado un registro?

ecfisa 07-05-2012 22:06:56

Hola dekorone16.
Cita:

¿Como se elimina esa lista al momento de que hayas seleccionado un registro?

Código Delphi [-]
procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
  ComboBox1.Items.Clear;
end;

Saludos.

dekorone16 07-05-2012 22:19:30

Hola
 
Creo que no me eh explicado bien, cuando hace la búsqueda los resultados vienen dentro de un rectángulo, solo quiero que al seleccionar el registro que quiero se elimine o esconda el rectángulo !!

ecfisa 07-05-2012 22:23:26

Hola.

Si deseas que ademas de eliminarse los items también se repliegue el ComboBox, sería:
Código Delphi [-]
procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
  with Sender as TComboBox do
  begin
    Items.Clear;
    Height:= CBOX_HEIGHT;
  end;
end;

Saludos.

dekorone16 08-05-2012 00:05:41

Hola
 
No logro hacer que se repliegue cuando selecciono el registro que quiero, seguiré intentando, gracias !

ecfisa 08-05-2012 00:48:52

Hola.

El código que te puse hace lo que solicitaste. Es decir, al salir del ComboBox elimina los items, se repliega y deja en la propiedad Text del combo la seleccion o lo ingresado.

Lo que podría no ser el evento que desees considerar para determinar que un ítem a sido seleccionado. Pero basta con ejecutar el código en el evento que prefieras para obtener el comportamiento. Como por ejemplo en OnKeyPreess cuando se presione tecla Intro.

Otro punto a tener en cuenta es que usando LIKE pudiera ser que se acepte un valor que tenga una correspondencia parcial con el dato actualmente seleccionado.

Si no entiendo mál lo que estas buscando, probá utilizando un TDBLookupComboBox.


Saludos.

dekorone16 08-05-2012 18:36:33

Hola
 
Y el código que tienes en que evento va insertado ??????

ecfisa 08-05-2012 20:10:02

Cita:

Empezado por dekorone16 (Mensaje 432144)
Y el código que tienes en que evento va insertado ??????

Hola dekorone16.

Por ejemplo en el evento OnExit, como en el ejemplo del mensaje #12.

Saludos.

dekorone16 08-05-2012 20:17:38

Hola
 
tengo este codigo en el evento onChange y tambien lo eh probado en el onKeyPress, es el mismo que publicaste al principio solo que no encuentro el error para que al momento de seleccionar el registro que quiero se eliminen los demas items

Código:

with TComboBox(Sender) do
  begin
    if Text > '' then
    begin
      dm.q3.Close;
      dm.q3.SQL.Clear;
      dm.q3.SQL.Add('SELECT Nombre FROM rh_empleados');
      dm.q3.SQL.Add('WHERE Nombre LIKE UPPER(:Nombre)');
      dm.q3.ParamByName('Nombre').AsString:= ComboBox1.Text+'%';
      dm.q3.Open;
      while not dm.q3.Eof do
      begin
        if Items.IndexOf(dm.q3.FieldByName('Nombre').AsString) = -1 then
          ComboBox1.Items.Add(dm.q3.FieldByName('Nombre').AsString);
          dm.q3.Next;
      end;
          Height:= DropDownCount * CBOX_HEIGHT;
    end
    else
    begin
          Clear;
          Height:= CBOX_HEIGHT;
    end;
  end;


ecfisa 08-05-2012 21:47:44

Hola dekorone16.

Como ya te comente en el mensaje #14:
Cita:

Lo que podría no ser el evento que desees considerar para determinar que un ítem a sido seleccionado. Pero basta con ejecutar el código en el evento que prefieras para obtener el comportamiento. Como por ejemplo en OnKeyPreess cuando se presione tecla Intro.
Más concretamente, ¿ Cuando deseas que se considere que se ya se realizó la selección ?
  • ¿ Cuando se presionó Intro ?
  • ¿ Cuando se hizo doble click ?
  • ¿ Cuando abandona el componente ?
Entonces, todo pasa por poner el código que te indiqué en el evento que desees, eso ya es tu decisión.

Para ejemplificar voy a considerar que el usuario seleccionó un item en cualquiera de estos casos:
  1. Presionó la tecla Enter.
  2. Hizo doble click sobre la lista
  3. Salió del componente.

Código Delphi [-]
...
procedure LimpiarYPlegar(AComboBox: TComboBox);
begin
  // Código que limpia los items y pliega el combo
  with AComboBox do 
  begin
    Items.Clear;
    Height:= CBOX_HEIGHT
  end;
end;

procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
  if Key = #13 then  // Tecla Intro ?
    LimpiarYPlegar(TComboBox(Sender)) 
end;

procedure TForm1.ComboBox1DblClick(Sender: TObject);
begin
  LimpiarYPlegar(TComboBox(Sender))
end;

procedure TForm1.ComboBox1Exit(Sender: TObject);
begin
   LimpiarYPlegar(TComboBox(Sender))
end;
Como es llamado desde tres eventos, para evitar redundancia puse el código dentro de un procedimiento, pero como verás es la misma porción de código de que he estado hablando.

En cualquier caso, encontrarás el valor seleccionado en la propiedad Text del TComboBox o cadena vacía si ninguno fué seleccionado.

Saludos.

dekorone16 08-05-2012 22:21:21

Hola
 
Muchísimas gracias con ese procedimiento ya quedo, gracias y perdón por la insistencia !!!!


La franja horaria es GMT +2. Ahora son las 06:14:06.

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