Página 1 de 3

Criar menu

Enviado: 07 Nov 2018 13:22
por jeferson.stefani
Olá amigos, tudo bem?

Sou desenvolvedor de sistemas, atualmente trabalho com delphi/lazarus e algumas tecnologias voltadas ao desenvolvimento web. Estou iniciando meus estudos com o clipper, então peço um pouco de paciência pelas perguntas que possa fazer...rs

Estou elaborando um sistema simples para efeitos didáticos, e uma dúvida que me bateu é com relação a criação de menus horizontais.

Na imagem abaixo, esse tipo de menu é confeccionado utilizando a função achoice?
CLIP001.jpg
Na imagem abaixo, esse tipo de menu é confeccionado utilizando o comando prompt?
CLIP002.jpg
Att:
Jeferson Stefani

Criar menu

Enviado: 07 Nov 2018 15:45
por NiltonGM
Rapaiz!!! Essa é do fundo do baú... eu usava este esquema de menu na horizontal desde o Summer87 até o Clipper 5.3b, lembro de usar Achoice(), não achei mais meus fontes antigos que compactei a séculos atrás para verificar o esquema. Já foram tantas trocas de PCs, Notebooks, HD's pifados que não consigo mais ressuscitar essas relíquias...
Sorry

Criar menu

Enviado: 07 Nov 2018 16:09
por jeferson.stefani
Boa tarde!

Nilton,

Obrigado por responder minha dúvida. Só queria mesmo saber se meu raciocínio estava correto, mas por sua resposta já consegui me orientar.

Att:
Jeferson Stefani

Criar menu

Enviado: 07 Nov 2018 19:15
por JoséQuintas
Os dois podem ser feitos por PROMPT ou Achoice ou TBrowse.
E podem ser feitos via programação também, e até permitir o uso de mouse.

Criar menu

Enviado: 07 Nov 2018 21:24
por jeferson.stefani
Boa noite!

Obrigado por sua resposta José.

Vou trabalhar sobre as dicas e volto para postar o resultado.

Criar menu

Enviado: 09 Nov 2018 01:50
por Ruben Dario
Gracias por Tu ejemplo
Lo compilo y me da este error.
Lo Comilo asi hbmk2 arquivo.hbp

Código: Selecionar todos

J:\Estaba en Unidad G\Descargas_Varias\Clipper\Cear Menu>hbmk2 arquivo.hbp
hbmk2: Harbour: Compilando módulos...
Harbour 3.2.0dev (r1809141336)
Copyright (c) 1999-2018, https://harbour.github.io/
Compiling 'menu.prg'...
menu.prg(9) Error E0008  Unknown result marker in #translate/#command
menu.prg(89) Error E0030  Syntax error "syntax error at 'LSELECTABLE'"
menu.prg(270) Error E0030  Syntax error "syntax error at 'NMOUSER'"
menu.prg(271) Error E0030  Syntax error "syntax error at 'NMOUSEC'"
menu.prg(272) Error E0030  Syntax error "syntax error at 'L5THELEMENT'"
menu.prg(299) Error E0030  Syntax error "syntax error at 'NRI'"
menu.prg(300) Error E0030  Syntax error "syntax error at 'NCI'"
menu.prg(301) Error E0030  Syntax error "syntax error at 'NRF'"
menu.prg(302) Error E0030  Syntax error "syntax error at 'NCF'"
9 errors

No code generated.
hbmk2[arquivo]: Error: Running Harbour compiler (built-in). 1
(K:\HARBOUR_V\harbour_bcc73\BIN\harbour.exe) -n2 menu.prg BUNGE.prg -o.hbmk\win\bcc\ -iK:\C_BCC\BCC73\Include -iK:\C_BCC\BCC73\Include\dinkumware -iK:\C_BCC\BCC73\Include\windows\crtl -iK:\C_BCC\BCC73\Include\windows\rtl -iK:\C_BCC\BCC73\Include\windows\sdk -iK:\HARBOUR_V\harbour_bcc73\include

Criar menu

