Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > OOP
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 17-11-2023
aromigaret aromigaret is offline
Miembro
 
Registrado: jun 2011
Posts: 68
Poder: 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
  #2  
Antiguo 17-11-2023
aromigaret aromigaret is offline
Miembro
 
Registrado: jun 2011
Posts: 68
Poder: 13
aromigaret Va por buen camino
Bueno de tanto buscar en el foro di con la respuesta.
en vez de poner :


Código Delphi [-]
MSG.wParam:=VK_Tab


para enviar un Tab, utilizo


Código Delphi [-]
keybd_event(VK_tab,0,0,0);


con ello genero un evento de teclado


Saludos
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Pasar registros de una DBGrid a otra Dbgrid usando multiselect Soa Pelaez Varios 4 08-03-2017 12:41:28
Pasar registros desde un dbgrid a otro dbgrid con botones.. Vales08 Varios 17 21-11-2011 19:27:50
tomar una fila de un DBGrid y traspasarlo a otro DBGrid micky mouse Varios 2 05-06-2008 16:24:18
ApplicationEvents??? pnsd_89 Varios 1 14-08-2007 23:21:23
Como usar el ApplicationEvents ? Raptor Varios 5 21-11-2003 17:08:06


La franja horaria es GMT +2. Ahora son las 08:49:56.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi