Página 1 de 1

dica novatos para criar menu

Enviado: 19 Nov 2009 10:03
por tonyx
// parece pouco mais achei mais facil entender assim o funcionamento do menu
// SIMPLES DICA PARA OS NOVATOS PARA CRIAR MENU e entender //

Código: Selecionar todos

//==========================================//
Function Loop_Menu()
 PRIVATE Menu_1,Menu_2,Menu_3,Menu_4,Menu_5
 private Tab_Menu,Loop_Menu,nkey,Op_Menu
 private op_100,op_200,op_300,op_400,op_500
 private op_101,op_102,op_103,op_104,op_104
 private op_401,op_402
 private op_501
 //----------------
 op_100:= 100
 op_200:= 200
 op_300:= 300
 op_400:= 400
 op_500:= 500
 //---------
 op_101:= 101
 op_102:= 102
 op_103:= 103
 op_104:= 104
 //------------
 op_401:= 401
 op_402:= 402
 //------------
 op_501:= 501
 //==============//
 MenuMain= WVW_CreateMenu()
   Menu_1:= WVW_CreateMenu()
   // Menu_2:= WVW_CreateMenu()
   // Menu_3:= WVW_CreateMenu()
   Menu_4:= WVW_CreateMenu()
   Menu_5:= WVW_CreateMenu()

 //--------------//
 Tab_Menu:={}
 aadd(Tab_Menu,Menu_1)
 aadd(Tab_Menu,op_200)
 aadd(Tab_Menu,op_300)
 aadd(Tab_Menu,Menu_4)
 aadd(Tab_Menu,Menu_5)
 
 //====== MenuMain
 WVW_AppendMenu( MenuMain, MF_ENABLED + MF_POPUP, Menu_1, "1- Cadastros"  )
 WVW_AppendMenu( MenuMain, MF_ENABLED + MF_POPUP, Op_200, "2- Movimento"  )
 WVW_AppendMenu( MenuMain, MF_ENABLED + MF_POPUP, op_300, "3- Mov.Anterior")
 WVW_AppendMenu( MenuMain, MF_ENABLED + MF_POPUP, Menu_4, "4- Gerenciais")
 WVW_AppendMenu( MenuMain, MF_ENABLED + MF_POPUP, Menu_5, "5- Utilitarios")

 //====== Menu_1
 WVW_AppendMenu( Menu_1, MF_ENABLED + MF_STRING, op_101, "1- Config"  )
 WVW_AppendMenu( Menu_1, MF_ENABLED + MF_STRING, op_102, "2- Empresas"  )
 WVW_AppendMenu( Menu_1, MF_ENABLED + MF_STRING, op_103, "3- Usuarios"  )
 WVW_AppendMenu( Menu_1, MF_ENABLED + MF_STRING, op_104, "4- Clientes"  )

 //====== Menu_4
 WVW_AppendMenu( Menu_4, MF_ENABLED + MF_STRING, op_401, "1- Status"  )
 WVW_AppendMenu( Menu_4, MF_ENABLED + MF_STRING, op_402, "2- Clientes")
 
 //====== Menu_5
 WVW_AppendMenu( Menu_5, MF_ENABLED + MF_STRING, op_501, "1- Reorganiza" )

 //============ OUTRAS FUNCOES PARA MENU ====================//
 // wvw_EnableMenuItem(MenuMain,Num_ItemMenu,NumMod) // OK
        // Num_mod= Enabled = 0, grayed = 1, disabled = 2
 // wvw_DeleteMenu(Menu_A,1)        //  OK
 // wvw_DestroyMenu(Menu_A)      // NAO FOI 
 // wvw_getmenu()  // obtem titulo do menu
 // wvW_drawmenubar() // redesenha menu
 // SETINKEYAFTERBLOCK({|nkey| AfterInkey(nkey)})
 // wvw_nnumwindows()
 // wvw_showwindow(nw,nmod)
 // wvw_getwindowhandle()
 // wvw_iclosewindows()
