Página 1 de 1

Menu com HBTopBarMenu()

Enviado: 24 Nov 2014 10:54
por simoreira
Prezados,

Estou migrando de Clipper para Harbour. Já consegui alterar algumas coisas que melhoravam o meu sistema na migração, ficou muito bom.

Agora, estou tentando arrumar o funcionamento do menu principal. No meu sistema em Clipper puro, o menu abria sempre na primeira opção (as opções são Cadastrar, Consultar, Exp/Imp, ANC e Utilitários. Todas abrem suas opções de submenu) e, depois de selecionado um item no submenu, ele ficava no item selecionado, aguardando outra seleção. Só que não consigo isso com o HBTopBarMenu(), ele sempre reconstrói todo o menu novamente e eu preciso pressionar <Enter> para selecionar a primeira opção e abrir a popup com os itens daquele menu. Se eu selecionar uma opção ao lado da primeira (Consultar, por exemplo), ele abre o submenu e depois que eu selecionar o que preciso ele refaz tudo e eu tenho que novamente que pressionar <Enter> para abrir a opção "cadastrar", que é a primeira do menu principal.

Tem como eu fazer com que fique selecionado o último menu escolhido e a opção do submenu até que o usuário selecione outra?

O código que uso foi tirado do Help do xHarbour, só adaptei, mas não consegui fazer o que precisava, como descrevi acima. Segue o código.

No programa que chama o Menu Principal:

Código: Selecionar todos

oTopBar := CreateMainMenu()
   
   while True
      MenuModal(oTopBar , 1, ;
                 MaxRow(), 0, MaxCol(), ;
                 oTopBar:colorSpec)
      statbarr()
   enddo	
Funções usadas para montar o menu e os submenus:

Código: Selecionar todos

/*****
* Function CreateMainMenu()
* createmainmenu.prg
*****/  
FUNCTION CreateMainMenu()
LOCAL oMainMenu  := HBTopBarMenu():new(1, 0, MaxCol())
LOCAL bMenuBlock := {|o| MenuSelect(o) }
LOCAL cMenuColor := "N+/W,W+/N,GR+/W,GR+/N,W+/N,N+/W"
LOCAL aItems

oMainMenu:colorSpec := cMenuColor

aItems := { ;
   { " &Banco de Dados      ", {|| pBcoCria()}   , "Cria um diretório de dados para cada empresa cadastrada"           , 100 }, ;
   { " &Gerais              ", {|| pGerCad()}    , "Cadastra os códigos de fazendas, comentários, categorias, etc."    , 101 }, ;
   { " &Vacas               ", {|| pVentre()}    , "Manutençäo dos dados das vacas (ident, idade, pai, mäe, etc.)"     , 102 }, ;
   { " &Touros              ", {|| pTouro()}     , "Cadastro das informaçöes dos touros (tat, apelido, registro, etc.)", 103 }, ;   
   { " &Reprodução          ", {|| pReprod()}    , "Manutençäo dos dados de reproduçäo (inseminaçäo e monta)"          , 104 }, ;   
   { " &Nascimento          ", {|| pNascimento()}, "Inclusäo do nascimento dos terneiros/bezerros"                     , 105 }, ;   
   { " &Desmame             ", {|| pDesmame()}   , "Cadastro dos dados de desmame dos terneiros/bezerros"              , 106 }, ;   
   { " &Pós-Desmame         ", {|| pPosDesm()}   , "Cadastro dos dados de pós-desmame dos terneiros/bezerros"          , 107 }, ;   
   { " Animais de C&EIP     ", {|| pCeip()}      , "Opçöes para animais que receberäo CEIP"                            , 108 }, ;   
   { " &Ultrassom           ", {|| pUltrasom()}  , "Manutenção dos dados importados de ultrassom"                      , 109 }, ;   
   { " &Ocorrências         ", {|| pOcorrenc()}  , "Cadastro de ocorrências"                                           , 110 }, ;   
   { " R&astreabilidade     ", {|| pRastreab()}  , "Cadastro de informações para a rastreabilidade"                    , 111 }, ;   
   { " &Inclui Pesagens     ", {|| pPesagens()}  , "Cadastro de até 36 pesagens por animal de acordo com seleçäo"      , 112 }, ;   
   { " A&casalamentos - PAD ", {|| pPad()}       , "Programa de Acasalamentos Dirigidos - PAD"                         , 113 }, ;
   { " &Sair                ", {|| Sair()}       , "Sai do Sistema"                                                    , 114 }  ;
}

CreateSubMenu(oMainMenu, " Ca&dastrar ", bMenuBlock, aItems)

