Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Hacer que un TEdit se autocomplete... (https://www.clubdelphi.com/foros/showthread.php?t=72801)

verito_83mdq 12-03-2011 16:04:22

Hacer que un TEdit se autocomplete...
 
Saludos a todos!!, como andan?

Les paso a explicar lo que quiero hacer, en la parte de altas del sistema tengo que ingresar los datos donde vive el cliente, Provincia, Ciudad,Código Postal, Código de Área , mi idea es tratar de automatizar la carga de estos valores para ahorrar un poco de trabajo.

He conectado la tabla ciudad a un LookUpComboBox, se despliega y se elige la ciudad, al elegir la ciudad se pone solo la provincia el código de área y de teléfono.

El problema es que no me gusta mucho el LookUp, preferiría poner un Tedit con una consulta y a medida que voy escribiendo que me valla tirando las opciones incluso dentro del mismo TEdit, similar a los registros de las pagina web.

No se si me explique bien, estaría bueno que me den alguna opiniones de como lo trabajan ustedes o como lo harían.

Desde ya muchas por tomarse la molestia de leer. Saludos!!!;)

newtron 12-03-2011 17:51:12

Hola.

Si no recuerdo mal lo que se abre en las páginas web es un combobox o algo muy parecido. Ten en cuenta que si quieres que tu edit vaya rellenando de forma automática solo podrías ver una de las opciones en el mismo edit, o sea, solo verías una línea en vez de abrirse un combo con todas las opciones.

Yo cuando las opciones son pocas (sobre 10 como máximo) uso un combo, cuando son mas llamo a una función que me abre la tabla en un grid con funciones de búsqueda y me retorna el valor del registro seleccionado.

Espero que te sirva de algo este rollo.

Saludos

verito_83mdq 13-03-2011 02:02:39

Hola newtron!! Gracias por leer y tomarte la molestia de responder.

Claro yo ahora lo tengo con LookUpComboBox y la verdad que no me convence mucho, lo que se me ocurrió es un poner un edit y abajo que aparezca o que se despliegue una lista con las ciudades que tienen coincidencia. Acá subí una imagen en este link

http://www.mediafire.com/imageview.p...abodfb&thumb=4

Se podrá hacer algo así?

Saludos y Gracias a todos.!!:)

Caral 13-03-2011 02:47:25

Hola
Y cual es el problema?, no entiendo.
Poner un edit y que en el evento onchange se valla filtrando no le veo nada complicado.
Por eso digo: No entiendo???.
Saludos

verito_83mdq 13-03-2011 03:25:19

Hola Caral!! como andas!

Claro yo quiero hacer algo como la imagen que puse, lo que quiero es que a medida que escribo en el Tedit abajo me vayan apareciendo las opciones en forma de una lista desplegable para luego seleccionarla.

La duda seria en como trabajar esa lista? Tengo que utilizar un ListBox?

Código SQL [-]
  with QueryDataModule.CiudadZQuery do
                 begin
                     If active then close;
                     SQL.Clear;
                     Sql.Add('Select * from ciudad where ciudad.Ciudad like '''+CiudadEdit.Text+'%''');
                     Open;
                     Active:=True;
                 end;

Esa es la consulta del Tedit que tengo en el evento onchange, como hago para llenar la lista obteniendo los valores de esta consulta?

No se si ahora se entiende mejor o peor jaja. Si ven la imagen que puse ahí se van a dar cuenta de lo que quiero hacer.

Gracias Caral!!!;)

Caral 13-03-2011 03:46:16

Hola
Código Delphi [-]
   QueryDataModule.CiudadZQuery.Sql.Text:= 'Select * from ciudad where ciudad.Ciudad like '''+CiudadEdit.Text+'%''';
   QueryDataModule.CiudadZQuery.Open;
   While not QueryDataModule.CiudadZQuery.Eof do
   begin
   ListBox1.Items.Add(QueryDataModule.CiudadZQuery.Fields[0].Text);
   QueryDataModule.CiudadZQuery.Next;
   end;
   QueryDataModule.CiudadZQuery := False;
   end;
Fields[0] seria el primer campo de la tabla, se tiene que poner el campo correcto (0,1,2 etc....), o en tal caso el nombre con FileByName.
Saludos

verito_83mdq 13-03-2011 17:41:37

Caral gracias por ayudar!!!!