//---------------------------------------------------------------------------- 
wvw_setmenu(,MenuMain)  // ativa o menu 
 setcursor(0)            // desativa cursor 
 Loop_Menu:= .t.
 do while Loop_Menu
  wait ""
  nkey:= lastkey()  // so fazer com lasteky()
  //-------------------------------------
  if nkey= 1024   //  aperto do mouse
   Op_Menu:= WVW_GETLASTMENUEVENT()
   //--
   for n = 1 to len(Tab_Menu)
    Op_Main:= Tab_Menu[n]
    wvw_EnableMenuItem(MenuMain,Op_Main,1) 
    // torna opaco as opcoes do menu
   next
   wvW_drawmenubar() // redesenha menu
   //TelaMenu:= savescreen(0,0,24,80,TelaMenu)
   setcursor(1)
   do case
    //--------[  Menu_1- cadastros ]-------------
    case Op_Menu >= Op_101 .and. Op_Menu <= Op_104
     do case
      case Op_Menu = Op_101
       CONFIG()
      case Op_Menu = Op_102
       if nivel_usu < '3'
        wvw_messagebox(,"Acesso nao Autorizado","Aviso",0) // msg_ok
       else
        CAD_EMP()
       endif
      case Op_Menu = Op_103
       if nivel_usu < '3'
        wvw_messagebox(,"Acesso nao Autorizado","Aviso",0) // msg_ok
       else
        USUARIOS()
       ENDIF
      case Op_Menu = Op_104
       if nivel_usu < '3'
        wvw_messagebox(,"Acesso nao Autorizado","Aviso",0) // msg_ok
       else
        CLIENTES()
       ENDIF
     endcase
    //-----------[ Menu_2- Movimento ]---------------
    case Op_Menu = OP_200
     MOVI()
    //----------[ Menu_3- Mov.Anterior ]--------------
    case Op_Menu = Op_300
     MOVI_ANT()
    //----------[ Menu_4- Gerenciais  ]----------
    case Op_Menu >= OP_401 .and. Op_Menu <= Op_402
     do case
      case Op_Menu = Op_401
       if nivel_usu < '3'
        wvw_messagebox(,"Acesso nao Autorizado","Aviso",0) // msg_ok
       else
        REL_01()
       endif
      case Op_Menu = Op_402
        REL_02()
     endcase
    //----------[ Menu_5- Utilitarios ]------------
    case Op_Menu >= OP_501 .and. Op_Menu <= Op_501
      do case
       case Op_Menu = Op_501
        if nivel_usu < '3'
         wvw_messagebox(,"Acesso nao Autorizado","Aviso",0) // msg_ok
        else
         UTIL_01()
       endif
      endcase
   endcase  // fim case do MenuMain
   //restscreen(0,0,24,80,TelaMenu)
   for n = 1 to len(Tab_Menu)
    Op_Main:= Tab_Menu[n]
    wvw_EnableMenuItem(MenuMain,Op_Main,0)
    // ativa as opcoes do menu
   next
   wvW_drawmenubar() // redesenha menu
   SETCOLOR(COR0)  
   CLEAR
   setcursor(0)
  endif   // fim do if tecla do mouse 1024
  //----------------// saida do loop_menu
  if nkey = 27
   if(wvw_messagebox(,"Quer Realmente Sair do Sistema","Alerta",4)) = 6
    Loop_Menu:= .f.
   endif
  endif
  //----------------//
 enddo  //   fim do loop_menu
return(nil)
//----------------------------------

---
Nota da Moderação (Maligno):
A presente mensagem foi editada para a inserção das tags de indentação de código. Já é naturalmente difícil ler código alheio. Sem a devida indentação, essa tarefa se torna mais difícil ainda. Portanto, por favor, futuramente utilize essas tags.

Re: dica novatos para criar menu

Enviado: 19 Nov 2009 15:39
por Itamar M. Lins Jr.
Ola!
É por isso que eu sempre irei indicar o uso de uma biblioteca grafica real ao invéz dessas pseudo libs. Muito complicado veja em Hwgui o que é simplicidade.

