Não tem nada a ver PRIVATE ou PUBLIC.
Como faço o meu, desde os tempos do Clipper:
Código: Selecionar todos
FUNCTION MenuCria()
MEMVAR nMenuLevel, oMenuOptions
PRIVATE nMenuLevel, oMenuOptions
nMenuLevel := 0
oMenuOptions := {}
MenuOption( "Movto" )
MenuDrop()
MenuOption( "Pedidos/Notas Fiscais" )
MenuDrop()
MenuOption( "Orçamentos/Pedidos", "P0600PED" )
MenuOption( "Emissor JPA", "PEMISSOR" )
MenuOption( "Nota Fiscal (Serviços)", { || PNOT0010() } )
MenuUnDrop()
MenuUnDrop()
...
A rotina acima é a montagem do menu.
Normalmente uso o nome e não codeblock, porque através dele é que verifico se usuário tem acesso.
Código: Selecionar todos
STATIC FUNCTION MenuDrop()
MEMVAR nMenuLevel
nMenuLevel++
RETURN NIL
STATIC FUNCTION MenuUnDrop()
MEMVAR nMenuLevel
nMenuLevel--
RETURN NIL
Rotinas acima sobem ou descem o nível
Código: Selecionar todos
STATIC FUNCTION MenuOption( cCaption, oModule )
LOCAL nCont, oLastMenu
MEMVAR nMenuLevel, oMenuOptions
oLastMenu := oMenuOptions
FOR nCont = 1 TO nMenuLevel
oLastMenu := oLastMenu[ Len( oLastMenu ) ]
IF ValType( oLastMenu[ 2 ] ) # "A"
oLastMenu[ 2 ] := {}
ENDIF
oLastMenu := oLastMenu[ 2 ]
NEXT
AAdd( oLastMenu, { cCaption, {}, oModule } )
RETURN NIL
Montagem do array.
O array é composto por título, array, nome/codeblock
O array (segundo elemento) é pra submenus
Então, não tem limite nenhum de níveis.
O array é criado normalmente, e elementos adicionados, usando variáveis private.
É praticamente o mesmo que você usa pra criar o array.
Talvez a declaração MEMVAR? Se na falta dela o compilador considerar PRIVATE, serão criadas variáveis novas!!!!
Por falar nisso... o modo que passei em outros posts, ou usaria o array como local, ou nem precisaria passar como parâmetro já que é private.
Olhando o post acima, também pensei numa coisa:
Dá uma olhada também como o ACTION é definido no CH.
De repente o compilador troca pra { || suaaction }, e aí nada que faça vai funcionar.
Nesse caso a saída seria escrever baseado no que está no CH, já convertido.
*** como disse antes, tem coisa que depende do comportamento da LIB utilizada, e quem usa a LIB sabe dizer melhor.