Page 1 of 1

Qué se ejecuta al cerrar una ventana MDI - BOTONES W10

Posted: Wed Nov 11, 2020 7:44 pm
by JESUS MARIN
Buenas noches a todos
Estoy actualizando mi barra de botones, en un entorno MDI
Parece la misma en toda la aplicación, pero cada MDI tiene su propia barra. Carga el boton cerrar, una serie de botones para acceder a cada modulo (articulos, clientes, etc...) , y los botones de cada modulo (primero,ultimo, buscar, modificar,etc.).
Quiero poner una linea azul debajo debajo del módulo que ya está abierto. (como hace win10 con sus aplicaciones en la barra inferior de windows)
Consigo controlar todo y cambiar la imagen del boton, pero cuando cierro una ventana y quiero actualizar la barra de botones de la ventana que recibe el foco, no sé que se ejecuta.
He probado con llamar la función asi :

Code: Select all

oWnd:bGotFocus:= { ||  DbSelectArea(xAreaProveedor), Actualiza_barra_2020()  }
 
Desgraciadamente no se ejecuta cuando la ventana que recibe el foco, la recibe porque se ha cerrado otra.
Tambien he probado con bPaint

La pregunta es : si no se ejectuta oWnd:bGotFocus, se ejecuta algo ? Algo que podamos controlar ?

Pongo un video para explicarlo mejor.

Image

Gracias

JESUS MARIN
FIVEWIN 6.12

Re: Qué se ejecuta al cerrar una ventana MDI

Posted: Wed Nov 11, 2020 11:12 pm
by JESUS MARIN
Voy avanzando.
Creo que el sistema de Windows, en cuanto a las MDI, es que primero da el foco a la siguiente ventana y luego cierra la que ha pedido terminar.
Por eso, cuando recibo el foco en una ventana, todavia no se ha cerrado la anterior, por lo que cuando pregunto si la ventana cerrada está todavia activa, me devuleve verdadero y por tanto no muestra bien la imagen.

Creo que por ahi pueden ir los tiros.

Re: Qué se ejecuta al cerrar una ventana MDI

Posted: Wed Nov 11, 2020 11:38 pm
by JESUS MARIN
Parece resuelto.
He puesto un timer para que se ejecute un poco despues.
Mañana lo termino y os lo muestro, por si fuera interesante para alguien.

Re: Qué se ejecuta al cerrar una ventana MDI

Posted: Thu Nov 12, 2020 10:20 am
by Antonio Linares
gracias Jesús

Re: Qué se ejecuta al cerrar una ventana MDI - BOTONES W10

Posted: Thu Nov 12, 2020 3:10 pm
by JESUS MARIN
Gracias a ti, Antonio.
Por culpa de fivewin, paso buenos ratos programando. Aunque me dedico a otros menesteres. Ahora, que hay poco trabajo, al menos me puedo entretener.

Os pongo y video y el código fuente completo.
Está hecho con FiveWin 6.12 y el rmake original. Sin ninguna clase modificada.

PULSE EN LA IMAGEN PARA VER EL VIDEO (No sé cómo ponerlo para que se reproduzca solo)
Image

Code: Select all

#include "FiveWin.Ch"


//----------------------------------------------------------------------------//
// PRUEBA DE BOTONES EN UN ENTORNO MDI, CON VENTANAS SIEMPRE MAXIMIZADAS
// CAMBIA LA IMAGEN DE LOS BOTONES, PARA INDICAR SI EL MODULO ESTA ACTIVO
// JESUS MARIN  deumare@gmail.com  12/11/2020
//----------------------------------------------------------------------------//

STATIC oWndP

function Main()


   local oBar, oIco

   DEFINE WINDOW oWndP MDI TITLE "Ejemplo botones tipo W10"

   ACTIVATE WINDOW oWndP ON INIT ( oWndP:oMenu:End(), Child() ) MAXIMIZED

return nil

//----------------------------------------------------------------------------//

static function Child()

LOCAL oWnd, oBar, oBt1


   DEFINE WINDOW oWnd MDICHILD OF oWndP TITLE "MENU" COLOR CLR_BLACK, RGB(242,242,242)

   DEFINE BUTTONBAR oBar OF oWnd BUTTONSIZE 40,40
      oBar:SetColor(CLR_HGRAY, CLR_WHITE)
      oBar:bRClicked := {|| nil }


      @00,000 BTNBMP oBt1 FILE "EXIT_W10.BMP"  SIZE 40,40 ACTION oWndP:End() OF oBar UPDATE NOBORDER
         oBt1:cToolTip=CRLF+"   Salir   "+CRLF+" "
         oBt1:SetColor(CLR_WHITE, CLR_WHITE )

      Botones_generales_2020(oBar)


   ACTIVATE WINDOW oWnd MAXIMIZED