Código: Selecionar todos


   MENU OF oFormMain
      MENU TITLE "&Arquivos"
     		MENU TITLE "&Estoques"
      		MENUITEM "Estoque &Padrão"          ACTION {||Estoque()}
      		MENUITEM "Estoque &Simplificado"    ACTION {||EstoqueSimplificado()}
      		MENUITEM "Estoque &Distribuidora"   ACTION {||EstoqueDistribuidora()}
     		ENDMENU         
         MENUITEM "&Fornecedores"      ID 110  ACTION {||Fornecedores()}
         MENUITEM "&Clientes"          ID 210  ACTION {||Clientes()}
         MENUITEM "&Pré Vendas"                ACTION {||AreaPDV()}
         MENUITEM "Devolução/Defeito"          ACTION {||Devolucao()}
         
         SEPARATOR
         MENUITEM "Ordem de &Serviços"        ACTION {||OrdemServicos()}
         MENUITEM "&Orçamento"         ID 321 ACTION {||msginfo('Em Desenvolvimento')}
         MENUITEM "&Encomendas"        ID 330 ACTION {||Encomendas()}
          
         SEPARATOR
         MENUITEM "&Depósito"         ID 350  ACTION msginfo("Em desenvolvimento")
         MENUITEM "Sai&r"             ID 360  ACTION {||MsgInfo('Até logo'),EndWindow()}
      ENDMENU
...

Isso é que ser simples. Ou uma função completa com a janela padrão windows real e o menu.

Código: Selecionar todos

#include "windows.ch"
#include "guilib.ch"

 
Function Main()
Local oMain
Private oMenu

        INIT WINDOW oMain MAIN TITLE "Teste" ;
             AT 0,0 ;//BACKGROUND BITMAP OBMP;
             SIZE GetDesktopWidth(), GetDesktopHeight() - 28

               MENU OF oMain
                  MENU TITLE "Samples"
                     MENUITEM "&Exit"    ID 1001 ACTION oMain:Close()   BITMAP "\hwgui\samples\image\exit_m.bmp" 
                     SEPARATOR                      
                     MENUITEM "&New "    ID 1002 ACTION msginfo("New")  BITMAP "\hwgui\samples\image\new_m.bmp"  
                     MENUITEM "&Open"    ID 1003 ACTION msginfo("Open") BITMAP "\hwgui\samples\image\open_m.bmp" 
                     MENUITEM "&Demo"    ID 1004 ACTION Test()
                     separator
                     MENUITEM "&Bitmap and a Text"  ID 1005 ACTION Test()
                  ENDMENU   
                ENDMENU                
                //The number ID is very important to use bitmap in menu
                MENUITEMBITMAP oMain ID 1005 BITMAP "\hwgui\samples\image\logo.bmp"                 
                //Hwg_InsertBitmapMenu(oMain:Menu, 1005, "\hwgui\sourceoBmp:handle)   //do not use bitmap empty
        ACTIVATE WINDOW oMain
Return Nil

Function Test()
MsgInfo("Test")
Return Nil

 
Veja a diferença, simples de aprender, não precisa passar coordenadas x,y,z,...

Saudações,
Itamar M. Lins Jr.

Re: dica novatos para criar menu

Enviado: 23 Nov 2009 17:45
por lugab
Oba !. Vou experimnetar essas sugestões

Re: dica novatos para criar menu

Enviado: 28 Nov 2009 09:35
por Mário Isa
Itamar Disse:
É por isso que eu sempre irei indicar o uso de uma biblioteca grafica real ao invéz dessas pseudo libs. Muito complicado veja em Hwgui o que é simplicidade.
Alô Itamar!

Apesar de sua ótima idéia devemos considerar o seguinte:

"Se eu estiver errado me corrija"

O exemplo que você passou leva-nos a ver a simplicidade da criação dos menus na HWGUI.LIB.

Mas isso foi apenas uma parte do todo: A criação dos MENUS.

Mas devemos salientar que, para "migrar" para esta LIB , muitos outros comandos mudarão, como é o caso dos GET's / abertura e fechamento de janelas e etc. estou certo.?

Mário

Re: dica novatos para criar menu

