O menu das opções.... esse é um caso a parte...
(Sim, o que parece apenas uma mensagem é um menu)
STATIC FUNCTION FrmMenu( cOpc, cOpcTxt )
LOCAL nKey, nKeyList := {}, nPos, aOpcList := {}, nOpc, nCont
IF "I" $ cOpcTxt
AAdd( aOpcList, { "I", "<I>Inclui" } )
AAdd( nKeyList, { Asc( "I" ), "I" } )
AAdd( nKeyList, { Asc( "i" ), "I" } )
AAdd( nKeyList, { K_INS, "I" } )
ENDIF
IF "A" $ cOpcTxt
AAdd( aOpcList, { "A", "<A>Altera" } )
AAdd( nKeyList, { Asc( "A" ), "A" } )
AAdd( nKeyList, { Asc( "a" ), "A" } )
ENDIF
IF "E" $ cOpcTxt
AAdd( aOpcList, { "E", "<E>Exclui" } )
AAdd( nKeyList, { Asc( "E" ), "E" } )
AAdd( nKeyList, { Asc( "e" ), "E" } )
AAdd( nKeyList, { K_DEL, "E" } )
ENDIF
AAdd( aOpcList, { "C", "<C>Consulta" } )
AAdd( nKeyList, { Asc( "C" ), "C" } )
AAdd( nKeyList, { Asc( "c" ), "C" } )
AAdd( aOpcList, { "+", "<+>Seguinte" } )
AAdd( nKeyList, { K_PGDN, "+" } )
AAdd( aOpcList, { "-", "<->Anterior" } )
AAdd( nKeyList, { K_PGUP, "-" } )
AAdd( aOpcList, { "P", "<P>Primeiro" } )
AAdd( nKeyList, { Asc( "P" ), "P" } )
AAdd( nKeyList, { Asc( "p" ), "P" } )
AAdd( nKeyList, { K_HOME, "P" } )
AAdd( aOpcList, { "U", "<U>Ultimo" } )
AAdd( nKeyList, { Asc( "U" ), "U" } )
AAdd( nKeyList, { Asc( "u" ), "U" } )
AAdd( nKeyList, { K_END, "U" } )
IF "D" $ cOpcTxt
AAdd( aOpcList, { "D", "<D>Detalhe" } )
AAdd( nKeyList, { Asc( "D" ), "D" } )
AAdd( nKeyList, { Asc( "d" ), "D" } )
ENDIF
IF "F" $ cOpcTxt
AAdd( aOpcList, { "F", "<F>Financeiro" } )
AAdd( nKeyList, { Asc( "F" ), "F" } )
AAdd( nKeyList, { Asc( "f" ), "F" } )
ENDIF
IF "X" $ cOpcTxt
AAdd( aOpcList, { "X", "<X>Xml " } )
AAdd( nKeyList, { Asc( "X" ), "X" } )
AAdd( nKeyList, { Asc( "x" ), "X" } )
ENDIF
AAdd( aOpcList, { Chr( K_ESC ), "<ESC>Sai" } )
DO WHILE .T.
nOpc := ASCan( aOpcList, { | e | e[ 1 ] == cOpc } )
Mensagem()
FOR nCont = 1 TO Len( aOpcList )
IF Col() + Len( aOpcList[ nCont, 2 ] ) > MaxCol()
@ Row() + 1, 0 SAY ""
ENDIF
@ Row(), Col() SAY aOpcList[ nCont, 2 ] COLOR iif( nCont == nOpc, "N/W", "W/N" )
@ Row(), Col() SAY " " COLOR "W/N"
NEXT
nKey := Inkey(0)
IF nKey == K_ESC
EXIT
ENDIF
nPos := AScan( nKeyList, { | e | e[ 1 ] == nKey } )
IF nPos != 0
cOpc := nKeyList[ nPos, 2 ]
EXIT
ENDIF
DO CASE
CASE nKey == K_RIGHT ; nOpc := iif( nOpc == Len( aOpcList ), 1, nOpc + 1 ); cOpc := aOpcList[ nOpc, 1 ]
CASE nKey == K_LEFT ; nOpc := iif( nOpc == 1, Len( aOpcList ), nOpc - 1 ); cOpc := aOpcList[ nOpc, 1 ]
CASE nKey == K_ENTER ; EXIT
ENDCASE
ENDDO
Mensagem()
RETURN cOpc
O que tem especial no menu:
Aceita Insert, Delete, PgUp, PgDn, Home, End, P(primeiro), U(ultimo), +(Seguinte), -(anterior), aceita passear com as setas, só não aceita mouse porque Flagship não tem isso.
E se uma linha não for suficiente, são usadas duas linhas.
relembrar o menu discreto:
E se futuramente usar Harbour e colocar buttons... é só o button fazer o KEYBOARD correspondente à opção....
Importante:
Para o restante do programa, tanto faz, as outras rotinas nem sabem que o menu existe.
As outras rotinas só precisam saber qual é a opção.
Conclusão:
Cada parte do fonte cuida de "sua parte"
Manutenção fácil, só precisa olhar a parte que interessa.
Se fosse um fonte linguição, tudo dentro de um DO WHILE.... ferrou... ainda mais se fosse usando o EDIT do DOS.