Vamos pensar.....
o menu fica em linha + opc, significa que a primeira opção fica em linha + 1.
Então vamos passar um traço em... LINHA
Começa aonde... se na coluna NCOLUNA começam as opções, então vai começar em coluna -1
Mas... vou pedir o menu na coluna 10 e ele vai começar na 9?
melhor ajustar o texto pra coluna + 1.
Ok.. linha nLinha, coluna nColuna....
E aonde termina? depende da quantidade de opções.
pensar... linha 10, uma opção... linha 10 é o traço, linha 11 é a opção, então vamos fazer o traço na linha 12
tá... essa 12 então equivale a nLINHA + quantidade + 1, 10 + 1 + 1, que dá 12
E coluna... parecido... nColuna + 30 + 2 (fixamos na rotina tamanho 30). porque + 2 e não + 1? porque o traço inicial entrou na contagem.
Então temos um quadrado que começa em nLinha, nColuna, e termina em nLinha + Len( aOpcoes ) + 1, nColuna + 32
@ nLinha, nColuna TO nLinha + Len( aOpcoes ) + 1, nColuna + 32
Fonte completo:
#include "inkey.ch"
PROCEDURE Main
LOCAL nOpc1 := 1, nOpc2 := 1, nOpc3 := 1
Menu( 5, 10, { "primeira", "segunda", "terceira", "quarta", "quinta" }, @nOpc1 )
Menu( 10, 15, { "primeira", "segunda", "terceira", "quarta", "quinta" }, @nOpc2 )
Menu( 15, 20, { "primeira", "segunda", "terceira", "quarta", "quinta" }, @nOpc3 )
RETURN
FUNCTION Menu( nLinha, nColuna, aOpcoes, nOpc )
LOCAL nCont, nKey
DO WHILE .T.
@ nLinha, nColuna TO nLinha + Len( aOpcoes ) + 1, nColuna + 32
FOR nCont = 1 TO Len( aOpcoes )
@ nLinha + nCont, nColuna + 1 SAY Pad( aOpcoes[ nCont ], 30 ) COLOR iif( nCont == nOpc, "N/W", "W/B" )
NEXT
nKey := Inkey(0)
DO CASE
CASE nKey == K_ESC ; EXIT
CASE nKey == K_UP ; nOpc := iif( nOpc == 1, Len( aOpcoes ), nOpc - 1 )
CASE nKey == K_DOWN; nOpc := iif( nOpc == Len( aOpcoes ), 1, nOpc + 1 )
ENDCASE
ENDDO
RETURN nOpc
Resultado
Mas... e o mouse?
Só pense um pouco.....
Se a rotina pode ser usada no aplicativo inteiro....
Significa que poderia alterar o aplicativo inteiro pra coisa mais simples...
E o mouse? usando no aplicativo inteiro, quando alterar pra mouse, vai ter alterado o aplicativo inteiro de uma vez!!!!
Entendeu? aplicativo INTEIRO.
Então... você está trabalhando para o mouse... sem mexer com mouse...
Seria parecido converter para Harbour....
Você não precisa converter o aplicativo inteiro, você pode ir organizando as coisas, e depois ao invés de muitas rotinas... bastaria mexer na rotina base de tudo.
Você tem muitos aplicativos pra mexer.... vai centralizando com o tempo... e isso já significa estar preparando pra troca.
No caso do menu... poderiam ser dezenas de menus pra colocar mouse... e depois das alterações, vai ser apenas um - colocando no central, vale pra todos.
Ah... mas tem menu horizontal e vertical....
Tudo bem, faz um pro horizontal e outro pro vertical...
Vai acrescentando recursos, pra atender exceções.
Não sei fazer... tudo bem... começa fazendo o que sabe, e com o tempo vai acrescentando o que for aprendendo.
Vai vendo o que vai precisando...
O que pode faltar nesse?
Talvez opção pra SAVE SCREEN e RESTORE SCREEN, pra chamar por uma rotina, o menu aparecer, e sumir depois de selecionar a opção.
Talvez um parâmetro... pra se um menu chamar submenu, não apagar o menu anterior da tela.
É assim que funciona... faz um básico... e aos poucos vai melhorando.
E fazendo um só pro aplicativo inteiro... pode alterar visual, mouse, ou tudo que quiser de uma vez.
Ao pegar uma rotina pronta, pode ser difÃcil entender.
Porque?
Ué... porque ele foi evoluindo com o tempo, de acordo com as necessidades, e pegando ele pronto, parece ter coisas que não precisa - ou ainda não precisou.