Enviado: 29 Nov 2009 08:06
por Itamar M. Lins Jr.
Mas isso foi apenas uma parte do todo: A criação dos MENUS.
Do menu é apenas isso. Agora tem muito mais recursos, bem melhores e mais simples que a WVW.
Mas devemos salientar que, para "migrar" para esta LIB , muitos outros comandos mudarão, como é o caso dos GET's / abertura e fechamento de janelas e etc. estou certo.?
Na WVW abrir janelas é muito mais complicado, os gets idem.
veja na Hwgui por exemplo:

Código: Selecionar todos

Function CadastroExemplo
Local oFont := HFont():Add( "MS Sans Serif",0,-13 )
//Pode ser assim também, preparamos as fontes de uma tela 
   PREPARE FONT oFont       NAME "MS Sans Serif" WIDTH 0 HEIGHT -13 //Para o dialogo/janela e os objetos não especificados "Fonte Padrão"
   PREPARE FONT oBrwFont  NAME "MS Sans Serif" WIDTH 0 HEIGHT -8 //fonte para o browse
   PREPARE FONT oFontA     NAME "Terminal" WIDTH 0 HEIGHT -10 //Para gets diferentes
   PREPARE FONT oFontB     NAME "Arial" WIDTH 0 HEIGHT -10

//Duas formas de programar.
//No inicio posso ler um arquivo DBF por exemplo, coloca um browse e quando movimentar pelo browse os gets sejam atualizados por exemplo.
Private vNome := space(40) //Igual no clipper.
   //Em clipper.
   xTela := SaveScreen(0,0,24,78) //Salvar tela
   @ 0,0 clear to 24,78 //limpar tela
   Janela(0,0,24,78) // desenhar janela.
   //Esse é um exemplo bem simples para clipper.
   //Agora com Hwgui.
   INIT DIALOG oModDlg CLIPPER TITLE "Cadastro de CLientes"   AT 210,10  SIZE 500,300  ;
   FONT oFont 
   // Qual é o mais simples ? esse "CLIPPER" é para mudar de get teclando ENTER.
   //Vamos aos gets.
   //no clipper
   @ 20,10 SAY "Nome:" GET vNome picture "@!"
   //Na Hwgui.
   @ 20,10 SAY "Nome:" SIZE 260, 22 
   @ 20,35 GET oNome VAR vNome  SIZE 260, 26 Picture '@!' // ou podemos usar assim STYLE ES_UPPERCASE
   @ 20,35 GET oNome VAR vNome  SIZE 260, 26 Style ES_UPPERCASE

   // Mas ai vem o X da questão. Como mudamos a letra no Clipper/Wvw ou aumentamos seu tamanho ou como mudamos @ 20,10 say "nome" em tempo de execução ? Só para termos uma ideia do poder da Hwgui.
  //Então em Hwgui podemos fazer uso do Objeto FONT, por exemplo:
   @ 20,10 SAY "Nome:" SIZE 260, 22 Font oFontB //oFontB foi declarada lá em cima lembra?
  // O mesmo recurso com o Get pode ser usado.
   @ 20,35 GET oNome VAR vNome  SIZE 260, 26 Font oFontA Style ES_UPPERCASE
  // Não é aquela gambiarra de querer mudar a resolução do video do clipper setmode(40,20) para aumentar a letra.

   //Ou podemos fazer assim, mas não é recomendado porque perdermos muitos recursos.
   @ 20,10 SAY "Nome:" GET vNome 

// E no final de vários gets no clipper usamos um:
  Read
  RestSCreen(xTela...
  etc...
// Na Hwgui
oModDlg:Activate()
//Ou assim
ACTIVATE DIALOG oModDlg
//Não é preciso nos preocuparmos mais com salvar tela, restaurar tela etc...
Podemos colocar botões, para o usuário clicar, barras de navegação etc...
No clipper ou WVW fazermos isso na unha, na Hwgui "DESENHAMOS" é muita diferença.

Saudações,
Itamar M. Lins Jr.

Re: dica novatos para criar menu

Enviado: 29 Nov 2009 08:42
por Itamar M. Lins Jr.
Mais recursos...
No clipper não existe o "OBJETO" do GET ou do SAY. Na Hwgui temos esse recurso :-)