Enviado: 09 Nov 2018 09:39
por JoséQuintas
Não foi feliz no seu exemplo, tem coisa errada aí.
d:\temp\menu>hbmk2 proj
hbmk2: Processando opções do ambiente: -comp=mingw
hbmk2: Processando arquivo de configuração: d:\harbour\bin\hbmk.hbc
hbmk2 [proj]: Warning: Ignoring .hbc file specified via -l option '-lhbnf.hbc'
in proj.hbp:7. Specify it as 'hbnf.hbc' instead.
hbmk2 [proj]: Warning: Ignoring .hbc file specified via -l option '-lhbct.hbc'
in proj.hbp:8. Specify it as 'hbct.hbc' instead.
Harbour 3.4.0dev (b79d07e0e6) (2018-05-01 02:09)
Copyright (c) 1999-2018, https://github.com/JoseQuintas/harbour34/
Compiling 'menu.prg'...
Lines 787, Functions/Procedures 9
Generating C source output to 'C:\Users\joseq\AppData\Local\Temp\hbmk_gi6g88.dir\menu.c'... Done.
Compiling 'BUNGE.prg'...
Lines 2369, Functions/Procedures 32
Generating C source output to 'C:\Users\joseq\AppData\Local\Temp\hbmk_gi6g88.dir\BUNGE.c'... Done.
C:/Users/joseq/AppData/Local/Temp/hbmk_gi6g88.dir/menu.o:menu.c:(.data+0x208): undefined reference to `HB_FUN_KSETINS'
C:/Users/joseq/AppData/Local/Temp/hbmk_gi6g88.dir/menu.o:menu.c:(.data+0x218): undefined reference to `HB_FUN_KSETCAPS'
C:/Users/joseq/AppData/Local/Temp/hbmk_gi6g88.dir/menu.o:menu.c:(.data+0x228): undefined reference to `HB_FUN_KSETNUM'
C:/Users/joseq/AppData/Local/Temp/hbmk_gi6g88.dir/menu.o:menu.c:(.data+0x238): undefined reference to `HB_FUN_KSETSCROLL'
C:/Users/joseq/AppData/Local/Temp/hbmk_gi6g88.dir/menu.o:menu.c:(.data+0x278): undefined reference to `HB_FUN_FT_MGETX'
C:/Users/joseq/AppData/Local/Temp/hbmk_gi6g88.dir/menu.o:menu.c:(.data+0x288): undefined reference to `HB_FUN_FT_MGETY'
C:/Users/joseq/AppData/Local/Temp/hbmk_gi6g88.dir/BUNGE.o:BUNGE.c:(.data+0xb8): undefined reference to `HB_FUN_FT_AEMAXLEN'
C:/Users/joseq/AppData/Local/Temp/hbmk_gi6g88.dir/BUNGE.o:BUNGE.c:(.data+0x408): undefined reference to `HB_FUN_TOKEN'
C:/Users/joseq/AppData/Local/Temp/hbmk_gi6g88.dir/BUNGE.o:BUNGE.c:(.data+0x4a8): undefined reference to `HB_FUN_FT_MSHOWCRS'
C:/Users/joseq/AppData/Local/Temp/hbmk_gi6g88.dir/BUNGE.o:BUNGE.c:(.data+0x508): undefined reference to `HB_FUN_FT_MHIDECRS'
d:/harbour/lib/win/mingw\libgtwvG.a(gtwvgd.o):(.text+0x12a9): undefined reference to `hbwapi_LoadLibrarySystemVM'
d:/harbour/lib/win/mingw\libgtwvG.a(wvgcuig.o):(.text+0x2d4): undefined reference to `hbwapi_is_HANDLE'
d:/harbour/lib/win/mingw\libgtwvG.a(wvgcuig.o):(.text+0x41b): undefined reference to `hbwapi_par_HFONT'
d:/harbour/lib/win/mingw\libgtwvG.a(wvgcuig.o):(.text+0x44c): undefined reference to `hbwapi_par_HPEN'
d:/harbour/lib/win/mingw\libgtwvG.a(wvgcuig.o):(.text+0x47d): undefined reference to `hbwapi_par_HBRUSH'
d:/harbour/lib/win/mingw\libgtwvG.a(wvgcuig.o):(.text+0x5b9): undefined reference to `__hbwapi_par_handle'
d:/harbour/lib/win/mingw\libgtwvG.a(wvgcuig.o):(.text+0x2841): undefined reference to `hbwapi_par_HFONT'
d:/harbour/lib/win/mingw\libgtwvG.a(wvgcuig.o):(.text+0x2af8): undefined reference to `hbwapi_is_HANDLE'
d:/harbour/lib/win/mingw\libgtwvG.a(wvgcuig.o):(.text+0x2bca): undefined reference to `__hbwapi_par_handle'
d:/harbour/lib/win/mingw\libgtwvG.a(wvgcore.o):(.text+0x2417): undefined reference to `hbwapi_par_HDC'
d:/harbour/lib/win/mingw\libgtwvG.a(wvgcore.o):(.text+0x31a4): undefined reference to `hbwapi_par_HFONT'
d:/harbour/lib/win/mingw\libgtwvG.a(wvgcore.o):(.text+0x33ec): undefined reference to `hbwapi_par_HFONT'
d:/harbour/lib/win/mingw\libgtwvG.a(wvgcore.o):(.text+0x6a0f): undefined reference to `hbwapi_is_HANDLE'
d:/harbour/lib/win/mingw\libgtwvG.a(wvgcore.o):(.text+0x6b21): undefined reference to `__hbwapi_par_handle'
d:/harbour/lib/win/mingw\libgtwvG.a(wvgcore.o):(.text+0x7df4): undefined reference to `hbwapi_par_HFONT'
d:/harbour/lib/win/mingw\libgtwvG.a(wvgcore.o):(.text+0x7f08): undefined reference to `hbwapi_par_HFONT'
d:/harbour/lib/win/mingw\libgtwvG.a(wvgcore.o):(.text+0x85eb): undefined reference to `__hbwapi_par_handle'
d:/harbour/lib/win/mingw\libgtwvG.a(wvgcore.o):(.text+0x8d9a): undefined reference to `__hbwapi_parv_handle'
d:/harbour/lib/win/mingw\libgtwvG.a(wvgcore.o):(.text+0x8f4e): undefined reference to `__hbwapi_parv_handle'
collect2.exe: error: ld returned 1 exit status
hbmk2 [proj]: Erro: Executando linkeditor. 1
gcc.exe C:/Users/joseq/AppData/Local/Temp/hbmk_gi6g88.dir/menu.o C:/Users/joseq/AppData/Local/Temp/hbmk_gi6g88.dir/BUNGE.o C:/Users/joseq/AppData/Local/Temp/hbmk_gi6g88.dir/hbmk_g1wgoh.o -m32 -Wl,--nxcompat -Wl,--dynamicbase -Wl,--pic-executable,-e,_mainCRTStartup -mwindows -Wl,--start-group -Wl,-Bstatic -lgtwvG -lhbextern -lhbdebug -lhbvmmt -lhbrtl -lhblang -lhbcpage -lgtcgi -lgtstd -lgtpca -lgtwin -lgtwvt -lgtgui -lhbrdd -lhbusrrdd -lrddntx -lrddcdx -lrddnsx -lrddfpt -lhbrdd -lhbhsx -lhbsix -lhbmacro -lhbcplr -lhbpp -lhbcommon -lhbmainwin -lkernel32 -luser32 -lgdi32 -ladvapi32 -lws2_32 -liphlpapi -lwinspool -lcomctl32 -lcomdlg32 -lshell32 -luuid -lole32 -loleaut32 -lmpr -lwinmm -lmapi32 -limm32 -lmsimg32 -lwininet -lhbpcre2 -lhbzlib -Wl,-Bdynamic -Wl,--end-group -s -omenu.exe -Ld:/harbour/lib/win/mingw -Ld:/cdrom/fontes/integra/sefazclass -Ld:/cdrom/fontes/integra/josequintas -Ld:/cdrom/fontes/integra/josequintas/bostaurus -Ld:/github/allgui/hmg3 -Ld:/github/allgui/hmge -Ld:/github/allgui/hwgui -Ld:/github/allgui/oohg

hbmk2: Hint: Add input file 'hbnf.hbc' for missing Harbour function(s):
ft_MHideCrs(), ft_MShowCrs(), ft_AEMaxLen(), ft_MGetY(), ft_MGetX()
hbmk2: Hint: Add input file 'hbct.hbc' for missing Harbour function(s):
Token(), KSetScroll(), KSetNum(), KSetCaps(), KSetIns()
hbmk2: Hint: Add input file 'gtwvG.hbc' instead of specifying raw library using
'-lgtwvG' or 'libs=gtwvG'.

Criar menu

Enviado: 09 Nov 2018 09:47
por JoséQuintas
Seu projeto está assim:
-gui
-gtwvt
-gtwvG
# -inc
menu.prg
BUNGE.prg
-lhbnf.hbc
-lhbct.hbc
o correto é assim:
menu.prg
BUNGE.prg
hbnf.hbc
hbct.hbc
resultado:
d:\temp\menu>hbmk2 proj
hbmk2: Processando opções do ambiente: -comp=mingw
hbmk2: Processando arquivo de configuração: d:\harbour\bin\hbmk.hbc
Harbour 3.4.0dev (b79d07e0e6) (2018-05-01 02:09)
Copyright (c) 1999-2018, https://github.com/JoseQuintas/harbour34/
Compiling 'menu.prg'...
Lines 787, Functions/Procedures 9
Generating C source output to 'C:\Users\joseq\AppData\Local\Temp\hbmk_3inku7.dir\menu.c'... Done.
Compiling 'BUNGE.prg'...
Lines 2369, Functions/Procedures 32
Generating C source output to 'C:\Users\joseq\AppData\Local\Temp\hbmk_3inku7.dir\BUNGE.c'... Done.
Ultimate Packer for eXecutables
Copyright (C) 1996 - 2017
UPX 3.94w Markus Oberhumer, Laszlo Molnar & John Reiser May 12th 2017

File size Ratio Format Name
-------------------- ------ ----------- -----------
1087488 -> 412160 37.90% win32/pe menu.exe

Packed 1 file.
menu.png

Criar menu

Enviado: 09 Nov 2018 09:50
por JoséQuintas
E desse jeito, acrescentando GTWVG.HBC ok.

gtwvg.png

Criar menu

Enviado: 09 Nov 2018 10:05
por JoséQuintas
Me chamou a atenção:
Como pode funcionar uma compilação num lugar e em outro não?

Talvez....
o Harbour 3.2 aceite errado, e o 3.4 não.
Mas no 3.4 mostra o que está errado no projeto.

Talvez a ordem das LIBs... não testei invertendo.

Mas não reparei... aqui é CLIPPER.
Não sei se é pra Clipper, ou se a pergunta foi no lugar errado.

Uso o meu desde os tempos do Clipper, mas talvez precise ajuste pra Clipper, e o meu está preso ao meu estilo de programação.

https://github.com/JoseQuintas/JoseQuin ... a_menu.prg

Já testei o mesmo formato de criação de menu para outras LIbs.
Meu menu em ação, nos dois formatos que o aplicativo permite.
menu.png

Criar menu

Enviado: 09 Nov 2018 10:16
por JoséQuintas
Versão miniatura do meu menu:

Código: Selecionar todos

#include "inkey.ch"

PROCEDURE Main

   LOCAL aMenu, nOpc, nCont, nKey

   aMenu := { ;
      { 1, 5, "primeiro", "prog1" }, ;
      { 2, 5, "segundo", "prog2" }, ;
      { 3, 5, "terceiro", "Prog3" } }
   nOpc := 1

   DO WHILE .T.
      FOR nCont = 1 TO Len( aMenu )
         @ aMenu[ nCont, 1 ], aMenu[ nCont, 2 ] SAY aMenu[ nCont, 3 ] ;
         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( aMenu ), nOpc - 1 )
      CASE nKey == K_DOWN; nOpc := iif( nOpc == Len( aMenu ), 1, nOpc + 1 )
      CASE nKey == K_ENTER; Do( aMenu[ nCont, 4 ] )
      ENDCASE
   ENDDO


   RETURN

Criar menu

Enviado: 09 Nov 2018 12:10
por JoséQuintas
E "aperfeiçoando" um pouco.

Código: Selecionar todos

      CASE nKey == K_ENTER; cTela := SaveScreen(); Do( aMenu[ nCont, 4 ] ); RestScreen( cTela )
Deste jeito não precisa se preocupar com tela, vai sempre voltar ao normal, não importa o que o módulo faça.
Também pode acrescentar um CLOSE DATABASES, assim fecha tudo que o módulo abrir.
Com isso, elimina a necessidade de fazer isso nos módulos.

É esse tipo que coisa que faço no meu menu.
Não parece, mas evita muitos problemas, de esquecer de limpar tela, ou de esquecer de fechar arquivos, desativar filtros, etc.

E como o menu é um array....
Se tiver controle de senhas, é só eliminar elementos do array, e o menu já vai ficar conforme o acesso do usuário.

Isso tudo vale para este menu simples, e pra aquele que postei o endereço, que tem muito mais opções.
Se tudo ficar num array, só alterar o array e o menu já fica alterado.

Só pra lembrar:
não criei o menu completo em um único dia... fui acrescentando recursos com o tempo, conforme as necessidades/idéias iam aparecendo.
Qualquer um pode fazer um menu igual, lógico, criando um simples e acrescentando recursos com o tempo.

é até interessante:
Este trecho SEMPRE vai desenhar todo menu, basta deixar a opção atual em outra cor.

Código: Selecionar todos

      FOR nCont = 1 TO Len( aMenu )
         @ aMenu[ nCont, 1 ], aMenu[ nCont, 2 ] SAY aMenu[ nCont, 3 ] ;
         COLOR iif( nCont == nOpc, "N/W", "W/B" )
      NEXT
Este trecho vai fazer a movimentação da opção

Código: Selecionar todos

      CASE nKey == K_UP;   nOpc := iif( nOpc == 1, Len( aMenu ), nOpc - 1 )
      CASE nKey == K_DOWN; nOpc := iif( nOpc == Len( aMenu ), 1, nOpc + 1 )
Se quiser que movimente com setas para os lados, mouse, etc., só acrescentar na movimentação, nem precisa se preocupar com o desenho.

Item importante que muitos usuários esquecem:

Se as rotinas estiverem em uma LIB... alterou a LIB alterou todo aplicativo, ou quantos aplicativos quiser, sem precisar ficar espalhando fontes pelo HD.

Criar menu

Enviado: 09 Nov 2018 13:34
por JoséQuintas
Por incrível que pareça, todos os fontes estão lá no GitHub, josequintas.

Meu aplicativo é: sefazclass do GitHub, josequintas do GitHub, e mais os módulos que deixei de fora.
Não liberei digitação de pedidos, emissão de nota fiscal, etc., mas procurei deixar funcionando lá no GitHub.

Mas vamos lá:

O menu fica em uma variável array.
Transfiro essa variável pra rotina que compara o NOME do módulo com o arquivo aonde estão gravados os acessos.
Eliminadas as opções sem acesso, elimino as opções do menu que ficaram vazias.
O resultado é um array enxuto.

Nos tempos do VB6 adaptei essa mesma rotina: todos os menus num array, e trabalhar no array.
Só não dava pra mexer pela IDE, porque a IDE do VB6 não permitia array único no menu.
Era limitação da IDE e não do VB6...

Com certeza, muita recursividade encima do array.
Mas tudo pra menu, configurar senhas, etc. estão no github.

Talvez antes de olhar as rotinas, interessante entender o array.

{ "opcao", {}, "modulo", { || modulo() } }

Se uma opção tiver sub-menu, fica num sub-array.
O codeblock é apenas pra forçar a linquedição do módulo, por ele ter virado parte da LIB.
Sem isso, o módulo poderia ficar de fora do EXE, o que me causaria problema.
E com isso, pra compilar o que está no github pode precisar de tapa-buracos. FUNCTION Modulo(); RETURN NIL

Criar menu

Enviado: 09 Nov 2018 14:04
por lugab
Bom dia, povo...

Mestre Quintas, como é q compila esse seu exemplo ? Posta o .HBP pra gente...

https://github.com/JoseQuintas/JoseQuin ... a_menu.prg


Hazael,

Muito bacana o seu exemplo

Criar menu

Enviado: 09 Nov 2018 15:50
por JoséQuintas
A alternativa viável talvez seja essa de compartilhar parcial.

Qualquer ajuda é ajuda, mesmo se for apenas pra avisar de algo errado.
Muita gente copiar sem ajudar... tudo bem... se alguém ajuda já vale a pena, um pouco de trabalho a menos.

Já pensei se não seria interessante o pessoal do fórum trabalhar junto.
Até pro cliente saber que vai ter continuidade em tudo, e não trocar por causa disso.

Uma vez recebi a proposta de um programador:
Eu abandonar tudo, mudar de cidade e trabalhar em vendas, recebendo comissão, SOMENTE comissão.
Investimento dele nisso: ZERO risco dele nisso: ZERO e com um programador à disposição.
Meu risco: não receber nada.
Isso lá é proposta?