Tenho um sistema em CL 5.2, quando abro um Submenu, coloquei uma opcao pra fechar o Subm e retornar p/o menu principal, tipo:
1- cadastro (menu pricipal)
1.1 - cliente *
1.2 - fornecedor * *Submenu
1.3 - produto *
1.4 - fechar *
se eu quiser ir por ex. p/o subm do menu (2 - Movimento), tenho q selecionar a opao (1.4 - fechar) e abrir o menu (2- Movimento) p/entrar em seu Submenu, minha pergunta eh:
O q eu faço p/ poder pular de Submenu p/ Submenu usando so as setas ?
esta eh minha rotina de Submenu :
DO WHIL .T.
save scre to subcada
set color to n/n
@ 09,03 clear to 14,18
@ 09,03 to 14,18
set color to gr+/b
@ 08,02 clear to 13,17
@ 08,02 to 13,17 double
set color to gr+/b+,gr+/r+
sm = 1
@ 09,03 prom "1 þ Cliente "
@ 10,03 prom "2 þ CaminhÆo "
@ 11,03 prom "3 þ Motorista "
@ 12,03 prom "4 þ Fechar "
menu to sm
DO CASE
case sm = 1
do CadaClie
case sm = 2
do CadaCami
case sm = 3
do CadaMoto
case sm = 4
exit
otherwise
IF lastkey()=27
exit
endif
ENDCASE
rest scre from subcada
ENDDO
return
VALEU ! :?
Menus
Moderador: Moderadores
Olá Ale, tudo bem?
Eu monto o meus menus da seguinte forma:
Dessa forma eu consigo navegar pelos meus menus normalmente e quando abro a caixinha com os submenus não há necessidade de sair dela pra ir para o próximo menu do principal.
Não sei se é isso que você precisa, mas lá vai um exemplo:
*************************************************************
INICIALIZA MENU PRINCIPAL E SUB-MENUS.
*************************************************************
ABRIU = .T.
SETCOLOR(CMENU)
@ 23,15 CLEAR TO 23,68
DO WHILE PTRU
IF ABRIU
SET KEY 24 TO
ELSE
SET KEY 24 TO JERSEY
ENDIF
SETCOLOR("W+/R")
@ 24,69 SAY "|"
STRSAY(24,00,"Sistema de Contas a Pagar - Usu rio:")
@ 24,37 SAY VOPERA COLOR "GR+/R"
*PA_CLOCK(24,71,"GR+/R", .F.,0)
SETCOLOR(CMENU)
@ 23,15 CLEAR TO 23,68
@ 02,01 PROMPT " Tabelas " MESSAGE "Menu de Tabelas."
@ 02,14 PROMPT " Cadastros " MESSAGE "Menu de Cadastros."
@ 02,27 PROMPT " NF's " MESSAGE "Menu de Controle de Notas Fiscais."
@ 02,40 PROMPT " Contas Pagar" MESSAGE "Menu de Contas a Pagar."
@ 02,53 PROMPT " Relatorios " MESSAGE "Menu de Relatorios."
@ 02,66 PROMPT " Apoio " MESSAGE "Menu de Utilitarios do Sistema."
MENU TO OP
ABRIU = .T.
SET KEY 24 TO
DO CASE
CASE ( OP == 0 )
CLOSE DATABASES
PA_CLOCK(.F.)
RUN DEL *.TMP
RUN DEL C:\RELGCC*.NTX
SETCOLOR("W/N")
CLS
QUIT
CASE ( OP == 1 )
DO SMENU1 // chamada a função que monta o submenu 1
op := 1
CASE ( OP == 2 )
DO SMENU2
op := 2
CASE ( OP == 3 )
DO SMENU3
op := 3
CASE ( OP == 4 )
DO SMENU4
op := 4
CASE ( OP == 5 )
DO SMENU5
op := 5
CASE ( OP == 6 )
DO SMENU6
op := 6
ENDCASE
ENDDO
*************************************************************
PROCEDURE SMENU1
LOCAL AREA11
LIMPA_MENS()
AREA11 := SAVESCREEN(02,01,13,27)
DO WHILE PTRU
SETCOLOR(CMENU)
@ 23,15 CLEAR TO 23,68
JANELA2(03,01,09,26,CMENU)
@ 04,02 PROMPT " 1 ¯ Parametro " MESSAGE "Cadastra os Parametros do Sistema."
@ 05,02 PROMPT " 2 ¯ Tipo Fornecedor " MESSAGE "Tabela de Tipos de Fornecedores."
@ 06,02 PROMPT " 3 ¯ Tipo Cheque " MESSAGE "Tabela de Tipos de Cheques."
@ 07,02 PROMPT " 4 ¯ Centro de Custo " MESSAGE "Centro de Custo."
@ 08,02 PROMPT " 5 ¯ Feriados " MESSAGE "Feriados."
SET KEY 04 TO SETDIR
SET KEY 19 TO SETESQ
MENU TO OP11
SET KEY 04 TO
SET KEY 19 TO
DO CASE
CASE ( OP11 == 0 )
RESTSCREEN(02,01,13,27, AREA11)
EXIT
CASE ( OP11 == 1 )
DO FIR0106
op11 := 1
CASE ( OP11 == 2 )
DO FIR0101
op11 := 2
CASE ( OP11 == 3 )
DO FIR0103
op11 := 3
CASE ( OP11 == 4 )
DO FIR0107
op11 := 4
CASE ( OP11 == 5 )
DO FIR0108
op11 := 5
ENDCASE
ENDDO
//////
Eu dei o exemplo da montagem apenas de um submenu, eu uso dessa forma para todos os demais submenu.
Faça um teste, mude a montagem do seu menu e verifique se resolveu seu problema, eu creio que vai resolver.
Espero ter ajudado em algo.
Um abraço.
Cida
Eu monto o meus menus da seguinte forma:
Dessa forma eu consigo navegar pelos meus menus normalmente e quando abro a caixinha com os submenus não há necessidade de sair dela pra ir para o próximo menu do principal.
Não sei se é isso que você precisa, mas lá vai um exemplo:
*************************************************************
INICIALIZA MENU PRINCIPAL E SUB-MENUS.
*************************************************************
ABRIU = .T.
SETCOLOR(CMENU)
@ 23,15 CLEAR TO 23,68
DO WHILE PTRU
IF ABRIU
SET KEY 24 TO
ELSE
SET KEY 24 TO JERSEY
ENDIF
SETCOLOR("W+/R")
@ 24,69 SAY "|"
STRSAY(24,00,"Sistema de Contas a Pagar - Usu rio:")
@ 24,37 SAY VOPERA COLOR "GR+/R"
*PA_CLOCK(24,71,"GR+/R", .F.,0)
SETCOLOR(CMENU)
@ 23,15 CLEAR TO 23,68
@ 02,01 PROMPT " Tabelas " MESSAGE "Menu de Tabelas."
@ 02,14 PROMPT " Cadastros " MESSAGE "Menu de Cadastros."
@ 02,27 PROMPT " NF's " MESSAGE "Menu de Controle de Notas Fiscais."
@ 02,40 PROMPT " Contas Pagar" MESSAGE "Menu de Contas a Pagar."
@ 02,53 PROMPT " Relatorios " MESSAGE "Menu de Relatorios."
@ 02,66 PROMPT " Apoio " MESSAGE "Menu de Utilitarios do Sistema."
MENU TO OP
ABRIU = .T.
SET KEY 24 TO
DO CASE
CASE ( OP == 0 )
CLOSE DATABASES
PA_CLOCK(.F.)
RUN DEL *.TMP
RUN DEL C:\RELGCC*.NTX
SETCOLOR("W/N")
CLS
QUIT
CASE ( OP == 1 )
DO SMENU1 // chamada a função que monta o submenu 1
op := 1
CASE ( OP == 2 )
DO SMENU2
op := 2
CASE ( OP == 3 )
DO SMENU3
op := 3
CASE ( OP == 4 )
DO SMENU4
op := 4
CASE ( OP == 5 )
DO SMENU5
op := 5
CASE ( OP == 6 )
DO SMENU6
op := 6
ENDCASE
ENDDO
*************************************************************
PROCEDURE SMENU1
LOCAL AREA11
LIMPA_MENS()
AREA11 := SAVESCREEN(02,01,13,27)
DO WHILE PTRU
SETCOLOR(CMENU)
@ 23,15 CLEAR TO 23,68
JANELA2(03,01,09,26,CMENU)
@ 04,02 PROMPT " 1 ¯ Parametro " MESSAGE "Cadastra os Parametros do Sistema."
@ 05,02 PROMPT " 2 ¯ Tipo Fornecedor " MESSAGE "Tabela de Tipos de Fornecedores."
@ 06,02 PROMPT " 3 ¯ Tipo Cheque " MESSAGE "Tabela de Tipos de Cheques."
@ 07,02 PROMPT " 4 ¯ Centro de Custo " MESSAGE "Centro de Custo."
@ 08,02 PROMPT " 5 ¯ Feriados " MESSAGE "Feriados."
SET KEY 04 TO SETDIR
SET KEY 19 TO SETESQ
MENU TO OP11
SET KEY 04 TO
SET KEY 19 TO
DO CASE
CASE ( OP11 == 0 )
RESTSCREEN(02,01,13,27, AREA11)
EXIT
CASE ( OP11 == 1 )
DO FIR0106
op11 := 1
CASE ( OP11 == 2 )
DO FIR0101
op11 := 2
CASE ( OP11 == 3 )
DO FIR0103
op11 := 3
CASE ( OP11 == 4 )
DO FIR0107
op11 := 4
CASE ( OP11 == 5 )
DO FIR0108
op11 := 5
ENDCASE
ENDDO
//////
Eu dei o exemplo da montagem apenas de um submenu, eu uso dessa forma para todos os demais submenu.
Faça um teste, mude a montagem do seu menu e verifique se resolveu seu problema, eu creio que vai resolver.
Espero ter ajudado em algo.
Um abraço.
Cida
Ola, Bom dia para todos.
Do belo exemplo da Cida, ficaram as seguintes dúvidas:
Você usa assim: Do SMENU2, Do SMenu3, Do FIR0106, Do FIR0101, etc.
Essa forma é por conveniência, vício de programação ou TEm que ser assim (não poderia ser: SMENU2(), FIR0106() etc) ?? Qual a diferença se houver ??
A outra dúvida: Após DO SMENU2, OP:=2
DO SMENU3, op:=3
DO FIR0106, OP:=1
DO FIR0101, OP:=2 etc.
Quando se faz Menu to OP o Clipper não atribui o valor da opção automáticamente à variavel OP.??
Obs.: Não é nenhuma critica ao teu modo de programar é apenas curiosidade. Gostaria que dissesse por que é feito assim, quais as vantagens ou outros macetes que desconheço.
Muito Obrigado
Romario (agora no Vasco)
Do belo exemplo da Cida, ficaram as seguintes dúvidas:
Você usa assim: Do SMENU2, Do SMenu3, Do FIR0106, Do FIR0101, etc.
Essa forma é por conveniência, vício de programação ou TEm que ser assim (não poderia ser: SMENU2(), FIR0106() etc) ?? Qual a diferença se houver ??
A outra dúvida: Após DO SMENU2, OP:=2
DO SMENU3, op:=3
DO FIR0106, OP:=1
DO FIR0101, OP:=2 etc.
Quando se faz Menu to OP o Clipper não atribui o valor da opção automáticamente à variavel OP.??
Obs.: Não é nenhuma critica ao teu modo de programar é apenas curiosidade. Gostaria que dissesse por que é feito assim, quais as vantagens ou outros macetes que desconheço.
Muito Obrigado
Romario (agora no Vasco)
Olá Romário tudo bem?
Vamos as respostas de suas dúvidas:
você perguntou:
"Você usa assim: Do SMENU2, Do SMenu3, Do FIR0106, Do FIR0101, etc.
Essa forma é por conveniência, vício de programação ou TEm que ser assim (não poderia ser: SMENU2(), FIR0106() etc) ?? Qual a diferença se houver ?? "
Nos meus fontes eu uso dessa forma por vícios mesmo, eu geramente chamo as funções dessa forma: FUNCAO() e as procedures dessa outra forma Do SMENU2, apenas para diferenciar. Apenas vício de programador.
Só não funcionaria se a função fosse um nome de prg que se chama e não foi compilada aí a necessidade de se colocar Do FIR0106 (nesse caso eu tenho um prg com esse nome e o chamo dentro do meu principal e quando compilo o proprio prg principal o chama pra compilar, não sei se eu soube me expressar)
Mas tudo depende da forma com que cada um utiliza os comandos do clipper e a compilação dos fontes.
"A outra dúvida: Após DO SMENU2, OP:=2
DO SMENU3, op:=3
DO FIR0106, OP:=1
DO FIR0101, OP:=2 etc.
Quando se faz Menu to OP o Clipper não atribui o valor da opção automáticamente à variavel OP.??"
Sim, o Clipper atribui valor automaticamente.
Se criarmos um submenu precisaremos novamente de uma variável, concorda? É aí que se pode escolher outro nome, ou aproveitar a que já existe.
Se der outro nome não há necessidade de atribuir valores para a variável OP, mas se der o mesmo nome de variável para o submenu necessáriamente precisa atribuir valores.
Note que eu atribuo e depois utilizo outra variável no caso OP11.
Então eu posso simplesmente deixar de atribuir valores para OP.
Foi um pequeno errinho que eu nem percebi, e foi ótima sua observação pois posso corrigir optando por excluir os comandos de atribuição de valores ou deixando os submenus com a mesma variável
Entendeu?
Vantagens? Não sei te dizer em termos de performance.
Creio que colocar uma variável diferente pra cada menu feito é a melhor opção e melhor ainda pra não se perder.
Bom, espero ter esclarecido suas duas dúvidas e sempre que eu souber terei o maior prazer de compartilhar.
Um grande abraço!!
Cida
Vamos as respostas de suas dúvidas:
você perguntou:
"Você usa assim: Do SMENU2, Do SMenu3, Do FIR0106, Do FIR0101, etc.
Essa forma é por conveniência, vício de programação ou TEm que ser assim (não poderia ser: SMENU2(), FIR0106() etc) ?? Qual a diferença se houver ?? "
Nos meus fontes eu uso dessa forma por vícios mesmo, eu geramente chamo as funções dessa forma: FUNCAO() e as procedures dessa outra forma Do SMENU2, apenas para diferenciar. Apenas vício de programador.
Só não funcionaria se a função fosse um nome de prg que se chama e não foi compilada aí a necessidade de se colocar Do FIR0106 (nesse caso eu tenho um prg com esse nome e o chamo dentro do meu principal e quando compilo o proprio prg principal o chama pra compilar, não sei se eu soube me expressar)
Mas tudo depende da forma com que cada um utiliza os comandos do clipper e a compilação dos fontes.
"A outra dúvida: Após DO SMENU2, OP:=2
DO SMENU3, op:=3
DO FIR0106, OP:=1
DO FIR0101, OP:=2 etc.
Quando se faz Menu to OP o Clipper não atribui o valor da opção automáticamente à variavel OP.??"
Sim, o Clipper atribui valor automaticamente.
Se criarmos um submenu precisaremos novamente de uma variável, concorda? É aí que se pode escolher outro nome, ou aproveitar a que já existe.
Se der outro nome não há necessidade de atribuir valores para a variável OP, mas se der o mesmo nome de variável para o submenu necessáriamente precisa atribuir valores.
Note que eu atribuo e depois utilizo outra variável no caso OP11.
Então eu posso simplesmente deixar de atribuir valores para OP.
Foi um pequeno errinho que eu nem percebi, e foi ótima sua observação pois posso corrigir optando por excluir os comandos de atribuição de valores ou deixando os submenus com a mesma variável
Entendeu?
Vantagens? Não sei te dizer em termos de performance.
Creio que colocar uma variável diferente pra cada menu feito é a melhor opção e melhor ainda pra não se perder.
Bom, espero ter esclarecido suas duas dúvidas e sempre que eu souber terei o maior prazer de compartilhar.
Um grande abraço!!
Cida
Romario aqui vai mais um exemplo e so compilar e testar.
Código: Selecionar todos
clear
set talk off
set stat off
public level1, level2, level3, definicao:=.f.
level1=1
level2=1
level3=1
corpadrao="w/b,b/w"
boxcor="gr+/r,r/gr+"
setcolor(corpadrao)
set escape off
set wrap on
set score off
set message to 23 center
moldura(0,0,24,79,.f.,"","b+/g+")
fundo =savescreen(1,1,23,78)
keyboard chr(13)
do while (level1<>0)
restscreen(1,1,23,78,fundo)
moldura(1,1,3,78,.t.,"")
@ 02,02 prompt " Primeira opcao ";
message "texto da 1§ opcao do menu principal"
@ 02,21 prompt " Segunda opcao ";
message "texto da 2§ opcao do menu principal"
@ 02,40 prompt " Terceira opcao ";
message "texto da 3§ opcao do menu principal"
@ 02,59 prompt " Abadona o pragama ";
message "volta para dos"
menu to level1
if level1 <> 0
do sub_menu
else
level1=4
endif
enddo
return
**********************
function moldura(topo,esq,dir,baixo,duplo,texto,tinta)
if pcount()<6
@ 23,10 say "numero de parametros invalidos"
return (nil)
endif
if tinta = nil
tinta:= corpadrao
endif
setcolor(tinta)
if duplo
@ topo,esq clear to dir,baixo
@ topo,esq to dir,baixo double
else
@ topo,esq clear to dir,baixo
@ topo,esq to dir,baixo
endif
if len(texto)>0
tam:= baixo-esq
novapos:= (tam-len(texto))/2
@ topo,esq+novapos say texto
endif
setcolor(corpadrao)
return (nil)
*********************
function mensagem(ls,cs,texto,tempo)
if cs>19
cs:= 19
endif
telam:= savescreen(ls,cs,ls,cs+60)
@ ls,cs say space(60)
@ ls,cs say texto
if tempo != nil
inkey(tempo)
else
inkey(2)
endif
restscreen(ls,cs,ls,cs+60,telam)
return (nil)
************************
procedure sub_menu
ligaseta()
do case
case level1=1
moldura(3,2,7,28,.t.,"",boxcor)
@ 04,03 prompt "A primeira sub-opcao "
@ 05,03 prompt "B segunda sub-opcao "
@ 06,03 prompt "C terceira sub-opcao "
menu to level2
do case
case level2=1
desligaseta()
geramanut()
ligaseta()
case level2=2
mensagem(23,10, "opcao nao disponivel",3)
case level2=3
mensagem(23,10,"opcao nao disponivel",3)
endcase
case level1=2
moldura(3,19,6,44,.t.,"",boxcor)
@ 04,20 prompt "A. primeira sub-opcao "
@ 05,20 prompt "B. segunda sub-opcao "
menu to level2
do case
case level2=1
desligaseta()
mensagem(23,10,"foi acionada a primeira opcao")
ligaseta()
case level2=2
desligaseta()
mensagem(23,10,"foi acionada a segunda opcao")
ligaseta()
endcase
case level1=3
moldura(3,38,5,63,.t.,"",boxcor)
@ 04,39 prompt "A. primeira sub-opcao "
menu to level2
do case
case level2=1
desligaseta()
endcase
case level1=4
Moldura(3,56,5,76,.t.,"",boxcor)
@ 04,57 prompt "A. volta ao Dos "
menu to level2
do case
case level2=1
close all
quit
endcase
endcase
if level2=0
level2=1
else
keyboard chr(13)
endif
set key 19 to
set key 4 to
return
procedure left_arrow
parameter pn,pl,rv
keyboard chr(27)+chr(19)+chr(13)
return
********************
procedure right_arrow
parameter pn,pl,rv
keyboard chr(27)+chr(4)+chr(13)
return
*******************
procedure ligaseta
set key 19 to left_arrow
set key 4 to right_arrow
*******************
procedure desligaseta
set key 19 to
set key 4 to
*******************
procedure geramanut
do while .t.
moldura(7,12,11,38,.t.,"","w/rg")
@ 08,13 prompt "A. opcao 1 terceiro nivel"
@ 09,13 prompt "B. opcao 2 terceiro nivel"
@ 10,13 prompt "C. volta ao menu anterior"
menu to level3
do case
case level3=1
mensagem(23,10,"foi acionada a opcao A do terceiro menu")
case level3=2
mensagem(23,10,"foi acionada a opcao B do terceiro menu")
case level3=3
exit
endcase
level3=1
enddo
return
Daniel
Harbour + Minigui + dbfcdx
Marinas-Gui Pena que parou o suporte
Harbour + Minigui + dbfcdx
Marinas-Gui Pena que parou o suporte

r]