Hola:
Esa comprobación la puedes hacer a nivel del Dataset, en el evento BeforePost, de esta manera retrasas la comprobación al momento en que el usuario decide grabar el registro. Esto es cuestión de gustos, de gustos del usuario
, puesto que quizás esté metiendo datos en tentativa y le moleste que no le deje pasar de un campo determinado. El hacerlo desde el Grid implica interceptar el evento OnColExit (cuando se sale de la columna) y ahí hacer las comprobaciones. De todas formas, ten en cuenta que esta restricción afectará al Grid siempre, aunque el usuario esté solamente navegando por él, pudiendo resultar a veces molesto.
Código:
procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
with DBGrid1 do
if (SelectedField <> nil) AND (SelectedField.FieldName='Cantidad') AND
(SelectedField.IsNull) AND (SelectedField.DataSet.State = dsInsert) then
Abort;
end;
Comprobamos que el campo sea el que buscamos (FieldName) y que no sea null, y que realmente estamos insertando un nuevo registro (dsInsert). Había pensado en comprobar también que el DataSet estuviera en modo Edición (
AND (SelectedField.DataSet.State in [dsInsert, dsEdit])), pero no se obtiene el efecto deseado puesto que cuando el usuario navega por el DBGrid, éste no se pone en Edición salvo que escribamos algo, pero si pasamos de largo sin teclear ni se entera.
De todas formas, ten en cuenta que la comporbación de que el campo no sea null deberá ir igualmente a nivel de tabla, puedes poner
Required al campo en cuestión, para que en ningún caso se quede a null. Si lo haces así, el código anterior podría quedar así:
Código:
procedure TForm1.DBGrid1ColExit(Sender: TObject);
begin
with DBGrid1 do
if (SelectedField <> nil) AND (SelectedField.Required) AND
(SelectedField.IsNull) AND (SelectedField.DataSet.State = dsInsert) then
Abort;
end;