Ver Mensaje Individual
  #1  
Antiguo 17-11-2023
aromigaret aromigaret is offline
Miembro
 
Registrado: jun 2011
Posts: 68
Reputación: 13
aromigaret Va por buen camino
ApplicationEvents en un Dbgrid

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     // SI EL CONTROL LO TIENE LA GRILLA DE FACTURACION
  begin

    if ((GetAsyncKeyState(VK_RETURN) = -32767) AND GRILLA_FACTURA.EditorMode) THEN   // SI LA TECLA FUE PRESIONADA CON EL FOCO EN LA GRILLA Y ESTA EN MODO EDICION
    BEGIN

      CONTROL.Post; // POSTEO EL DATO CARGADO

      if GRILLA_FACTURA.Columns[GRILLA_FACTURA.Col-1].FieldName = 'CANTIDAD' then  CALCULAR  // CALCULO LOS TOTALES
      ELSE
        IF GRILLA_FACTURA.Columns[GRILLA_FACTURA.Col-1].FieldName = 'CODIGO' then BUSCAR_ARTICULOS;  // CARGO LOS DATOS DEL ARTICULO

      MSG.wParam:= VK_Tab; // CAMBIO LA TECLA PRESIONADA DE ENTER A TAB

    END
    ELSE
      if (MSG.wParam = VK_RETURN) THEN
        MSG.wParam:= VK_Tab   //POR SI APRETA ENTER SIN QUE ESTE EN MODO EDICION


  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;   //POR SI APRETA ENTER SIN QUE ESTE EN MODO EDICION

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     // SI EL CONTROL LO TIENE LA GRILLA DE FACTURACION
  begin

    if ((GetAsyncKeyState(VK_RETURN) = -32767) AND GRILLA_FACTURA.EditorMode) THEN   // SI LA TECLA FUE PRESIONADA CON EL FOCO EN LA GRILLA Y ESTA EN MODO EDICION
    BEGIN

      CONTROL.Post; // POSTEO EL DATO CARGADO

      if GRILLA_FACTURA.Columns[GRILLA_FACTURA.Col-1].FieldName = 'CANTIDAD' then  CALCULAR  // CALCULO LOS TOTALES
      ELSE
        IF GRILLA_FACTURA.Columns[GRILLA_FACTURA.Col-1].FieldName = 'CODIGO' then BUSCAR_ARTICULOS;  // CARGO LOS DATOS DEL ARTICULO

      MSG.wParam:= VK_Tab; // CAMBIO LA TECLA PRESIONADA DE ENTER A TAB

    END
    ELSE
      if (MSG.wParam = VK_RETURN) THEN
        MSG.wParam:= VK_Tab   //POR SI APRETA ENTER SIN QUE ESTE EN MODO EDICION
  END
  ELSE
  BEGIN

    if (ACTIVECONTROL = GRILLA_ARTICULOS) AND ((GetAsyncKeyState(VK_RETURN) = -32767)) then  // SI EL CONTROL LO TIENE LA GRILLA DE BUSQUEDA
    BEGIN

      PANEL_ARTICULOS.Hide;   // OCULTO PANEL DE BUSQUEDA

      PANEL_DETALLE.Enabled:=True;     // REATIVO PANEL DE FACTURACION

      CONTROL.Edit;                     //
      CONTROL['CODIGO']:=AUXILIAR['CODIGO_LISTA'];    // PONGO EL CODIGO DEL ARTICULO SELECCIONADO EN LA BUSQUEDA
      CONTROL.Post;

      BUSCAR_ARTICULOS;  // CARGO LOS DATOS DEL ARTICULO

      ACTIVECONTROL:=GRILLA_FACTURA;       // PASO EL CONTROL A GRILLA FACTURACION

      PostMessage(GRILLA_FACTURA.Handle, WM_CHAR, VK_RETURN, 0); //ENVIO LA TECLA RETURN A LA GRILLA DE FACTURACION

    END;

  END;

end;


Si alguien sabe el porque de este particular inconveniente, agradecería mucho la ayuda.
Saludos
Responder Con Cita