Ir al contenido


Foto

Limitar el número de caracteres de un campo en un dbgrid


  • Por favor identifícate para responder
9 respuestas en este tema

#1 Ayla

Ayla

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 98 mensajes

Escrito 27 abril 2012 - 03:59


Hola a todos!

Trabajo con delphi 7 y con Firebird.

Tengo un DBGrid donde visualizo, añado y modifico datos.  Tengo un campo cantidad (entero),  quiero limitar la longitud a 6 caracteres.  Lo tengo controlado con una excepción pero esta no es la manera que más me gusta  *-)

En el Onvalidate de campo cantidad tengo lo siguiente :



delphi
  1. procedure TfMantenimiento.IBLCANValidate(Sender: TField);
  2. begin
  3.   if Sender.AsFloat > 999999 then
  4.     Raise Exception.Create('La cantidad no puede ser mayor de 999.999');
  5. end;



No sé si se puede pero me gustaría que basicamente funcionara como undbedit al que en su propiedad le ponemos, por ejemplo, el MaxLength = 6 y ya no te deja digitar más de 6 carácteres.

¿Existe algúna manera de implementarlo para un dbgrid? o mejor me olvido y lo dejo tal cual  :(

Muchas gracias. Un saludo!
  • 0

#2 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.301 mensajes
  • LocationArgentina

Escrito 27 abril 2012 - 09:32

Hola Ayla,
Hace tiempo que no se te veía por aquí.

No se si habría posibilidad de llevar un MaxLength a un DBGrid, se podría quizá diseñar una clase que cuente con esta posibilidad o quizá ver si ya alguno de los DBGrids de terceros ya cuento con eso.

Quizá por ser un DBGrid y sabiendo que se escribe demasiado y está pensado para ir moviendose con mucha fluidez, yo en vez de arrojar la excepción para mostrar al usuario un cartelote dispondría un diseño menos "agresivo". ¿Porqué no por ejemplo que existe un panel de aviso y allí presentar el error? Si el usuario debe ingresar cada dos por tres y recibe en cada intento ese cartel, se espantaría y seria un poco incómodo.
Como extra, o añadido, alteraría el valor ingresado por el mayor número posible aceptado.

Saludos,
  • 0

#3 Sergio

Sergio

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.092 mensajes
  • LocationMurcia, España

Escrito 27 abril 2012 - 12:16

Yo probaría a crear una variable a nivel del form del tipo string, OldValue por ejemplo, luego almacenas el valor inicial del campo al entrar al editar el record, OnScroll del DataSet haces OldValue:= FloatToStr(MiCampo.AsFloat), y finalmente, en el evento OnKeyPress del TDBEdit del campo (el OnValidate no salta con cada pulsación de la tecla), si el valor nuevo excede tu límite, lo igualo al valor incial, y si no lo supera, actualizas el valor incial al nuevo para dejarlo preparado para la siguiente:



delphi
  1. procedure TfMantenimiento.MiDBEditOnKeyPress(Sender: TComponent);
  2. begin
  3.   if StrToFloat(DBEdit.Text) > 999999 then
  4.     DBEdit.Text:= OldValue
  5.   else
  6.     OldValue:= DBEdit.Text;
  7. end;



Lo escribo de memoria, igual toca cambiar algo para que funcione  *-)

...aunque pensándolo mejor, tú querías limitar por número de caracteres, no por un valor numérico:



delphi
  1. procedure TfMantenimiento.MiDBEditOnKeyPress(Sender: TComponent);
  2. begin
  3.   if Length(DBEdit.Text) > 6 then
  4.     DBEdit.Text:= OldValue
  5.   else
  6.     OldValue:= DBEdit.Text;
  7. end;


  • 0

#4 Wilson

Wilson

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.137 mensajes

Escrito 27 abril 2012 - 01:46

1. Agrega un DBEdit  a tu form y coloca su propiedad visible a false y su propiedad MaxLength a 6 o lo que desees. Además de enlazarlo con el DataSource y con el campo como corresponda. No importa el tamaño ni el lugar en donde lo pongas, pues este nunca se verá por fuera del DBGrid.

2. Intercepta el evento OnDrawColumnCell del DbGrid y coloca este código:



