Menus

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

Avatar do usuário
Ale SB
Usuário Nível 3
Usuário Nível 3
Mensagens: 201
Registrado em: 20 Jul 2004 17:30
Localização: Campo Grande / MS

Menus

Mensagem por Ale SB »

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 ! :?
Imagemr]
Cida
Usuário Nível 1
Usuário Nível 1
Mensagens: 15
Registrado em: 25 Jul 2004 20:39
Localização: São Paulo

Mensagem por Cida »

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
ROMARIO
Usuário Nível 1
Usuário Nível 1
Mensagens: 35
Registrado em: 06 Jul 2004 11:25
Localização: AGUDO - RS

Mensagem por ROMARIO »

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)
Cida
Usuário Nível 1
Usuário Nível 1
Mensagens: 15
Registrado em: 25 Jul 2004 20:39
Localização: São Paulo

Mensagem por Cida »

Olá Romário tudo bem? :D

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
Avatar do usuário
Daniel
Usuário Nível 3
Usuário Nível 3
Mensagens: 373
Registrado em: 13 Ago 2003 22:42
Localização: Apucarana - PR

Mensagem por Daniel »

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
ROMARIO
Usuário Nível 1
Usuário Nível 1
Mensagens: 35
Registrado em: 06 Jul 2004 11:25
Localização: AGUDO - RS

Mensagem por ROMARIO »

Caros Colegas.

Agradeço à Cida e ao Daniel pelas respostas. Agora está tudo CRISTALINO.

Muito Obrigado.


Romario
Avatar do usuário
Ale SB
Usuário Nível 3
Usuário Nível 3
Mensagens: 201
Registrado em: 20 Jul 2004 17:30
Localização: Campo Grande / MS

Mensagem por Ale SB »

Valeu galera , pelos exemplos das rotinas de sub, e pelas perguntas respondidas, ajudou muito, o meu sistema ja ta rodando blzinha.

@bracos, Ale :D
Imagemr]
Responder