Probé el código que me pusiste, el problema es me llena toda la lista pero sin patrones. Osea en el Tedit pongo la letra B y en vez de ir apareciendo las ciudad a medida que escribo ya me pone ejemplo Bahia Blanca entre otras. Se entiende lo que quiero decir?

Lo que probé ahora es con un dbgrig, como menciono Newtron, funciona bien, lo que no se si es conveniente usar este método o sigo probando con la lista?


Gracias Caral por ayudar!!

Caral 13-03-2011 19:22:12

Hola
Para que vallan apareciendo se necesita filtrar, no se si zeos, en el query lo hace.
Es logico que salgan todas las coincidencias, es sql, no va filtrando, define y coloca todo.
No le veo inconveniente al dbgrid, en principio pense que era lo mejor, pero pediste un listbox.
Saludos

verito_83mdq 14-03-2011 02:41:59

Bueno Caral, estuve trabajando con esto y quedo bastante bien, toque todos los eventos para que el dbgrig simule ser una lista que se despliega.

Lo que estoy tratando de hacer es que, mientras escribo en el TEdit pueda ir recorriendo el dbgrid con las fechas del cursor ˇ ˆ sin necesidad de hacer click en el para tomar el foco. Se podrá??

Gracias por la paciencia!!!

newtron 14-03-2011 09:58:00

Pues si que se puede, yo lo tengo así. Yo en vez de un edit lo que realmente tengo es un label. Lo que tienes que hacer es capturar es el keydown del grid y si es una tecla de cursor no hacer nada y si es otra añadirla al caption del label.

Espero que te sirva.

Saludos

verito_83mdq 14-03-2011 13:56:56

Hola Newton, acá ya lo tengo medio cocinado, puedo subir y bajar sin salir del TEdit, lo que estoy tratando de hacer es dejarlo seleccionado con la tecla enter, y que se ponga solo en el Tedit.

Este es mi código:


Código Delphi [-]
procedure TAltasForm.CiudadEditKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin




             if Key = VK_DOWN then
                begin
                   QueryDataModule.CiudadZQuery.Next;
                   marca:=DBGrid1.DataSource.DataSet.GetBookmark;
                end;

             if Key = VK_UP then
                begin
                   QueryDataModule.CiudadZQuery.Prior;
                   marca:=DBGrid1.DataSource.DataSet.GetBookmark;
                end;
end;

procedure TAltasForm.CiudadEditKeyPress(Sender: TObject; var Key: Char);
begin


             DBGrid1.Visible:=True;
             DireccionLabel.Visible:=False;
             EmailLabel.Visible:=False;

             with QueryDataModule.CiudadZQuery do
                 begin
                     If active then close;
                     SQL.Clear;
                     Sql.Add('Select *  from ciudad where ciudad.Ciudad like '''+CiudadEdit.Text+'%'' and ciudad.ID_provincia=:pro');
                     ParamByName('pro').AsAnsiString:=ProvinciaDBLookupComboBox.KeyValue;
                     Open;
                     Active:=True;
                 end;

             if QueryDataModule.CiudadZQuery.IsEmpty then
               begin
                ShowMessage('No hay Resultados');
                DBGrid1.Visible:=False;
                CiudadEdit.Clear;
               end;




               If Key = #13 Then
               begin

                  DBGrid1.Visible:=False;
                  DBGrid1.DataSource.DataSet.GotoBookmark(marca);
                  CiudadEdit.Text:=QueryDataModule.CiudadZQuery.FieldByName('Ciudad').Text;
                  EmailLabel.Visible:=True;
               end;




end;


Como se ve hasta he tratado con los Bookmark pero nada.

Alguna sugerencia?? Desde ya muchas GRACIAS!!

verito_83mdq 14-03-2011 14:30:08

Acá lo tengo cocinado por ahora anda bien, puedo recorrer el dbgrid con el cursor sin necesidad de usar el mouse en ningún momento.
Con un poco de trabajo el dbgrid se convirtió en una lista desplegable muy cómoda.
Este es el código:
Código Delphi [-]
procedure TAltasForm.CiudadEditKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin




             if Key = VK_DOWN then
                begin
                   QueryDataModule.CiudadZQuery.Next;
                   idciu:=QueryDataModule.CiudadZQuery.FieldByName('Ciudad').Text;
                end;

             if Key = VK_UP then
                begin
                   QueryDataModule.CiudadZQuery.Prior;
                   idciu:=QueryDataModule.CiudadZQuery.FieldByName('Ciudad').Text;
                end;
