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
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
Abraços.



