Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Como validar el texto que se esté ingresando en la celda de una DBGRID (https://www.clubdelphi.com/foros/showthread.php?t=92074)

Soa Pelaez 15-07-2017 00:27:46

Capturar texto que se este ingresado en celda DBGrid
 
Buen día.

Tengo una cuestión, necesito capturar la entrada del texto en una celda de un dbgrid para validar el ingreso de 1 sola coma y dos decimales, pero al obtener el texto asi, no me refresca el valor cuando ingreso más comas o más números.

Código Delphi [-]
//Evento keypress de la dbgrid
var Texto: string;
  if DBGrid.SelectedField = CampoValidar then
    Texto:= DBGrid.Fields[3].Text//Capturo el texto de la columna 
    //Texto:= DBGGenerales.DataSource.DataSet.FieldByName('nnv_cantidad_novedad').AsString
   //Texto:= DBGGenerales.Fields[3].AsString

Si por primera vez ingreso 1 la variable Texto = '1', pero si ingreso comas o números la cantidad que sea la variable sigue valiendo 1.

Lo he intentado de varias formas pero no me funciona, no me toma el valor a medida que voy digitando, y lo necesito así a medida que el usuario vaya digitando para validar correctamente el contenido de la celda.


Espero puedan ayudarme.

Muchas gracias.

Soa Pelaez 17-07-2017 19:03:23

Como validar el texto que se esté ingresando en la celda de una DBGRID
 
Buen día.

Tengo una cuestión, necesito capturar la entrada del texto en una celda de un dbgrid para validar el ingreso de 1 sola coma y dos decimales, pero al obtener el texto asi, no me refresca el valor cuando ingreso más comas o más números.

Código Delphi [-]
//Evento keypress de la dbgrid
var Texto: string;
  if DBGrid.SelectedField = CampoValidar then
    Texto:= DBGrid.Fields[3].Text//Capturo el texto de la columna 
    //Texto:= DBGGenerales.DataSource.DataSet.FieldByName('nnv_cantidad_novedad').AsString
   //Texto:= DBGGenerales.Fields[3].AsString

Si ingreso comas o números, el valor de la variable sigue siendo ''.

Lo he intentado de varias formas pero no me funciona, no me toma el valor a medida que voy digitando, y lo necesito así a medida que el usuario vaya digitando para validar correctamente el contenido de la celda.


Espero puedan ayudarme.

Muchas gracias.

movorack 17-07-2017 19:25:46

Hola!,

y eso no se puede manejar en el evento OnValidate del campo.

Soa Pelaez 18-07-2017 00:14:12

Cita:

Empezado por movorack (Mensaje 519379)
Hola!,

y eso no se puede manejar en el evento OnValidate del campo.


Así no me sirve porque necesito validarlo a medida que vaya digitando y no después de que salga del campo.

Casimiro Notevi 18-07-2017 00:42:52

Pues en el onChange.

Soa Pelaez 18-07-2017 01:17:30

Cita:

Empezado por Casimiro Notevi (Mensaje 519393)
Pues en el onChange.

Lo intente ahí también pero no me refresca el valor de la variable sino hasta que salga de la celda de la DBGRID.

Caminante 18-07-2017 03:20:28

Hola

Pensandolo detenidamente no creo que puedas hacer lo que quieres desde un evento del DBGrid.
Cuando empiezas a editar una celda el dbgrid crea automaticamente un editor (por defecto un Edit, corriganme si me equivoco) y lo que tendrias que hacer es capturar su evento onkeypress.

He visto otros dbgrids que admiten personalizar el control a usar como editor en tal caso seria mas facil controlar lo que se teclea desde ahi.

Se que no es de mucha ayuda pero en este caso creo que mejor optaria por crear una ventana aparte para modificar el registro.

Saludos

_Leo 18-07-2017 12:10:46

Como bien dice Caminante, cuando se edita in situ un campo en el DBGrid, en realidad se está haciendo en un "TEdit" (TDBGridInplaceEdit) sobrepuesto, por lo que todavía no está el contenido que estamos editando en el DBGrid.

Se podría hacer capturando el evento OnKeyPress de ese Edit sobrepuesto, pero también podemos hacer algo más sencillo ya que las pulsaciones que van destinadas a ese control también pasan por el OnKeyPress del DBGrid. A ver si te sirve esta chapucilla como base:

Código Delphi [-]
procedure TForm1.DBGridKeyPress(Sender: TObject; var Key: Char);
var
  texto: String;
begin
  if (DBGrid.SelectedField.FieldName = 'CANTIDAD') then
  begin
    // Comprobamos que existe algún control "inplace" en el DBGrid
    if (DBGrid.ControlCount > 0) then
    begin
      // Obtenemos el texto del TDBGridInplaceEdit
      texto := TEdit(DBGrid.Controls[0]).Text;
      // ...
      // Como ejemplo, si ya existe una coma en "texto" no permitimos otra
      if (Key = ',') AND (Pos(',', texto) > 0) then Key := #0;
    end;
  end;
end;

Soa Pelaez 18-07-2017 16:17:53

Cita:

Empezado por _Leo (Mensaje 519408)
Como bien dice Caminante, cuando se edita in situ un campo en el DBGrid, en realidad se está haciendo en un "TEdit" (TDBGridInplaceEdit) sobrepuesto, por lo que todavía no está el contenido que estamos editando en el DBGrid.

Se podría hacer capturando el evento OnKeyPress de ese Edit sobrepuesto, pero también podemos hacer algo más sencillo ya que las pulsaciones que van destinadas a ese control también pasan por el OnKeyPress del DBGrid. A ver si te sirve esta chapucilla como base:

Código Delphi [-]
procedure TForm1.DBGridKeyPress(Sender: TObject; var Key: Char);
var
  texto: String;
begin
  if (DBGrid.SelectedField.FieldName = 'CANTIDAD') then
  begin
    // Comprobamos que existe algún control "inplace" en el DBGrid
    if (DBGrid.ControlCount > 0) then
    begin
      // Obtenemos el texto del TDBGridInplaceEdit
      texto := TEdit(DBGrid.Controls[0]).Text;
      // ...
      // Como ejemplo, si ya existe una coma en "texto" no permitimos otra
      if (Key = ',') AND (Pos(',', texto) > 0) then Key := #0;
    end;
  end;
end;

Lo he probado de esta manera y no funciona correctamente, me explico la primera vez digito 2 y la variable texto = '', luego de digitar 2 digito 1 osea 21, ahi si cuando entra a esta validación me aparece el 2, y si escribo otro número más ahi si me aparece el 1, y lo que necesito es que a medida que vaya digitando la variable texto valga lo mismo que escribí en la celda.

Es un buen indicio la manera en que lo planteas pero aún falta esa cosa y quedaría como lo necesito.

Muchas gracias.

movorack 18-07-2017 16:58:36

Cita:

Empezado por Soa Pelaez (Mensaje 519421)
lo que necesito es que a medida que vaya digitando la variable texto valga lo mismo que escribí en la celda... Es un buen indicio la manera en que lo planteas pero aún falta esa cosa y quedaría como lo necesito.

Eso es porque estás revisando el texto en el OnKeyPress. Antes de que al texto se le agregue el caracter que estás digitando.

Puedes sumar el caracter al texto actual y así obtener el texto completo.

Código Delphi [-]
procedure TForm3.DBGrid1KeyPress(Sender: TObject; var Key: Char);
  var
    lStTemp: String;
begin
  if (TDBGrid(Sender).SelectedField.FieldName = 'Field1')
    and (TDBGrid(Sender).ControlCount > 0)
    and (TDBGrid(Sender).Controls[0] is TInplaceEdit)
  then
  begin
    lStTemp := TEdit(TDBGrid(Sender).Controls[0]).Text + Key;

    ///Se procesa el texto para validar el formato.
    ///Insert your amazing code here
  end;
end;

o puedes manejarlo cuando ya el texto está completo en el OnKeyUp

Código Delphi [-]
procedure TForm3.DBGrid1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
  var
    lStTemp: String;
begin
  if (TDBGrid(Sender).SelectedField.FieldName = 'Field1')
    and (TDBGrid(Sender).ControlCount > 0)
    and (TDBGrid(Sender).Controls[0] is TInplaceEdit)
  then
  begin
    lStTemp := TEdit(TDBGrid(Sender).Controls[0]).Text;

    ///Se procesa el texto para validar el formato.
    ///Insert your amazing code here
  end;
end;

Soa Pelaez 18-07-2017 19:11:11

Cita:

Empezado por movorack (Mensaje 519426)
Eso es porque estás revisando el texto en el OnKeyPress. Antes de que al texto se le agregue el caracter que estás digitando.

Puedes sumar el caracter al texto actual y así obtener el texto completo.

Código Delphi [-]
procedure TForm3.DBGrid1KeyPress(Sender: TObject; var Key: Char);
  var
    lStTemp: String;
begin
  if (TDBGrid(Sender).SelectedField.FieldName = 'Field1')
    and (TDBGrid(Sender).ControlCount > 0)
    and (TDBGrid(Sender).Controls[0] is TInplaceEdit)
  then
  begin
    lStTemp := TEdit(TDBGrid(Sender).Controls[0]).Text + Key;

    ///Se procesa el texto para validar el formato.
    ///Insert your amazing code here
  end;
end;

o puedes manejarlo cuando ya el texto está completo en el OnKeyUp

Código Delphi [-]
procedure TForm3.DBGrid1KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
  var
    lStTemp: String;
begin
  if (TDBGrid(Sender).SelectedField.FieldName = 'Field1')
    and (TDBGrid(Sender).ControlCount > 0)
    and (TDBGrid(Sender).Controls[0] is TInplaceEdit)
  then
  begin
    lStTemp := TEdit(TDBGrid(Sender).Controls[0]).Text;

    ///Se procesa el texto para validar el formato.
    ///Insert your amazing code here
  end;
end;

De esta manera pude validarlo muchas gracias.:)


La franja horaria es GMT +2. Ahora son las 11:25:45.

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