Do jeito que crio no aplicativo, em array
Código: Selecionar todos
MenuOption( "Faturamento" )
MenuDrop()
MenuOption( "Pedidos/Notas/Manifesto" )
MenuDrop()
MenuOption( "Opções NFE/CTE/MDFE" )
MenuDrop()
MenuOption( "Preços/Comissões" )
MenuDrop()
MenuOption( "Percentuais das tabelas", "PJPTABPERCENTUAL" )
MenuOption( "Alteração dos Precos", "PPRETABELA" )
MenuOption( "Lista de Preços", "PPRERELTABGERAL" )
...
Código: Selecionar todos
#include "hmg.ch"
#include "i_altsyntax.ch"
STATIC nWindow := 1
PROCEDURE Main
LOCAL xDlg, cTitle := "test"
LOCAL aList := MenuCreate()
SET WINDOW MAIN OFF
SET WINDOW MODAL PARENT HANDLE ON
xDlg := NewControl( "W" )
DEFINE WINDOW ( xDlg ) ;
AT 0, 0 ;
WIDTH 1024 ;
HEIGHT 768 ;
TITLE cTitle
END WINDOW
ON KEY ESCAPE OF (xDlg) ACTION { || DoMethod( xDlg, "RELEASE" ) }
BrowseMenuBr( xDlg, 0, 0, aList, "MAIN OPTIONS", 0 )
DoMethod( xDlg, "CENTER" )
ACTIVATE WINDOW (xDlg)
RETURN
Código: Selecionar todos
STATIC FUNCTION BrowseMenuBr( xDlg, nRow, nCol, aList, cTitle, nStack )
LOCAL xBrowse, aBrowseList := {}, aItem, xDlgMenu
hb_Default( @nRow, 0 )
hb_Default( @nCol, 0 )
xBrowse := NewControl( "B" )
nStack += 1
FOR EACH aItem IN aList
AAdd( aBrowseList, { aItem[1] } )
NEXT
IF nStack == 1
xDlgMenu := xDlg
ELSE
xDlgMenu := NewControl( "W" )
DEFINE WINDOW ( xDlgMenu ) ;
AT nRow, nCol ;
WIDTH 200 ;
HEIGHT ( Len( aList ) + 4 ) * 20 ;
TITLE Upper( cTitle ) ;
NOSYSMENU ;
MODAL
END WINDOW
ON KEY ESCAPE OF (xDlgMenu) ACTION { || DoMethod( xDlgMenu, "RELEASE" ) }
ENDIF
DEFINE GRID ( xBrowse )
PARENT ( xDlgMenu )
ROW iif( nStack == 1, 30, 0 )
COL iif( nStack == 1, 30, 0 )
WIDTH 200
HEIGHT ( Len( aList ) + 2 ) * 20
HEADERS { Upper( cTitle ) }
WIDTHS { 200 }
VALUE 1
ITEMS aBrowseList
ONDBLCLICK { || Grid_Click( xDlgMenu, xBrowse, GetProperty( xDlgMenu, "ROW" ) + 30, GetProperty( xDlgMenu, "COL" ) + 100, aList, nStack ) }
END GRID
IF nStack != 1
ACTIVATE WINDOW (xDlgMenu)
ENDIF
RETURN Nil
STATIC FUNCTION Grid_Click( xDlg, xBrowse, nRow, nCol, aList, nStack )
LOCAL nValue
nValue := GetProperty( xDlg, xBrowse, "VALUE" )
IF Empty( aList[ nValue, 2 ] )
MsgBox( "Module " + aList[ nValue, 3 ] )
ELSE
BrowseMenuBr( xDlg, nRow, nCol, aList[ nValue, 2 ], aList[ nValue, 1 ], nStack )
ENDIF
RETURN Nil
Minha configuração de senhas é nesse estilo, só testando uma das possibilidades.
Usei o menu só pra cobaia mesmo.
Tá completo no anexo, fontes e compilado.
Nota: o interessante de teste assim, é que pega problemas em fonte pequeno, o que iria demorar num aplicativo.
Sim, peguei um buguizinho sim na definição de teclas, mas desse jeito funcionou.