delphi
  1. procedure TForm1.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  2.   DataCol: Integer; Column: TColumn; State: TGridDrawState);
  3. begin
  4.   if (gdFocused in State) then
  5.   begin
  6.     if (Column.Field.FieldName = DBEdit1.DataField) then
  7.     with DBEdit1 do
  8.     begin
  9.       Left := Rect.Left + DBGrid1.Left + 2;
  10.       Top := Rect.Top + DBGrid1.Top + 2;
  11.       Width := Rect.Right - Rect.Left;
  12.       Height := Rect.Bottom - Rect.Top;
  13.       Visible := True;
  14.     end;
  15.   end
  16. end;



3. Intercepta el evento OnColExit del DbGrid y coloca esto:



delphi
  1. procedure TForm1.DBGrid1ColExit(Sender: TObject);
  2. begin
  3.   if DBGrid1.SelectedField.FieldName = DBEdit1.DataField then
  4.     DBEdit1.Visible := False
  5. end;



4. Intercepta el evento ONKeyPress del DBgrid y coloca este código, para que el dbEdit agarre dicho evento.



delphi
  1. procedure TForm1.DBGrid1KeyPress(Sender: TObject; var Key: Char);
  2. begin
  3.   if (key = Chr(9)) then Exit;
  4.   if (DBGrid1.SelectedField.FieldName = DBEdit1.DataField) then
  5.   begin
  6.     DBEdit1.SetFocus;
  7.     SendMessage(DBEdit1.Handle, WM_Char, word(Key), 0);
  8.   end
  9. end;



Espero te sirva.

Saludos

PD: Adjunto ejemplo, solo configura la ruta de la base de datos de Access.
  • 0

#5 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6.301 mensajes
  • LocationArgentina

Escrito 27 abril 2012 - 10:22

Y el ganador es Wilson  :cheesy:

Vaya no se me hubiera ocurrido la idea de meterle un BDEdit dentro de un DBGrid.

Saludos,
  • 0

#6 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 27 abril 2012 - 11:31

Y el ganador es Wilson  :cheesy:

Vaya no se me hubiera ocurrido la idea de meterle un BDEdit dentro de un DBGrid.

Saludos,


Es lo bueno de DA que siempre cuando a alguien ya no se le ocurren más ideas, llega otro alguien con una genialidad !!!  :grin:

Gracias amigo Wilson, es una idea que nos puede ayudar bastante a más de uno :cool:

Saludox !  :smiley:
  • 0

#7 Ayla

Ayla

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 98 mensajes

Escrito 30 abril 2012 - 01:38


Wow!!!! Wilson, no se me hubiera ocurrido hacer eso nunca, muchas gracias, creo que lo implementaré de ese modo.

Gracias también a Delphius y Sergio por sus respuestas.

Un saludo a todos.
  • 0

#8 cadetill

cadetill

    Advanced Member

  • Moderadores
  • PipPipPip
  • 994 mensajes
  • LocationEspaña

Escrito 02 mayo 2012 - 04:05

Buenas,

Ya que usas FB, yo voy a proponerte otra solución a nivel de base de datos y es crear una excepción a nivel de FB.

CREATE EXCEPTION BIG_ENTERITO 'No puede entrar números superiores a 999999';


Ahora sólo quedaría programar los triggers pertinentes (before insert y before update) de la tabla en cuestión y lanzar la excepción si el dato introducido es mayor al que queremos

CREATE OR ALTER trigger MiTrigger0 for MiTabla
active before insert or update position 0
AS
begin
  if (new.enterito > 999999) then
  exception big_enterito;
end


La única "pega" es que no se lanzará la excepción hasta el post del registro

Espero te sirva

Nos leemos

PD: la solución de Wilson me gusta más que ésta, era sólo para dar otra opción :)
  • 0

#9 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 02 mayo 2012 - 04:51

Hola.

¿ Habéis probado a poner el EditFormat del campo persistente a #####0 ?. El DbGrid tendría que utilizarlo (aunque no la he probado ya que siempre uso la QuantumGrid).

Saludos.
  • 0

#10 Ayla

Ayla

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 98 mensajes

Escrito 02 mayo 2012 - 05:00


Hola chicos,

Xavi me parece interesante tu solución pero lo que no quiero es precisamente que me salte una excepción ya sea a nivel de base de datos o de delphi. Aunque esto me ha dado ideas para cambiar otras cosas de mi aplicación  *-) gracias!!!

Marc en el EditFormat del campo persistente tengo ###, ##0 pero le da lo mismo, pasa olimpicamente  ;)

Así que me quedo con la solución de Wilson  (y)

Saludos!!
  • 0




IP.Board spam blocked by CleanTalk.