Que control debo usar?

Que control debo usar?

Postby leandro » Wed Jan 04, 2023 11:38 pm

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.

Image
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) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Que control debo usar?

Postby JESUS MARIN » Thu Jan 05, 2023 4:14 am

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
Image

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
Image
Ahora abro, otra ventana : Graficas
Image


¿ Cómo se cambia el estado de los botones ?
En el método bPaint de la ventana hija

Code: Select all  Expand view
ACTIVATE WINDOW oWnd MAXIMIZED  ;
    ON PAINT aBtn2020c:=ACT_BOT_2020(aBtn2020c,oBar) ;
    ON INIT INICIA() ;
    VALID Cerrar(xAreaArt,MiAlias,MiAlias2,oWnd)
 


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
Image

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
JESUS MARIN
 
Posts: 176
Joined: Wed Jan 02, 2019 8:36 am

Re: Que control debo usar?

Postby JESUS MARIN » Thu Jan 05, 2023 10:29 am

Image
Jesús Marín
JESUS MARIN
 
Posts: 176
Joined: Wed Jan 02, 2019 8:36 am

Re: Que control debo usar?

Postby JESUS MARIN » Thu Jan 05, 2023 10:32 am

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

Code: Select all  Expand view
#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
JESUS MARIN
 
Posts: 176
Joined: Wed Jan 02, 2019 8:36 am

Re: Que control debo usar?

Postby Ariel » Thu Jan 05, 2023 10:39 am

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.
Ariel
 
Posts: 376
Joined: Wed Nov 29, 2006 1:51 pm
Location: Rosario - Argentina

Re: Que control debo usar?

Postby cmsoft » Thu Jan 05, 2023 4:08 pm

Jesus:
Muy buena la opción tuya, es muy ingeniosa y muy útil.
Felicitaciones
User avatar
cmsoft
 
Posts: 1290
Joined: Wed Nov 16, 2005 9:14 pm
Location: Mercedes - Bs As. Argentina

Re: Que control debo usar?

Postby leandro » Fri Jan 06, 2023 1:17 pm

Jesus gracias por responder

Si es lo que busco :D

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) ]
User avatar
leandro
 
Posts: 1676
Joined: Wed Oct 26, 2005 2:49 pm
Location: Colombia

Re: Que control debo usar?

Postby JESUS MARIN » Sat Jan 07, 2023 6:30 am

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.

Image

Code: Select all  Expand view
#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
JESUS MARIN
 
Posts: 176
Joined: Wed Jan 02, 2019 8:36 am


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 51 guests