Hola, buenas tardes para todos, nos gastaría agregar una nueva característica a la aplicación, pero no sabemos que control se debe usar, queremos lograr, que al momento de abrir una ventana mdi, esta se pueda seleccionar en la parte superior de la ventana, algo como lo que hace en fivedit, creo que una imagen dice mas que mil palabras.
Espero haberme hecho entender, de antemano gracias.
Que control debo usar?
Que control debo usar?
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com
[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com
[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
-
- Posts: 176
- Joined: Wed Jan 02, 2019 8:36 am
Re: Que control debo usar?
Buenos dias Leandro
Yo tengo algo parecido desarrollado. Al estilo de como windows muestra los botones de su barra de tareas.
Me explico :
Entorno MDI
Tengo 8 modulos principales : Proveedores, Clientes, Artículos.. etc.
Quería que desde cada ventana MDI, poder abrir el módulo directamente sin volver a la ventana principal.
En mi caso muestro las 8 opciones, con 8 botones.
Los 8 botones pueden tener 3 estados :
- No abierto : Se muestra el boton tal cual
- Abierto No soleccionado : Se muestra el boton con un linea azul debajo
- Abierto y actualmente seleccionado : Se muestra el boton con un fondo azul
Para cada estado utilizo una imagen (.bmp) diferente.
Así se muestra en la ventana principal
Ahora abro, por ejemplo, el modulo clientes (en mi caso el tercer boton). Observa que ahora a la derecha se muestra el resto de botones para el mantenimiento de esa ventana
Ahora abro, otra ventana : Graficas
¿ Cómo se cambia el estado de los botones ?
En el método bPaint de la ventana hija
La funcion ACT_BOT_2020() cambia el estado.
Y obviamente tambien la forma en que se ejecuta la accion de cada boton
1 - Si no esta activa, ejecuta la llamada a ese modulo.
2 - Si está activa : le da el foco a esa ventana
No sería entonces muy complicado hacer lo que necesitas, pero en vez de mostrar mis 8 botones (módulos), que pusiera un boton por cada ventana hija abierta.
Yo lo hago todo en un ButtonBar, pero se podría hacer en dos, como muestras en tu imagen.
Si no te aclaras, puedo intentar montar un ejemplo.
Saludos
Jesús Marín
Yo tengo algo parecido desarrollado. Al estilo de como windows muestra los botones de su barra de tareas.
Me explico :
Entorno MDI
Tengo 8 modulos principales : Proveedores, Clientes, Artículos.. etc.
Quería que desde cada ventana MDI, poder abrir el módulo directamente sin volver a la ventana principal.
En mi caso muestro las 8 opciones, con 8 botones.
Los 8 botones pueden tener 3 estados :
- No abierto : Se muestra el boton tal cual
- Abierto No soleccionado : Se muestra el boton con un linea azul debajo
- Abierto y actualmente seleccionado : Se muestra el boton con un fondo azul
Para cada estado utilizo una imagen (.bmp) diferente.
Así se muestra en la ventana principal
Ahora abro, por ejemplo, el modulo clientes (en mi caso el tercer boton). Observa que ahora a la derecha se muestra el resto de botones para el mantenimiento de esa ventana
Ahora abro, otra ventana : Graficas
¿ Cómo se cambia el estado de los botones ?
En el método bPaint de la ventana hija
Code: Select all | Expand
ACTIVATE WINDOW oWnd MAXIMIZED ;
ON PAINT aBtn2020c:=ACT_BOT_2020(aBtn2020c,oBar) ;
ON INIT INICIA() ;
VALID Cerrar(xAreaArt,MiAlias,MiAlias2,oWnd)
Y obviamente tambien la forma en que se ejecuta la accion de cada boton
1 - Si no esta activa, ejecuta la llamada a ese modulo.
2 - Si está activa : le da el foco a esa ventana
No sería entonces muy complicado hacer lo que necesitas, pero en vez de mostrar mis 8 botones (módulos), que pusiera un boton por cada ventana hija abierta.
Yo lo hago todo en un ButtonBar, pero se podría hacer en dos, como muestras en tu imagen.
Si no te aclaras, puedo intentar montar un ejemplo.
Saludos
Jesús Marín
Jesús Marín
-
- Posts: 176
- Joined: Wed Jan 02, 2019 8:36 am
Re: Que control debo usar?
Hola Lenadro
Te dejo video de un ejemplo. ( no me he preocupado mucho de la estética).
Si te da alguna idea para desarrollarlo, te copio el código.
Saludos
Te dejo video de un ejemplo. ( no me he preocupado mucho de la estética).
Si te da alguna idea para desarrollarlo, te copio el código.
Saludos
Code: Select all | Expand
#include "Fivewin.ch"
STATIC oWnd
STATIC cRuta := "C:\DEUMARE\ICONS\"
STATIC oMenu
// cRuta pon aquí una ruta, si quieres para tus iconos, imagenes
function Main()
DEFINE WINDOW oWnd MDI TITLE "Test menú módulos"
ACTIVATE WINDOW oWnd ON INIT ( oWnd:oMenu:End(), oWnd:oMenu:=NIL, Child() ) MAXIMIZED
RETURN(NIL)
function BuildMenu()
local oMenu2
MENU oMenu2 POPUP
MENUITEM "&Salir" ACTION oWnd:End()
SEPARATOR
MENUITEM "&Clientes" ACTION IF( Activa_MDI("Clientes") , ,Modulo_clientes() )
MENUITEM "&Proveedores" ACTION IF( Activa_MDI("Proveedores"), ,Modulo_proveedores() )
MENUITEM "&Artículos" ACTION IF( Activa_MDI("Artículos") , ,Modulo_articulos() )
ENDMENU
RETURN(oMenu2)
STATIC FUNCTION CHILD()
LOCAL oWnd2, oBar, oBar2
LOCAL aBotones:=ARRAY(2)
oMenu:=BuildMenu()
DEFINE WINDOW oWnd2 MDICHILD OF oWnd TITLE "Pruebas botones segunda barra" COLOR CLR_BLACK, RGB(242,242,242)
DEFINE BUTTONBAR oBar OF oWnd2 BUTTONSIZE 40,40
oBar:SetColor(CLR_BLACK, RGB(247,247,247))
oBar:bRClicked := {|| nil }
@01,000 BTNBMP aBotones[1] FILE cRuta+"EXIT_W11.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oWnd:End()
aBotones[1]:cToolTip=CRLF+" Salir "+CRLF+" "
@01,040 BTNBMP aBotones[2] FILE cRuta+"W10_MENU.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oMenu:Activate(40,41,oBar,.f.)
aBotones[2]:cToolTip=CRLF+" Menú principal "+CRLF+" "
* @41,0 BUTTONBAR oBar2 SIZE 1400,30 BUTTONSIZE 40,30 OF oWnd2
* oBar2:SetColor(CLR_BLACK, RGB(195,195,195))
* oBar2:bRClicked := {|| nil }
ACTIVATE WINDOW oWnd2 MAXIMIZED
return nil
///////////////////////////////////////////////////////////////////////////////
// MODULOS QUE SUELEN IR EN PRG DIFERENTES
FUNCTION MODULO_CLIENTES()
LOCAL oWndC, oBar, oBar2
LOCAL aBotones:=ARRAY(2)
LOCAL aSubBotones:={}
DEFINE WINDOW oWndC MDICHILD OF oWnd TITLE "Clientes" COLOR CLR_BLACK, CLR_RED
DEFINE BUTTONBAR oBar OF oWndC BUTTONSIZE 40,40
oBar:SetColor(CLR_BLACK, RGB(247,247,247))
oBar:bRClicked := {|| nil }
@01,000 BTNBMP aBotones[1] FILE cRuta+"EXIT_W11.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oWndC:End()
aBotones[1]:cToolTip=CRLF+" Salir "+CRLF+" "
@01,040 BTNBMP aBotones[2] FILE cRuta+"W10_MENU.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oMenu:Activate(40,41,oBar,.f.)
aBotones[2]:cToolTip=CRLF+" Menú principal "+CRLF+" "
@41,0 BUTTONBAR oBar2 SIZE 1400,30 BUTTONSIZE 40,30 OF oWndC
oBar2:SetColor(CLR_BLACK, RGB(195,195,195))
oBar2:bRClicked := {|| nil }
@150,50 SAY "Aquí mis controles para el módulo de CLIENTES" OF oWndC PIXEL COLOR CLR_WHITE, CLR_RED
// Activamos los botones de módulos
aSubBotones:=Botones_modulos(oBar2)
ACTIVATE WINDOW oWndC MAXIMIZED ON PAINT aSubBotones:=ACT_BOT_MODULOS(aSubBotones,oBar2)
return nil
//-----------------------------------------------------------------------------
FUNCTION MODULO_PROVEEDORES()
LOCAL oWndPr, oBar, oBar2
LOCAL aBotones:=ARRAY(2)
LOCAL aSubBotones:={}
DEFINE WINDOW oWndPr MDICHILD OF oWnd TITLE "Proveedores" COLOR CLR_BLACK, CLR_GREEN
DEFINE BUTTONBAR oBar OF oWndPr BUTTONSIZE 40,40
oBar:SetColor(CLR_BLACK, RGB(247,247,247))
oBar:bRClicked := {|| nil }
@01,000 BTNBMP aBotones[1] FILE cRuta+"EXIT_W11.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oWndPr:End()
aBotones[1]:cToolTip=CRLF+" Salir "+CRLF+" "
@01,040 BTNBMP aBotones[2] FILE cRuta+"W10_MENU.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oMenu:Activate(40,41,oBar,.f.)
aBotones[2]:cToolTip=CRLF+" Menú principal "+CRLF+" "
@41,0 BUTTONBAR oBar2 SIZE 1400,30 BUTTONSIZE 40,30 OF oWndPr
oBar2:SetColor(CLR_BLACK, RGB(195,195,195))
oBar2:bRClicked := {|| nil }
@150,50 SAY "Aquí mis controles para el módulo de PROVEEDORES" OF oWndPr PIXEL COLOR CLR_WHITE, CLR_GREEN
// Activamos los botones de módulos
aSubBotones:=Botones_modulos(oBar2)
ACTIVATE WINDOW oWndPr MAXIMIZED ON PAINT aSubBotones:=ACT_BOT_MODULOS(aSubBotones,oBar2)
return nil
//-----------------------------------------------------------------------------
FUNCTION MODULO_ARTICULOS()
LOCAL oWndA, oBar, oBar2
LOCAL aBotones:=ARRAY(2)
LOCAL aSubBotones:={}
DEFINE WINDOW oWndA MDICHILD OF oWnd TITLE "Artículos" COLOR CLR_BLACK, CLR_YELLOW
DEFINE BUTTONBAR oBar OF oWndA BUTTONSIZE 40,40
oBar:SetColor(CLR_BLACK, RGB(247,247,247))
oBar:bRClicked := {|| nil }
@01,000 BTNBMP aBotones[1] FILE cRuta+"EXIT_W11.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oWndA:End()
aBotones[1]:cToolTip=CRLF+" Salir "+CRLF+" "
@01,040 BTNBMP aBotones[2] FILE cRuta+"W10_MENU.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oMenu:Activate(40,41,oBar,.f.)
aBotones[2]:cToolTip=CRLF+" Menú principal "+CRLF+" "
@41,0 BUTTONBAR oBar2 SIZE 1400,30 BUTTONSIZE 40,30 OF oWndA
oBar2:SetColor(CLR_BLACK, RGB(195,195,195))
oBar2:bRClicked := {|| nil }
@150,50 SAY "Aquí mis controles para el módulo de ARTICULOS" OF oWndA PIXEL COLOR CLR_BLACK, CLR_YELLOW
// Activamos los botones de módulos
aSubBotones:=Botones_modulos(oBar2)
ACTIVATE WINDOW oWndA MAXIMIZED ON PAINT aSubBotones:=ACT_BOT_MODULOS(aSubBotones,oBar2)
return nil
//-----------------------------------------------------------------------------
// LAS FUNCIONES DE LOS BOTONES
FUNCTION Botones_modulos(oBar)
LOCAL aoBt:=ARRAY(3)
@0,001 BTNBMP aoBt[1] OF oBar PROMPT "Clientes" UPDATE NOBORDER SIZE 99,29 ACTION IF( Activa_MDI("Clientes"), ,Modulo_clientes() )
@0,101 BTNBMP aoBt[2] OF oBar PROMPT "Proveedores" UPDATE NOBORDER SIZE 99,29 ACTION IF( Activa_MDI("Proveedores"), ,Modulo_clientes() )
@0,201 BTNBMP aoBt[3] OF oBar PROMPT "Artículos" UPDATE NOBORDER SIZE 99,29 ACTION IF( Activa_MDI("Artículos"), ,Modulo_clientes() )
return(aoBt)
//--------------------------------------------------------------------------------------------------------------------
FUNCTION ACT_BOT_MODULOS(aoBt, oBar)
LOCAL nPosicion:=1
// ORDENAMOS DE IZQUIERDA A DERECHA
// SALDRAN EN EL ORDEN NATURAL, PERO TAMBIEN PUEDES CREAR UN ORDEN DE CREACION
IF Es_Activa_MDI("Clientes")=.t.
aoBt[1]:nLeft:=nPosicion
nPosicion:=nPosicion+100
ENDIF
IF Es_Activa_MDI("Proveedores")=.t.
aoBt[2]:nLeft:=nPosicion
nPosicion:=nPosicion+100
ENDIF
IF Es_Activa_MDI("Artículos")=.t.
aoBt[3]:nLeft:=nPosicion
nPosicion:=nPosicion+100
ENDIF
IF Es_Activa_MDI("Clientes")=.f. ; aoBt[1]:Hide() ; ELSE ; aoBt[1]:Show() ; ENDIF
IF Es_Activa_MDI("Proveedores")=.f. ; aoBt[2]:Hide() ; ELSE ; aoBt[2]:Show() ; ENDIF
IF Es_Activa_MDI("Artículos")=.f. ; aoBt[3]:Hide() ; ELSE ; aoBt[3]:Show() ; ENDIF
RETURN( aoBt )
//--------------------------------------------------------------------------------
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(oWnd:oWndClient:aWnd)
IF UPPER( oWnd:oWndClient:aWnd[i]:cCaption )=cTitle
lSuccess:=.t.
ENDIF
NEXT
RETURN lSuccess
//-------------------------------------------------------------------------------
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(oWnd:oWndClient:aWnd)
IF UPPER( oWnd:oWndClient:aWnd[i]:cCaption )=cTitle
oWnd:oWndClient:aWnd[i]:SetFocus()
lSuccess:=.t.
ENDIF
NEXT
RETURN lSuccess
Last edited by JESUS MARIN on Thu Jan 05, 2023 11:12 am, edited 1 time in total.
Jesús Marín
Re: Que control debo usar?
Hola Leandro,
creo que una manera sencilla de lo q quieres es usar un folderex de base de la app e ir abriendo/cerrando pestañas segun tus opciones, como lo tienes en fivedit.
Saludos.
creo que una manera sencilla de lo q quieres es usar un folderex de base de la app e ir abriendo/cerrando pestañas segun tus opciones, como lo tienes en fivedit.
Saludos.
Re: Que control debo usar?
Jesus:
Muy buena la opción tuya, es muy ingeniosa y muy útil.
Felicitaciones
Muy buena la opción tuya, es muy ingeniosa y muy útil.
Felicitaciones
Re: Que control debo usar?
Jesus gracias por responder
Si es lo que busco
Ahora voy a tratar de entender tu código. Si surge cualquier duda te molesto.
Tambien hare pruebas con la clase folderex, para ver cual es la solución mas sencilla y conveniente de implementar.
Si es lo que busco
Ahora voy a tratar de entender tu código. Si surge cualquier duda te molesto.
Tambien hare pruebas con la clase folderex, para ver cual es la solución mas sencilla y conveniente de implementar.
Saludos
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com
[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
LEANDRO AREVALO
Bogotá (Colombia)
https://hymlyma.com
https://hymplus.com/
leandroalfonso111@gmail.com
leandroalfonso111@hotmail.com
[ Embarcadero C++ 7.60 for Win32 ] [ FiveWin 23.07 ] [ xHarbour 1.3.0 Intl. (SimpLex) (Build 20230914) ]
-
- Posts: 176
- Joined: Wed Jan 02, 2019 8:36 am
Re: Que control debo usar?
Buenos dias Leandro.
Te adjunto el .prg con algunas mejoras.
1) ahora no es necesario crear los botones en la ventana MDI. Al pintarse la ventana, si no existe, los crea.
2) Se han añadido imagenes (boton rojo y verde) para que se aprecie mejor que ventana está activa.
3) Otras mejoras menores.
4) He puesto el menu MDI de la ventana principal para que veas que se integra perfectamente.
Te adjunto el .prg con algunas mejoras.
1) ahora no es necesario crear los botones en la ventana MDI. Al pintarse la ventana, si no existe, los crea.
2) Se han añadido imagenes (boton rojo y verde) para que se aprecie mejor que ventana está activa.
3) Otras mejoras menores.
4) He puesto el menu MDI de la ventana principal para que veas que se integra perfectamente.
Code: Select all | Expand
#include "Fivewin.ch"
STATIC oWnd
STATIC cRuta := "C:\DEUMARE\ICONS\" // pon aquí una tu ruta, si quieres para tus iconos, imagenes
STATIC oMenu
function Main()
LOCAL oFont
DEFINE FONT oFont NAME "Segoe UI Light" SIZE 0,-12
DEFINE WINDOW oWnd MDI TITLE "Test Buttons Bar Mdi"
*ACTIVATE WINDOW oWnd ON INIT ( oWnd:oMenu:End(), oWnd:oMenu:=NIL, Child() ) MAXIMIZED // prueba sin menu MDI
ACTIVATE WINDOW oWnd ON INIT Child() MAXIMIZED
oFont:End()
RETURN(NIL)
//-----------------------------------------------------------------------------
function BuildMenu()
local oMenu2
MENU oMenu2 POPUP
MENUITEM "&Salir" ACTION oWnd:End()
SEPARATOR
MENUITEM "&Clientes" ACTION IF( Activa_MDI("Clientes") , ,Modulo_clientes() )
MENUITEM "&Proveedores" ACTION IF( Activa_MDI("Proveedores"), ,Modulo_proveedores() )
MENUITEM "&Artículos" ACTION IF( Activa_MDI("Artículos") , ,Modulo_articulos() )
ENDMENU
RETURN(oMenu2)
//------------------------------------------------------------------------------
STATIC FUNCTION CHILD()
LOCAL oWnd2, oBar, oBar2
LOCAL aBotones:=ARRAY(2)
LOCAL oFont
oMenu:=BuildMenu()
DEFINE FONT oFont NAME "Segoe UI Light" SIZE 0,-12
DEFINE WINDOW oWnd2 MDICHILD OF oWnd TITLE "Menú" COLOR CLR_BLACK, RGB(242,242,242)
DEFINE BUTTONBAR oBar OF oWnd2 BUTTONSIZE 40,40
oBar:SetColor(CLR_BLACK, RGB(247,247,247))
oBar:bRClicked := {|| nil }
@01,000 BTNBMP aBotones[1] FILE cRuta+"EXIT_W11.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oWnd:End()
aBotones[1]:cToolTip=CRLF+" Salir "+CRLF+" "
@01,040 BTNBMP aBotones[2] FILE cRuta+"W10_MENU.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oMenu:Activate(40,41,oBar,.f.)
aBotones[2]:cToolTip=CRLF+" Menú principal "+CRLF+" "
ACTIVATE WINDOW oWnd2 MAXIMIZED
oFont:End()
return nil
///////////////////////////////////////////////////////////////////////////////
// MODULOS QUE SUELEN IR EN PRG DIFERENTES
FUNCTION MODULO_CLIENTES()
LOCAL oWndC, oBar, oBar2
LOCAL aBotones:=ARRAY(2)
LOCAL aSubBotones:={}
LOCAL oFont
DEFINE FONT oFont NAME "Segoe UI Light" SIZE 0,-12
DEFINE WINDOW oWndC MDICHILD OF oWnd TITLE "Clientes" COLOR CLR_BLACK, CLR_RED
DEFINE BUTTONBAR oBar OF oWndC BUTTONSIZE 40,40
oBar:SetColor(CLR_BLACK, RGB(247,247,247))
oBar:bRClicked := {|| nil }
@01,000 BTNBMP aBotones[1] FILE cRuta+"EXIT_W11.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oWndC:End()
aBotones[1]:cToolTip=CRLF+" Salir "+CRLF+" "
@01,040 BTNBMP aBotones[2] FILE cRuta+"W10_MENU.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oMenu:Activate(40,41,oBar,.f.)
aBotones[2]:cToolTip=CRLF+" Menú principal "+CRLF+" "
@41,0 BUTTONBAR oBar2 SIZE 1400,30 BUTTONSIZE 40,30 OF oWndC
oBar2:SetColor(CLR_BLACK, RGB(195,195,195))
oBar2:bRClicked := {|| nil }
@150,50 SAY "Aquí mis controles para el módulo de CLIENTES" OF oWndC PIXEL COLOR CLR_WHITE, CLR_RED
ACTIVATE WINDOW oWndC ON PAINT aSubBotones:=ACT_BOT_MODULOS(aSubBotones,oBar2) MAXIMIZED
oFont:End()
return nil
//-----------------------------------------------------------------------------
FUNCTION MODULO_PROVEEDORES()
LOCAL oWndPr, oBar, oBar2
LOCAL aBotones:=ARRAY(2)
LOCAL aSubBotones:={}
LOCAL oFont
DEFINE FONT oFont NAME "Segoe UI Light" SIZE 0,-12
DEFINE WINDOW oWndPr MDICHILD OF oWnd TITLE "Proveedores" COLOR CLR_BLACK, CLR_GREEN
DEFINE BUTTONBAR oBar OF oWndPr BUTTONSIZE 40,40
oBar:SetColor(CLR_BLACK, RGB(247,247,247))
oBar:bRClicked := {|| nil }
@01,000 BTNBMP aBotones[1] FILE cRuta+"EXIT_W11.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oWndPr:End()
aBotones[1]:cToolTip=CRLF+" Salir "+CRLF+" "
@01,040 BTNBMP aBotones[2] FILE cRuta+"W10_MENU.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oMenu:Activate(40,41,oBar,.f.)
aBotones[2]:cToolTip=CRLF+" Menú principal "+CRLF+" "
@41,0 BUTTONBAR oBar2 SIZE 1400,30 BUTTONSIZE 40,30 OF oWndPr
oBar2:SetColor(CLR_BLACK, RGB(195,195,195))
oBar2:bRClicked := {|| nil }
@150,50 SAY "Aquí mis controles para el módulo de PROVEEDORES" OF oWndPr PIXEL COLOR CLR_WHITE, CLR_GREEN
ACTIVATE WINDOW oWndPr ON PAINT aSubBotones:=ACT_BOT_MODULOS(aSubBotones,oBar2) MAXIMIZED
oFont:End()
return nil
//-----------------------------------------------------------------------------
FUNCTION MODULO_ARTICULOS()
LOCAL oWndA, oBar, oBar2
LOCAL aBotones:=ARRAY(2)
LOCAL aSubBotones:={}
LOCAL oFont
DEFINE FONT oFont NAME "Segoe UI Light" SIZE 0,-12
DEFINE WINDOW oWndA MDICHILD OF oWnd TITLE "Artículos" COLOR CLR_BLACK, CLR_YELLOW
DEFINE BUTTONBAR oBar OF oWndA BUTTONSIZE 40,40
oBar:SetColor(CLR_BLACK, RGB(247,247,247))
oBar:bRClicked := {|| nil }
@01,000 BTNBMP aBotones[1] FILE cRuta+"EXIT_W11.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oWndA:End()
aBotones[1]:cToolTip=CRLF+" Salir "+CRLF+" "
@01,040 BTNBMP aBotones[2] FILE cRuta+"W10_MENU.BMP" SIZE 40,40 OF oBar UPDATE NOBORDER ACTION oMenu:Activate(40,41,oBar,.f.)
aBotones[2]:cToolTip=CRLF+" Menú principal "+CRLF+" "
@41,0 BUTTONBAR oBar2 SIZE 1400,30 BUTTONSIZE 40,30 OF oWndA
oBar2:SetColor(CLR_BLACK, RGB(195,195,195))
oBar2:bRClicked := {|| nil }
@150,50 SAY "Aquí mis controles para el módulo de ARTICULOS" OF oWndA PIXEL COLOR CLR_BLACK, CLR_YELLOW
ACTIVATE WINDOW oWndA ON PAINT aSubBotones:=ACT_BOT_MODULOS(aSubBotones,oBar2) MAXIMIZED
oFont:End()
return nil
//-----------------------------------------------------------------------------
// FUNCTION Botones_modulos() crea los BtnBmp si no existen
// FUNCTION Act_Bot_Modulos() actualiza los BtnBmp.
// FUNCTION Es_Activa_MDI() devuelve verdadero o falso si la ventana esta creada
// FUNCTION Activa_mdi() Da el foco a la ventana
// FUNCTION Alinear_derecha() Alinea correctamente a la deerecha el texto del BtnBmp (en mi version no lo hace correctamente)
FUNCTION Botones_modulos(oBar,oFont)
LOCAL aoBt:=ARRAY(3)
@2,002 BTNBMP aoBt[1] OF oBar FILE cRuta+"BOTON_VERDE.BMP" PROMPT ALINEAR_DERECHA("Clientes",oFont,oBar,70) ;
UPDATE NOBORDER SIZE 98,24 ACTION IF( Activa_MDI("Clientes"), ,Modulo_clientes() ) FONT oFont LEFT
@2,102 BTNBMP aoBt[2] OF oBar FILE cRuta+"BOTON_VERDE.BMP" PROMPT ALINEAR_DERECHA("Proveedores",oFont,oBar,70) ;
UPDATE NOBORDER SIZE 98,24 ACTION IF( Activa_MDI("Proveedores"), ,Modulo_clientes() ) FONT oFont LEFT
@2,202 BTNBMP aoBt[3] OF oBar FILE cRuta+"BOTON_VERDE.BMP" PROMPT ALINEAR_DERECHA("Artículos", oFont, oBar,70) ;
UPDATE NOBORDER SIZE 98,24 ACTION IF( Activa_MDI("Artículos"), ,Modulo_clientes() ) FONT oFont LEFT
return(aoBt)
//------------------------------------------------------------------------------
FUNCTION ACT_BOT_MODULOS(aoBt, oBar,oFont)
LOCAL nPosicion:=1
LOCAL cCaption:= UPPER(oBar:oWnd:cCaption)
// Si los btnbmp no existen, los crea
IF EMPTY(aoBt)
aoBt:=Botones_modulos(oBar,oFont)
ENDIF
// ORDENAMOS DE IZQUIERDA A DERECHA
// SALDRAN EN EL ORDEN NATURAL, PERO TAMBIEN PUEDES CREAR UN ORDEN DE CREACION
IF Es_Activa_MDI("Clientes")=.t.
aoBt[1]:nLeft:=nPosicion
nPosicion:=nPosicion+100
IF UPPER("Clientes")=cCaption
aoBt[1]:SetFile(cRuta+"BOTON_VERDE.BMP")
ELSE
aoBt[1]:SetFile(cRuta+"BOTON_ROJO.BMP")
ENDIF
aoBt[1]:Show()
ELSE
aoBt[1]:Hide()
ENDIF
IF Es_Activa_MDI("Proveedores")=.t.
aoBt[2]:nLeft:=nPosicion
nPosicion:=nPosicion+100
IF UPPER("Proveedores")=cCaption
aoBt[2]:SetFile(cRuta+"BOTON_VERDE.BMP")
ELSE
aoBt[2]:SetFile(cRuta+"BOTON_ROJO.BMP")
ENDIF
aoBt[2]:Show()
ELSE
aoBt[2]:Hide()
ENDIF
IF Es_Activa_MDI("Artículos")=.t.
aoBt[3]:nLeft:=nPosicion
nPosicion:=nPosicion+100
IF UPPER("Artículos")=cCaption
aoBt[3]:SetFile(cRuta+"BOTON_VERDE.BMP")
ELSE
aoBt[3]:SetFile(cRuta+"BOTON_ROJO.BMP")
ENDIF
aoBt[3]:Show()
ELSE
aoBt[3]:Hide()
ENDIF
RETURN( aoBt )
//--------------------------------------------------------------------------------
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(oWnd:oWndClient:aWnd)
IF UPPER( oWnd:oWndClient:aWnd[i]:cCaption )=cTitle
lSuccess:=.t.
ENDIF
NEXT
RETURN lSuccess
//-------------------------------------------------------------------------------
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(oWnd:oWndClient:aWnd)
IF UPPER( oWnd:oWndClient:aWnd[i]:cCaption )=cTitle
oWnd:oWndClient:aWnd[i]:SetFocus()
lSuccess:=.t.
ENDIF
NEXT
RETURN lSuccess
//-----------------------------------------------------------------------------
FUNCTION ALINEAR_DERECHA(cTexto,oFont,oWnd,nTamano)
cTexto:=ALLTRIM(cTexto)
DO WHILE .T.
IF oWnd:GetWidth( cTexto ,oFont )<nTamano
cTexto:=" "+cTexto
ELSE
EXIT
ENDIF
ENDDO
RETURN(cTexto)
Jesús Marín