return nil

//----------------------------------------------------------------------------//


FUNCTION Botones_generales_2020(oBar)


LOCAL oBt:=ARRAY(3)
LOCAL cFile

    //-------------------------------------------------------------------------
    IF Es_Activa_MDI("Proveedores")=.t.
      cFile:="W10_PROVE_SEL.BMP"
    ELSE
      cFile:="W10_PROVE.BMP"
    ENDIF
    @00,040 BTNBMP oBt[1] OF oBar FILE cFile UPDATE NOBORDER SIZE 40,40 ACTION IF( Activa_MDI("Proveedores"), ,PRG_PROVEEDOR(oWndP) )
    //-------------------------------------------------------------------------
    IF Es_Activa_MDI("Clientes")=.t.
      cFile:="W10_CLIENTES_SEL.BMP"
    ELSE
      cFile:="W10_CLIENTES.BMP"
    ENDIF
    @00,080 BTNBMP oBt[2] OF oBar FILE cFile UPDATE NOBORDER SIZE 40,40 ACTION IF( Activa_MDI("Clientes"), , PRG_CLIENTES(oWndP) )
    //-------------------------------------------------------------------------
    IF Es_Activa_MDI("Articulos")=.t.
      cFile:="W10_ARTICUL_SEL.BMP"
    ELSE
      cFile:="W10_ARTICUL.BMP"
    ENDIF
    @00,120 BTNBMP oBt[3] OF oBar FILE cFile  UPDATE NOBORDER SIZE 40,40 ACTION IF( Activa_MDI("Articulos"), , PRG_ARTICULOS(oWndP) )

    oBt[1]:cToolTip=CRLF+" Mantenimiento de Proveedores   "+CRLF+" "
    oBt[2]:cToolTip=CRLF+" Mantenimiento de Clientes   "+CRLF+" "
    oBt[3]:cToolTip=CRLF+" Mantenimiento de Artículos   "+CRLF+" "
    oBt[1]:SetColor(, CLR_WHITE )
    oBt[2]:SetColor(, CLR_WHITE )
    oBt[3]:SetColor(, CLR_WHITE )
return(oBt)



//-------------------------------------------------------------------------//
FUNCTION Activa_MDI(cTitle)   // Esta funcion selecionada una ventana MDI si ya esta abierta.

LOCAL i:=0, lSuccess:=.f.

cTitle:=upper(cTitle)

FOR i=1 TO LEN(oWndP:oWndClient:aWnd)
   IF UPPER( oWndP:oWndClient:aWnd[i]:cCaption )=cTitle
      oWndP:oWndClient:aWnd[i]:SetFocus()
      lSuccess:=.t.
   ENDIF
NEXT
RETURN lSuccess




//---------------------------------------------------------------------------//
// Esta funcion actualiza los botones, para ver si están abiertos o no los modulos
// cuando una ventana recibe el foco, revisará y cambiara si procede.
// Sin el timer previo no funciona. Parece que recibe el foco antes de finalizar la otra ventana
FUNCTION ACT_BOT_2020(aBotones)

LOCAL oTimer

DEFINE TIMER oTimer INTERVAL 500 ACTION aBotones:=ACT_BOT_2020B(aBotones)
ACTIVATE TIMER oTimer
return(aBotones)

FUNCTION ACT_BOT_2020B(aBotones)

    IF Es_Activa_MDI("Proveedores")=.T.
      aBotones[1]:SetFile("W10_PROVE_SEL.BMP")
    ELSE
      aBotones[1]:SetFile("W10_PROVE.BMP")
    ENDIF

    IF Es_Activa_MDI("Clientes")=.T.
      aBotones[2]:SetFile("W10_CLIENTES_SEL.BMP")
    ELSE
      aBotones[2]:SetFile("W10_CLIENTES.BMP")
    ENDIF

    IF Es_Activa_MDI("Arti")=.T.
      aBotones[3]:SetFile("W10_ARTICUL_SEL.BMP")
    ELSE
      aBotones[3]:SetFile("W10_ARTICUL.BMP")
    ENDIF

return(aBotones)


//-----------------------------------------------------------------------------//
FUNCTION Es_Activa_MDI(cTitle)   // Esta devuelve .f. o .t. si una ventana MDI si ya esta abierta.

LOCAL i:=0, lSuccess:=.f.

cTitle:=upper(cTitle)

FOR i=1 TO LEN(oWndP:oWndClient:aWnd)
   IF UPPER( oWndP:oWndClient:aWnd[i]:cCaption )=cTitle
      lSuccess:=.t.
   ENDIF
NEXT
RETURN lSuccess

//-----------------------------------------------------------------------------//

function MyError( o )

   MsgInfo( o:Description )