aItems := { ;
   { " &Relatórios AVG  ", {|| pConsAvg()} , "Consulta aos relatórios de avaliaçäo genética"         , 200 }, ;
   { " Consulta &Touros ", {|| pConsTou()} , "Consulta nomes e registros de touros em arquivo GenSys", 201 }, ;
   { " &Ficha de Animal ", {|| pOpcFicha()}, "Consulta dados de vacas de produtos"                   , 202 }  ;
}

CreateSubMenu(oMainMenu, " C&onsultar ", bMenuBlock, aItems)

aItems := { ;
   { " &Dados Avaliaçäo  ", {|| pDadosAval()}                    , "Exporta os dados em arquivos para a avaliaçäo genética"       , 300}, ;
   { " &Rastreabilidade  ", {|| pExpImpRast()}                   , "Exporta/Importa dados para a rastreabilidade"                 , 302}, ;
   { " &Importar         ", {|| pImportar()}                     , "Importa dados de arq. ultra-som e avaliaçäo genética"         , 303}, ;
   { " &Transferências   ", {|| pTransfAni()}                    , "Transfere e importa animais de uma fazenda para outra"        , 304}, ;
   { " Imprime &Boletins ", {|| pImprBol(08,47,13,58,'ADV','GC')}, "Imprime boletins gerados pelo exp.dados de avaliaçäo genética",305} ;
}

CreateSubMenu(oMainMenu, " &Exp./Imp. ", bMenuBlock, aItems)

aItems := { ;
          { " &A.N.C. ", {|| pDadosAnc()}, "Emite relatórios para a ANC", 400} ;
          }

CreateSubMenu(oMainMenu, " &Associaçäo ", bMenuBlock, aItems)

aItems := { ;
          { " &Organizar    ", {|| pIndexa()}     , "Organiza os arquivos de índice do sistema", 500},;
          { " Al&tera cores ", {|| pAltCor()}     , "Altera as cores do sistema"               , 501},;
          { " Calcu&ladora  ", {|| fCalculadora()}, "Aciona a calculadora"                     , 502},;
          { " &Impressora   ", {|| pImpressora()} , "Configura a impressora a ser utilizada"   , 503};
          }

CreateSubMenu(oMainMenu, " &Utilitários ", bMenuBlock, aItems)

RETURN oMainMenu

/*****
* Funcition CreateSubMenu()
* createsubmenu.prg
*****/
FUNCTION CreateSubMenu(oMenu, cMenuItem, bBlock, aItems)
LOCAL aItem, oItem, oSubMenu

oSubMenu           := PopUp():new()
oSubMenu:colorSpec := oMenu:colorSpec

FOR EACH aItem IN aItems
   oItem := MenuItem():new(aItem[1], ;
                            aItem[2], ; // bBlock  , ;
                                    , ; // aItem[2], ;
                            aItem[3], ;
                            aitem[4] )
   oSubMenu:addItem (oItem)
NEXT

oItem := MenuItem():new(cMenuItem, oSubMenu)
oMenu:addItem(oItem)
RETURN NIL

/*****
* Procedure MenuSelect()
* menuselect.prg
*****/
PROCEDURE MenuSelect(oMenuItem)
@ 1, 0 CLEAR TO MaxRow(), MaxCol()

SWITCH oMenuItem:ID
CASE 114
   ExitRoutine() ; EXIT
   // DEFAULT
   // Alert(oMenuItem:message)
END

RETURN

/*****
*Procedure ExitRoutine()
* exitroutine.prg
*****/
PROCEDURE ExitRoutine
IF Alert("Sair do Programa?", { "Sim", "Nao" }) == 1
   QUIT
ENDIF
RETURN
Grato se alguém tiver uma ideia sobre como implementar o que descrevi.

Abraços.

Menu com HBTopBarMenu()

Enviado: 26 Nov 2014 20:43
por yugi386
Bem, não sei se é o que você está buscando mas veja o tópico: https://pctoledo.org/forum/viewto ... 43&t=15281

Faça o download do exemplo de menu: https://pctoledo.org/forum/downlo ... hp?id=1557

Imagem

:xau

Menu com HBTopBarMenu()

Enviado: 26 Nov 2014 21:40
por JoséQuintas
Menu estilo Windows é igual o iniciar do Windows, sempre começa na opção zero.
Só é interessante pra menus bem pequenos.
A opção que conheço é fazer em estilo Clipper mesmo.

Menu com HBTopBarMenu()

Enviado: 27 Nov 2014 09:52
por simoreira
Obrigado pela ajuda. Vou estudar a função e lhe posto alguma dúvida, se houve.

Muito obrigado mesmo!

Menu com HBTopBarMenu()

Enviado: 27 Nov 2014 10:06
por JoséQuintas
O menu que uso está postado aqui.
Mas é só pesquisar, vai encontrar várias opções aqui no fórum.

https://pctoledo.org/forum/viewto ... 43&t=14790