end;

procedure TAltasForm.CiudadEditKeyPress(Sender: TObject; var Key: Char);
begin


             DBGrid1.Visible:=True;
             DireccionLabel.Visible:=False;
             EmailLabel.Visible:=False;

             with QueryDataModule.CiudadZQuery do
                 begin
                     If active then close;
                     SQL.Clear;
                     Sql.Add('Select *  from ciudad where ciudad.Ciudad like '''+CiudadEdit.Text+'%'' and ciudad.ID_provincia=:pro');
                     ParamByName('pro').AsAnsiString:=ProvinciaDBLookupComboBox.KeyValue;
                     Open;
                     Active:=True;
                 end;

             if QueryDataModule.CiudadZQuery.IsEmpty then
               begin
                ShowMessage('No hay Resultados');
                DBGrid1.Visible:=False;
                CiudadEdit.Clear;
               end;




               If Key = #13 Then
               begin
                  CiudadEdit.Text:=(''+idciu+'');
                  DBGrid1.Visible:=False;
                  EmailLabel.Visible:=True;
                  DireccionLabel.Visible:=True;
               end;




end;

Recién le encontré un problema, si uso las flechas me guardar la ciudad en la variable como corresponde, el drama es cuando selecciono la primera ciudad, osea cuando no uso las fechas y no me guarda la variable !!!

Me estoy complicando demasiado me parece.

Saludos!!

newtron 14-03-2011 17:53:32

.... y si cambias...

CiudadEdit.Text:=(''+idciu+'');

por....

CiudadEdit.Text:=QueryDataModule.CiudadZQuery.FieldByName('Ciudad').Text;

Caral 15-03-2011 02:01:08

Hola
Código Delphi [-]
 with QueryDataModule.CiudadZQuery do
                 begin
                     If active then close;
                     SQL.Clear;
                     Sql.Add('Select *  from ciudad where ciudad.ID_provincia = :Que');
                     ParamByName('Que').AsAnsiString:= ProvinciaDBLookupComboBox.KeyValue;
                     Open;
                     Active:=True;
                     Filter:= 'Ciudad Like '''+CiudadEdit.Text '*'''; 
                     Filtered:=  True;
                 end;
Saludos

verito_83mdq 15-03-2011 14:22:02

Caral y Newtron, les agradezco mucho toda la ayuda que me han dado, lo pude solucionar gracias a ustedes, por ahora anda bien no tira errores, así que seguiré con el proyecto.

Saludos y GRACIAS!!!:)

leandro085 20-04-2011 04:10:48

Consulta
 
he estando ravisando este hilo y me ayudo muchisimo

mi pregunta es la siguiente. como puedo hacer para que cuando presione las teclas de arriba y abajo del teclado no me mueva la posision del cursor en el edit1 pero que me permita moverme sobre el grid..

O sea lo que quiero es que si escribi San en el edit1 el cursor se mantenga en el final y no se mueva hacia adelante o atras segun precione las telcas de arriba y abajo del teclado pero al mismo tiempo me permita moverme sobre el grid.

espero que este suficientemente clara mi pregunta.

Gracias.

newtron 20-04-2011 09:28:19

Hola.

Si revisas el hilo verás que en una de mis respuestas comento que lo que realmente tengo no es un edit, es un label. Entonces lo único que tienes que hacer es tener el foco en el grid e ir capturando las pulsaciones del teclado para añadirselas al label y simular que estás escribiendo en él pero realmente el foco lo tienes en el grid.

Saludos

Rofocale 16-05-2011 02:35:08

Código Delphi [-]
ProvinciaDBLookupComboBox.KeyValue;..............????????
una pregunta porque sale dblookupcombobox.keyvalue no era que no queria un lookupcombobox y en vez de esto era un grid o aparte se le pasa datos a otro dblookupcombobox ? alguien me explica ya que esto me intereso para un proyecto que tengo

newtron 16-05-2011 09:25:23

Pues como no te expliques mejor... yo no te entiendo.

Rofocale 16-05-2011 17:59:19

hola he estado probando el codigo me funciona bien con las teclas para bajar en el grid y seleccionar el elemento que deseo pero al darle enter este no se rellena en el edit...
como se podria solucionar ?


La franja horaria es GMT +2. Ahora son las 03:57:03.

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