Código: Selecionar todos

@ 20,20 GET oNome Var vNome size 200,20 Valid {||VerificaSeExiste(vNome)} 
@ 20,40 GET oEndereco Var vEndereço size 200,20 
@ 20,60 GET oBairro Var vBairro size 200,20 Valid {||VerificaSeTeclouEnter()}
@ 20,80 GET oSalario Var vSalario size 100,20 Picture "@E 999,999,999.99" {||iif(vSalario=0,MsgInfo('Valor não pode ser zero'),.t.),PossoChamarNFuncoes(),MaisFuncoesEmUmGet()}

Temos todas as possibilidade do clipper When,Valid,Picture e podemos mudar o cursor, verificar onde está o cursor.
Se quando o usuário acionar um item do menu e na abertura da janela precisar começar de qualquer get, usamos:

Código: Selecionar todos

On Init {||oBairro:SetFocus()}
//Isso informa que ao abrir, clicar no menu Cadastro o "FOCO" (o cursor do DOS/clipper) vai iniciar no GET vBairro.
Podemos verificar com senha e nivel do usuário e desligarmos alguns gets ou todos.

Código: Selecionar todos

oBairro:Disable()
Sem falar do browse, que é muito poderoso e simples de entender.

Saudações,
Itamar M. Lins Jr.

Re: dica novatos para criar menu

Enviado: 26 Dez 2009 09:09
por lugab
Itamar transformou este tpc no melhor tutorial de conversão do clipper (WVW) para Hwgui, Postando as vantagens comparativas entre as 2 libs e ensinando os limitados ao clipper console (ou pseudo-janela), dentre os quaius me incluo.

Um verdadeiro presente de natal. Além de convencer, Itamar está ensinando a gente a fazer.

Tomara que o espírito natalino do Itamar não pare e que ele continue postando mais super exemplos...

Gabriel

Re: dica novatos para criar menu

Enviado: 02 Jan 2010 23:47
por clodoaldomonteiro
Rapaz, ficou bem esclarecido mesmo, valeram as dias.

Mas para mim usar essa lib tenho que fazer o que?
É só colocar na minha compilação e ir mudando?
Ou tem uma IDE?

Re: dica novatos para criar menu

Enviado: 03 Jan 2010 19:12
por Itamar M. Lins Jr.
Mas para mim usar essa lib tenho que fazer o que?
É só colocar na minha compilação e ir mudando?
Ou tem uma IDE?
Pode usar a IDE do Luis Basso, que é quase igual a nativa ou pode fazer na unha, que não é complicado, depois que pegamos o nosso padrão, é muito rápido.
Tem que aprender a usar o CVS.

Saudações,
Itamar M. Lins Jr.

Re: dica novatos para criar menu

Enviado: 04 Jan 2010 01:50
por alxsts
Olá!

Gostaria de me unir ao Gabriel (lugab) quando este parabeniza o Itamar pelas aulas de Harbour com que este último nos tem brindado. Estou certo de que não se trata de espírito natalino pois ele vem fazendo isto há tempos.