return nil


////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
// MODULOS DE PROGRAMA. PUEDE IR EN OTRO .PRG

FUNCTION PRG_PROVEEDOR()

LOCAL oWnd, oBar, oBt1
LOCAL oFont
LOCAL aBotones:=ARRAY(3)


   DEFINE FONT oFont  NAME "Segoe UI Light" SIZE 0,-30

   DEFINE WINDOW oWnd MDICHILD OF oWndP TITLE "PROVEEDORES" COLOR CLR_BLACK, RGB(242,242,242)

   DEFINE BUTTONBAR oBar OF oWnd BUTTONSIZE 40,40
      oBar:SetColor(CLR_HGRAY, CLR_WHITE)
      oBar:bRClicked := {|| nil }


      @00,000 BTNBMP oBt1 FILE "EXIT_W10.BMP"  SIZE 40,40 ACTION oWnd:End() OF oBar UPDATE NOBORDER
         oBt1:cToolTip=CRLF+"   Salir   "+CRLF+" "
         oBt1:SetColor(CLR_WHITE, CLR_WHITE )

      aBotones:=Botones_generales_2020(oBar)

   @60,10 SAY "PROVEEDORES" OF oWnd FONT oFont SIZE 1000,50 PIXEL COLOR CLR_BLUE

   ACTIVATE WINDOW oWnd MAXIMIZED VALID PRO_END(oFont)  ;
      ON INIT ( oWnd:bGotFocus:={ || aBotones:=ACT_BOT_2020(aBotones) } )

return nil
//-----------------------------------------------------------------------------
FUNCTION PRO_END(oFont)
oFont:End()
return(.t.)


///////////////////////////////////////////////////////////////////////////////
FUNCTION PRG_CLIENTES()

LOCAL oWnd, oBar, oBt1
LOCAL oFont
LOCAL aBotones:=ARRAY(3)


   DEFINE FONT oFont  NAME "Segoe UI Light" SIZE 0,-30

   DEFINE WINDOW oWnd MDICHILD OF oWndP TITLE "CLIENTES" COLOR CLR_BLACK, RGB(242,242,242)

   DEFINE BUTTONBAR oBar OF oWnd BUTTONSIZE 40,40
      oBar:SetColor(CLR_HGRAY, CLR_WHITE)
      oBar:bRClicked := {|| nil }


      @00,000 BTNBMP oBt1 FILE "EXIT_W10.BMP"  SIZE 40,40 ACTION oWnd:End() OF oBar UPDATE NOBORDER
         oBt1:cToolTip=CRLF+"   Salir   "+CRLF+" "
         oBt1:SetColor(CLR_WHITE, CLR_WHITE )

      aBotones:=Botones_generales_2020(oBar)

   @60,10 SAY "CLIENTES" OF oWnd FONT oFont SIZE 1000,50 PIXEL COLOR CLR_RED

   ACTIVATE WINDOW oWnd MAXIMIZED VALID CLI_END(oFont) ;
            ON INIT oWnd:bGotFocus:={ || aBotones:=ACT_BOT_2020(aBotones) }

return nil

//----------------------------------------------------------------------------
FUNCTION CLI_END(oFont)
oFont:End()
return(.t.)

///////////////////////////////////////////////////////////////////////////////
FUNCTION PRG_ARTICULOS()

LOCAL oWnd, oBar, oBt1
LOCAL oFont
LOCAL aBotones:=ARRAY(3)


   DEFINE FONT oFont  NAME "Segoe UI Light" SIZE 0,-30

   DEFINE WINDOW oWnd MDICHILD OF oWndP TITLE "ARTICULOS" COLOR CLR_BLACK, RGB(242,242,242)

   DEFINE BUTTONBAR oBar OF oWnd BUTTONSIZE 40,40
      oBar:SetColor(CLR_HGRAY, CLR_WHITE)
      oBar:bRClicked := {|| nil }


      @00,000 BTNBMP oBt1 FILE "EXIT_W10.BMP"  SIZE 40,40 ACTION oWnd:End() OF oBar UPDATE NOBORDER
         oBt1:cToolTip=CRLF+"   Salir   "+CRLF+" "
         oBt1:SetColor(CLR_WHITE, CLR_WHITE )

      aBotones:=Botones_generales_2020(oBar)

   @60,10 SAY "ARTICULOS" OF oWnd FONT oFont SIZE 1000,50 PIXEL COLOR CLR_GREEN

   ACTIVATE WINDOW oWnd MAXIMIZED VALID ART_END(oFont) ;
         ON INIT oWnd:bGotFocus:={ || aBotones:=ACT_BOT_2020(aBotones) }

return nil

//------------------------------------------------------------------------------
FUNCTION ART_END(oFont)
oFont:End()
return(.t.)