Hola compañeros, iré directo al grano.
Quiero hacer dentro de un DBGrid la validación de valores numéricos. En concreto al introducir una cantidad numérica en una celda que compruebe si el valor introducido es valido con respecto de un stock.
Si al introducir el valor pulso inmediatamente la tecla Intro, se ejecuta el OnKeyPress del DBGrid y en ese evento hago la validación
llegándole al método el valor introducido. Hasta aquí todo perfecto.
Como el usuario puede introducir la cantidad, pero en lugar de pulsar Intro, pulsar teclas de desplazamiento como Tab, Left, Right, Up o Down, dentro de los métodos que se ejecutan en estos eventos del DBGrid hago una simple llamada al método OnKeyPress para reutilizar el código que en él se contiene.
La pega es que el valor introducido al hacer las llamadas en los métodos del Grid OnKeyDown y OnKeyUp no contienen aún el valor introducido en la celda (al contrario del método OnKeyPress). Por ello al ejecutar el evento OnKeyPress desde la llamada en los eventos OnKeyDown y OnKeyUp, se recibe en este el valor anterior al introducido, por lo que la validación no se realiza con el valor deseado e introducido.
Por ejemplo: si en una celda del DBGrid tengo un valor 0, e introduzco el valor 23 y pulso Intro, entonces se ejecuta el OnkeyPress validando el valor 23. Por el contrario si en lugar de pulsar Intro pulso teclas de movimiento como Left o Right, se ejecuta el evento KeyDown llamando al KeyPress tal como se muestra en el siguiente código, pero el valor que se pasa no es el 23, si no el valor anterior en la celda, en este ejemplo 0.
El problema es que captura el código de escape y ejecuta el método, todo antes de capturar el valor.
Código Delphi
[-]procedure TForm.DBGridKeyPress(Sender: TObject; var Key: Char);
begin
if (Key=#13) then showmessage(DBGrid.fields[5].AsString);
end;
procedure TForm.DBGridKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
Tecla: Char;
begin
if ((Key = VK_DOWN) or (Key = VK_UP) or (Key = VK_LEFT) or (Key = VK_RIGHT)) and (DBGrid.SelectedIndex = 5) then
begin
Tecla := #13;
DBGridKeyPress(Sender, Tecla);
end;
end;
¿Como puedo validar el valor?
He buscado y buscado, pero no he hayado nada.
Gracias.