Depois que parei de trabalhar com Clipper, migrei para Visual Basic e confesso que não conheço Harbour e nem xHarbour. Mas, através do fórum, acompanho os tópicos referentes ao assunto. É uma evolução e tanto! Devido ao meu conhecimento de Clipper e VB, torna-se até fácil entender os códigos postados. Penso, no entanto, que não compensa eu me dedicar ao estudo destas ferramentas, apesar de gostar muito delas. Dependo de emprego. Pelo que vejo através de anúncios (http://www.apinfo.com ou http://www.empregosti.com), vagas para Clipper e [x]Harbour são cada vez mais escassas.

Lendo os tópicos postados pelo Itamar, aprendi que, em Harbour, tanto o SAY como o Get são objetos. No entanto, dúvidas não param de aflorar em minha mente. Olhando o código abaixo, entendi que oNome é um objeto GET e vNome é uma variável de memória (apesar de não ter visto sua declaração).

Código: Selecionar todos

@ 20,20 GET oNome Var vNome size 200,20 Valid {||VerificaSeExiste(vNome)} 
Pelo que entendi, após a execução do ReadModal() (ou equivalente em Harbour) o valor digitado pelo usuário é armazenado em vNome.

Não sei se entendi direito mas pergunto:
- se oNome é um objeto, o conteúdo digitado pelo usuário não deveria ser uma variável interna do objeto?

Faço a pergunta pois, intuitivamente, associo a situação GET ao TextBox do VB. Grosseiramente, no VB, um SAY seria um objeto Label e um GET um objeto TextBox. No TextBox, o valor digitado fica armazenado internamente no objeto e pode ser recuperado através do método apropriado. Imagine um TextBox com o nome de oNome: para recuperar o valor digitado basta escrever oNome.Text.
Não entendo o endereçamento de tela no Harbour:
- neste exemplo que voce postou, a referência de linha e coluna (@20,20) é para tela DOS?
- e esse size 200,20 é em pixels?

Por favor não desanime com minha ignorância sobre o assunto.

Parabéns pelo teu trabalho e dedicação.
Desejo que 2010 seja infinitamente maravilhoso para você!

Re: dica novatos para criar menu

Enviado: 04 Jan 2010 09:57
por Itamar M. Lins Jr.
vNome é uma variável de memória (apesar de não ter visto sua declaração).
É isso mesmo, não foi intencional mas serve para quem está prestando atenção.
No caso podemos fazer assim:

Código: Selecionar todos

vNome := space(Len(AliasMeuDb->nome))
ou

Código: Selecionar todos

vNome := AliasMeuDb->Nome
oNome:refresh() //aqui atualizamos a tela em tempo de execução.
Pelo que entendi, após a execução do ReadModal() (ou equivalente em Harbour) o valor digitado pelo usuário é armazenado em vNome.
É isso mesmo.
ReadModal() é igual a oModDlg:Activate() //ativar o objeto dialogo.
Abrimos(criamos) um dialogo, janela, Main(mestre) pode ser MDI ou MDICHILD, (pai/filha) então em Hwgui temos três tipos de janelas, são elas Main,Window,Dialog. a Main e Window podem ser MDI. Os dialogs podem ser modais e não modais isto é quando modais elas esperam ação do usuário, não modais usamos para colocar um aviso, barras de progressos, as não modais tem um tempo e não sofre ação do usuario.
Exemplo:

Código: Selecionar todos

Private tReg:=0
INIT DIALOG oDlg TITLE "Verificando os Indices Dos Arquivos" AT 45,30 SIZE 600,280 NOEXIT STYLE DS_CENTER + WS_VISIBLE

BarraProgresso(tReg)

Add status to oDlg parts 200,200 //aqui o rodapé da janela para aviso extra, etc...
oDlg:Activate(.t.) //reparem aqui ativamos o não modal
//ou assim 
ACTIVATE DIALOG oDlg NOMODAL
se oNome é um objeto, o conteúdo digitado pelo usuário não deveria ser uma variável interna do objeto?
Essa parte eu não sei explicar, mas podemos acessar esse conteúdo.

Código: Selecionar todos

oNome:SetText("Novo TEXTO")
ou 
vNome:="Novo TEXTO"
oNome:Refresh()
oNome:SetFocus()
oNome:Disable()
O que não podemos fazer é
vNome:Refresh()
vNome:disable()
...
...GET ao TextBox do VB.
É isso temos TexBox mas ele é muito mais poderoso. Também programo(ei) em VB.
...(@20,20) é para tela DOS?
Não, é 20,20 em relação ao DIALOG se o dialog estiver centralizado o say é na linha 20 coluna 20 dentro do dialog, neste caso estou desenhado dentro da janela.
Por favor não desanime com minha ignorância sobre o assunto.
Eu também estou aprendendo.

Saudações,
Itamar M. Lins Jr.

Re: dica novatos para criar menu

Enviado: 04 Jan 2010 11:00
por alxsts
Valeu meu rei. Obrigado mesmo.