Página 1 de 1

Menu não aparece

Enviado: 31 Mar 2025 15:06
por JoséQuintas
fwmenu.png
No dlgauto deu certinho, aqui não.

Código: Selecionar todos

/*
ze_fwMenu
*/

#include "fivewin.ch"
#include "frm_Class.ch"

FUNCTION ze_FWMenu( aList )

   LOCAL oDlg, oMenu

   DEFINE DIALOG oDlg FROM 0, 0 TO AppHeight(), AppWidth() PIXEL ;
      TITLE "JPA " + AppVersaoEXE() ICON "AppIcon"
   oDlg:bInit := { || BuildFWMenu( @oMenu, aList, .T., @oDlg ) }
   ACTIVATE DIALOG oDlg CENTER

   RETURN NIL

FUNCTION BuildFWMenu( oMenu, aList, lBegin, oDlg )

   LOCAL oElement, cbCode, xFrmNameTxt, xFrmName, oFont

   IF lBegin
      DEFINE FONT oFont NAME APP_FONTNAME SIZE 0, -APP_FONTSIZE_NORMAL WEIGHT 300
      MENU oMenu OF oDlg FONT oFont
   ENDIF

   FOR EACH oElement IN aList
      IF Len( oElement[ 2 ] ) == 0
         xFrmName := oElement[ 3 ]
         IF ValType( xFrmName ) == "C"
            xFrmNameTxt := AppEmpresaApelido() + " (" + AppUserName() + ") (" + xFrmName + ") " + Upper( oElement[ 1 ] )
            cbCode     := [{ || RunModule( "] + xFrmName + [", "] + xFrmNameTxt + [" ) }]
            MENUITEM oElement[ 1 ] ACTION ( ( oMenuItem ), &( cbCode ) )
         ELSE
            MENUITEM oElement[ 1 ] ACTION ( ( oMenuItem ), oElement[ 3 ] )
         ENDIF
      ELSE
         MENUITEM oElement[1]
         MENU
         BuildFWMenu( @oMenu, oElement[ 2 ], .F., @oDlg )
         ENDMENU
      ENDIF
   NEXT

   IF lBegin
      oDlg:SetMenu( oMenu )
   ENDIF

   RETURN NIL

Menu não aparece

Enviado: 31 Mar 2025 19:18
por JoséQuintas
Resolvido.
Não formatei no dlgauto direito, que foi o que usei como ponto de partida.
Faltou o ENDMENU principal.

Código: Selecionar todos

IF  lBegin
   ENDMENU
   oDlg:SetMenu( oMenu )
ENDIF

Menu não aparece

Enviado: 31 Mar 2025 21:26
por JoséQuintas
Depois eram as execuções que não apareciam.

Mais outra situação onde o próprio fivewin causa limitação, ao usar comandos traduzidos por CH dele mesmo.

Alterei aqui:

Código: Selecionar todos

            bCode := &(bCode)
            FWMenuItem( oElement[1], bCode )
Criei aqui

Código: Selecionar todos

STATIC FUNCTION FWMenuItem( cText, bCode )

   MenuItem cText ACTION ( ( oMenuItem ), Eval( bCode ) )

   RETURN Nil
Até procurei pra usar função ou classe, mas é tanto parâmetro, que só complicaria.
Pensando bem, simplificar mais.

Menu não aparece

Enviado: 31 Mar 2025 21:49
por JoséQuintas
Já que tem função separada, fonte mais legível assim.
E o principal, fivewin faz direito.
Também eliminei a necessidade do Eval().

Código: Selecionar todos

         IF ValType( xFrmName ) == "C"
            FWMenuItem( oElement[ 1 ], xFrmName )
         ELSE
...
STATIC FUNCTION FWMenuItem( cCaption, cName )

   LOCAL cText

   cText := AppEmpresaApelido() + " (" + AppUserName() + ") (" + ;
      cName + ") " + Upper( cCaption )

   MenuItem cCaption ACTION ( ( oMenuItem ), RunModule( cName, cText ) )

   RETURN Nil