Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   tcxtexedit o texbox como cuadro de texto en google (https://www.clubdelphi.com/foros/showthread.php?t=74720)

dalsim 07-07-2011 01:08:07

tcxtexedit o texbox como cuadro de texto en google
 
alguien sabe que codigo debe ser en un formulario de un progecto de delphi xe haga o emule como el cuadro de texto de busqueda del google que me vaya filtrando lo que hay en el smismo campo de la base de datos que correponde a ese cuadro de texto , algo como excell pones las primeras letras y automaticamente te pone lo que ya anteriormente esta grabado en la base de datos ,, como para ya no escribir mas y asi con los demas cuadros de textos y sus correpondientes textbox

radenf 07-07-2011 12:53:07

Con este código en el evento on Change del Edit1 puedes buscar por cualquier letra y te irá actualizando los resultados en el DbGrid1.

Código Delphi [-]
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.text:='select * from Tu Tabla where ucase (Tu campo) like ''%'+UpperCase(Edit1.Text)+'%''order by nombre';
Query1.Open;
Tu Tabla.Locate('Tu campo',Query1.FieldValues['Tu campo'],[]);
DBGrid1.Update;

Saludos y ojalá te sirva

dalsim 07-07-2011 17:16:14

gracias por el respuesta
 
pero mas bien quisiera saber si aparece en el cuadro de cuadro de texto y no el la dbgrid, algo como en google pones unapalabra y te pone algunas concordancias pero en el cuadro de texto, o como si fuera excell que ya has escrito la palabra en la misma columna y te va como completando pero en el cuadro de texto no en una grilla

radenf 08-07-2011 01:01:07

Lo siento dalsim, pero hasta ahí llegan mis conocimientos.
Salu2

newtron 08-07-2011 09:16:38

Hola.

No sé si entiendo exactamente lo que quieres pero podrías poner una caja de texto para escribir y exactamente debajo un combobox que irías rellenando con los datos filtrados con un select de la tabla según vaya escribiendo.

Saludos

dalsim 08-07-2011 17:30:35

agradesco las respuestas
 
las respuestas vere la opcion de que me comentas poner un componente abajo del cuadro de texto

Caro 08-07-2011 18:42:31

Hola dalsim, yo también lo haría de la forma que te ha indicado Newtron, solo que en ves de utilizar un ComboBox utilizaría un DBLookupListBox, enlazado a la consulta que te ha puesto radenf y este DBLookupListBox lo mostrarias solo cuando se ha presionado alguna tecla en tu edit.

en el Onchage de tu Edit:

Código Delphi [-]
Query1.Close;
Query1.SQL.Clear;
Query1.SQL.text:='select * from Tu Tabla where ucase (Tu campo) like ''%'+UpperCase(Edit1.Text)+'%''order by nombre';
Query1.Open

para enlazar tu dataset al DBLookupListBox:

ListSource -> DataSource que apunta a tu query
ListField -> campo a mostrar
KeyField -> tu campo codigo

en el OnKeyPress de tu edit puedes hacer viible tu DBLookupListBox y en el OnExit lo haces invisible verificando que no sea el DBLookupListBox al que se pasado el foco. Y capturar las teclas fecha arriba (VK_UP) o abajo (VK_DOWN) en el evento OnKeyDown, para ir de uno a otro.

Saluditos

maeyanes 08-07-2011 20:14:06

Hola...

Si estás usando el component TcxTextEdit, puedes hacer uso de las propiedades ActiveProperties.LookupItems y ActiveProperties.IncrementalSearch junto con el evento OnKeyPress para hacer lo que quieres.

Yo hice algo parecido. Tendrías que hacer algo como:

Código Delphi [-]
type
  TMyForm = class(TForm)
    // Declaración de componentes y eventos
    procedure FormCreate(Sender: TObject);
    procedure cxTextEdit1OnKeyPress(Sender: TObject; var Key: Char);
  private
    FOldChar: Char;
  end;

implementation

procedure TMyForm.FormCreate(Sender: TObject);
begin
  FOldChar := #0
end;

procedure TMyForm.cxTextEdit1OnKeyPress(Sender: TObject; var Key: Char);
begin
  if (Key <> #8) and ((Text = '') or (Length(Text) = SelLength)) and
    (ToUpper(FOldChar) <> ToUpper(Key)) then
  begin
    FOldChar := Key;
    case ActiveProperties.CharCase of
      ecUpperCase:
        Key := ToUpper(Key);
      ecLowerCase:
        Key := ToLower(Key)
    end;
    { Aquí haces un query que busque todos los registros que empiecen con Key:
      select CampoAUsar from Tabla where CampoAUsar like Key || '%' order by CampoAUsar
      y llenas la propiedad ActiveProperties.LookupItems con el resultado de esa consulta:
    }
    ActiveProperties.LookupItems.Clear;
    while not DataSet.Eof do
    begin
      ActiveProperties.LookupItems.Add(DataSet.FieldByName('CampoAUsar').AsString);
      Next
    end
  end
  else
    if (Key = #8) and (ToUpper(FOldChar) <> ToUpper(Text[1])) then
    begin
      FOldChar := Text[1];
      // Aquí haces lo mismo que arriba, buscas los registros que inicien por Key y llenas la lista:
      ActiveProperties.LookupItems.Clear;
      while not DataSet.Eof do
      begin
        ActiveProperties.LookupItems.Add(DataSet.FieldByName('CampoAUsar').AsString);
        Next
      end;
      FindSelection := True
    end
end;

Ahora, lo que estás haciendo ahí es buscar todos los registros que inician con la primera letra que tecleaste y los cargas dentro de la propiedad ActiveProperties.LookupItems, al tener la propiedad ActiveProperties.IncrementalSearch en True, el mismo componente se va a encargar de autocompletar el contenido mientras vas tecleando los demás caracteres.

La parte donde haces la consulta y llenas los valores lo puedes convertir en un procedimiento para que no dupliques código.

Este código no está probado, solo lo basé en un código que tengo pero implementado de otra forma, así que podría tener errores. La propiedad ActiveProperties no es published, así que no la vas a encontrar en el Explorador de Objetos de Delphi.

Espero te sirva.



Saludos...


La franja horaria es GMT +2. Ahora son las 18:02:27.

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