Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   OOP (https://www.clubdelphi.com/foros/forumdisplay.php?f=5)
-   -   Limitar caracteres en un dbgrid (https://www.clubdelphi.com/foros/showthread.php?t=88919)

heiverp 26-08-2015 23:30:47

Limitar caracteres en un dbgrid
 
Buenas Tardes

Tengo un leve problema con un dbgrid y es que tengo una columna llamada edad en la cual al ingresar datos se debe validar que solamente se puedan digitar 2 caracteres, si se intentan digitar mas no lo permita,

alguien tiene idea de como hacerlo, me he matado buscando, parecía ser fácil pero no
:mad:

ecfisa 26-08-2015 23:57:41

Hola heiverp, bienvenido a Club Delphi :)

Y como es costumbre cuando ingresan por primera vez, te invitamos a que leas nuestra guía de estilo.

Si es de tipo caracter, crea los campos persistentes en tu DataSet (*) y luego agrega este código al evento OnCreate del formulario en que reside el DBGrid:
Código Delphi [-]
procedure TForm.FormCreate(Sender: TObject);
var
  ds: TDataSet;
begin
  ds := DBGrid1.DataSource.DataSet;
  ds.Close;
  ds.FieldByName('EDAD').Size := 2; // (EDAD : nombre de columna que corresponda en la tabla)
  ds.Open;
end;
(*)
  • Click derecho sobre el componente DataSet -> Fields Editor...
  • Click derecho sobre la ventana emergente -> Add all fields.
Nota: También puedes hacerlo desde el Object Inspector, sobre el campo persistente en tiempo de diseño sin necesidad de código.

Saludos :)

AgustinOrtu 27-08-2015 00:13:37

Daniel,

Porque es necesario que sean persistentes los campos para la primera solucion?

ecfisa 27-08-2015 00:20:22

Hola de nuevo.

Recordaba haber tratado caso similar, pero no podía encontrarlo... Aquí tenes otra forma de limitar los caracteres: escribiendo en dbgrid

Saludos :)

AgustinOrtu 27-08-2015 00:32:45

Muy interesante, acabo de probarlo y se llega a un callejon sin salida:

Código Delphi [-]
  ds.Open;
  ds.FieldByName('algo').Size := 10; // --> can't do that on an opened dataset

  ds.Close;
  ds.FieldByName('algo') // --> can't do that on a closed dataset

ecfisa 27-08-2015 00:51:08

Hola Agustín.

Es realmente extraño... ¿ Creaste previamente los campos persistentes ?

Ejemplo sobre dbdemos:
Código Delphi [-]
procedure TForm1.FormCreate(Sender: TObject);
var
  ds: TDataSet;
begin
  ds := DBGrid1.DataSource.DataSet;
  ds.Close;
  ds.FieldByName('Name').Size := 2;
  ds.Open;
end;

Resultado:


Saludos :)

AgustinOrtu 27-08-2015 01:23:35

No, justamente queria probar eso mismo: Si era posible hacerlo sin declarar campos persistentes. Por lo general trabajo sin campos persistentes y a nivel del TDataSet directamente. El diseñador RAD me gusta usarlo solo para la parte de colocar los controles, los aligns.. y poco mas

Tengo por costumbre hacer todo el trabajo de datos via codigo, usando clases (y mas recientemente, interfaces) que hacen todo el trabajo sucio. Lo hago de esta manera porque en un solo pantallazo tengo centralizado todas las cuestiones de formato, validaciones, nombres, mascaras.. etc. Sino ir de un lado para otro entre vista de form, vista de codigo, me termino perdiendo.

saludos!

ecfisa 27-08-2015 01:27:55

Hola Agustín.
Cita:

Empezado por AgustinOrtu (Mensaje 495879)
Daniel,

Porque es necesario que sean persistentes los campos para la primera solucion?

Recién veo este mensaje :o, disculpas.

Creo que el motivo es que para modificar la propiedad Size, el TDataSet debe estar cerrado y en ese punto el método FieldByName no tiene conocimiento de los campos de la tabla, si previamente no fueron creados de forma persistente.

Saludos :)

heiverp 27-08-2015 15:37:50

Hola Ecfisa

Agradezco tu ayuda, pero resulta que el campo no es tipo carácter, es un campo numérico por lo tanto no tiene la propiedad size.

AgustinOrtu 27-08-2015 15:39:44

Valida en el OnBeforePost del DataSet

ecfisa 27-08-2015 18:09:53

Hola heiverp
Cita:

Empezado por heiverp (Mensaje 495917)
Hola Ecfisa

Agradezco tu ayuda, pero resulta que el campo no es tipo carácter, es un campo numérico por lo tanto no tiene la propiedad size.

En el mensaje #4 te sugerí otro modo que funciona independientemente del tipo del campo.

Saludos :)

heiverp 27-08-2015 18:25:39

Muchas gracias
efectivamente de ese modo que me comentas se limito en el evento keypress
Me has salvado la vida

Emmm soy nuevo acá como hago para puntuar tu respuesta y para dar tema como resuelto

Casimiro Notevi 27-08-2015 18:45:31

Cita:

Empezado por heiverp (Mensaje 495930)
Emmm soy nuevo acá como hago para puntuar tu respuesta y para dar tema como resuelto

En unas semanas podrás hacerlo, estamos preparando una remodelación de los foros, gracias ^\||/


La franja horaria es GMT +2. Ahora son las 09:15:08.

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