Buen día, estoy desarrollando un sistema donde utilizo un TSDMBGrid (Una versión mas completa del TDBGrid creada por Scalabium). En dicho Grid utilizo como Dataset un ClientDataSet y muestro las columnas "Cantidad", "Código", "Descripción" y "Precio". Las únicas columnas editables son Cantidad y Código. El usuario escribe la cantidad y el código y el sistema trae desde una tabla en una base de datos SQL Server el artículo y precio correspondiente.
Cuando ingresa la cantidad y presiona Enter, el foco pasa a la columna Código y cuando presiona Enter en dicha columna, después de traer los datos, pasa a la próxima fila para continuar la carga. Todo esto funciona a la perfección usando un ApplicationEvents, que cuando se presiona Enter, coloco el MSG.wParam el valor VK_Tab y el DBGrid se encarga de mover el foco al próximo campo editable o próxima fila. El detalle del evento OnMessage del ApplicationEvents es:
Código Delphi
[-]
If (ACTIVECONTROL = GRILLA_FACTURA) then begin
if ((GetAsyncKeyState(VK_RETURN) = -32767) AND GRILLA_FACTURA.EditorMode) THEN BEGIN
CONTROL.Post;
if GRILLA_FACTURA.Columns[GRILLA_FACTURA.Col-1].FieldName = 'CANTIDAD' then CALCULAR ELSE
IF GRILLA_FACTURA.Columns[GRILLA_FACTURA.Col-1].FieldName = 'CODIGO' then BUSCAR_ARTICULOS;
MSG.wParam:= VK_Tab;
END
ELSE
if (MSG.wParam = VK_RETURN) THEN
MSG.wParam:= VK_Tab
END;
El problema radica cuando el usuario no sabe el código del producto a facturar y utiliza la búsqueda, la cual consiste en un panel que se muestra al presionar la tecla F8.
En ese panel hay otro TSDMBGrid para efectuar la búsqueda que se actualiza a medida que el usuario escribe en un Dbedit. Elije el producto presionando Enter sobre dicha grilla
y el código del articulo elegido lo escribo en la columna del Grid de la confección de la factura. Oculto el panel de búsqueda y paso el control al Grid de facturación
y le envío como si se hubiese presionado la tecla Return para que vaya el foco a la próxima fila entrando en esta opción del evento:
Código Delphi
[-]
if (MSG.wParam = VK_Return) THEN
MSG.wParam:=VK_Tab;
ingresa allí, pero no hace nada, el foco queda sobre la columna Código. Es como si no le hiciera caso al Tab. Entonces me pregunto, si en el ApplicationEvents, el cambio en
el MSG.wParam, tiene efecto solo sobre el componente que lo llamó originalmente a pesar que se cambie el activecontrol al otro DBGrid como muestro en el procedimiento completo:
Código Delphi
[-]procedure TForm1.EVENTOSMessage(var Msg: tagMSG; var Handled: Boolean);
begin
If (ACTIVECONTROL = GRILLA_FACTURA) then begin
if ((GetAsyncKeyState(VK_RETURN) = -32767) AND GRILLA_FACTURA.EditorMode) THEN BEGIN
CONTROL.Post;
if GRILLA_FACTURA.Columns[GRILLA_FACTURA.Col-1].FieldName = 'CANTIDAD' then CALCULAR ELSE
IF GRILLA_FACTURA.Columns[GRILLA_FACTURA.Col-1].FieldName = 'CODIGO' then BUSCAR_ARTICULOS;
MSG.wParam:= VK_Tab;
END
ELSE
if (MSG.wParam = VK_RETURN) THEN
MSG.wParam:= VK_Tab END
ELSE
BEGIN
if (ACTIVECONTROL = GRILLA_ARTICULOS) AND ((GetAsyncKeyState(VK_RETURN) = -32767)) then BEGIN
PANEL_ARTICULOS.Hide;
PANEL_DETALLE.Enabled:=True;
CONTROL.Edit; CONTROL['CODIGO']:=AUXILIAR['CODIGO_LISTA']; CONTROL.Post;
BUSCAR_ARTICULOS;
ACTIVECONTROL:=GRILLA_FACTURA;
PostMessage(GRILLA_FACTURA.Handle, WM_CHAR, VK_RETURN, 0);
END;
END;
end;
Si alguien sabe el porque de este particular inconveniente, agradecería mucho la ayuda.
Saludos