Página 1 de 1

Menu Clipper 5.3 Help

Enviado: 20 Fev 2006 08:52
por MARCELOG
Olá forum,
recentemente vi um exemplo de menu colocado pelo Stanis no estilo do Clipper 5.3.
Gostaria de saber se é possível fazer com que, após a exeução da ação, retornar à opção selecionada, mostrando ou resenhando o menu até essa opção?
É que o sistema que estou elaborando tem rotinas seguidas, e fazer o usuário selecionar todas as opções a cada ação executada não é "lógico".
O exemplo do Stanis (ou mesmo o exemplo da pasta source) insiste em retornar ao menu principal (TopBar).

Obrigado.

MarceloG

Enviado: 20 Fev 2006 12:53
por Stanis Luksys
Olá amigo,

Conforme eu mesmo já te respondi isso é simples fazer, você precisa apenas de duas linhas no seu código.

Este trecho antes do Alert() do meu exemplo:

nUltimoItem := oPopUpMenu:Current


Este trecho logo após o alert() do meu exemplo:

oPopUpMenu:Select( nUltimoItem )


Se você não conseguir mesmo de jeito nenhum eu vou ver o que posso fazer para melhorar aquele exemplo, mas antes dá uma olhadinha no NG do Clipper 5.3 que nele as classes envolvidas no exemplo são muito bem explicadas.

Ok...

Enviado: 20 Fev 2006 14:28
por MARCELOG
Caro Stanis,
de novo, obrigado pelo interesse em me ajudar.
Mas o seu código abaixo foi alterado conforme orientação e não funcionou.
O menu insiste em retornar à opção inicial (topbar).

/*****
*
* Menu.prg
*
* Compilar: / n
*
* Este programa tem como proposta o simples exemplo das classse de
* criação de menus com o clipper 5.3 e xHarbour.
*
**********
*
* Stanis Luksys
*
* stanis@luksyssoft.com.br
* www.luksyssoft.com.br
*
*************************************************/



#include "button.ch"
#include "inkey.ch"

function Main()

local oMenu

// Ativa as ações do mouse
SET( _SET_EVENTMASK, INKEY_ALL )

// Ativa cores intensas no fundo
SetBlink(.f.)

// Torna o cursor do mouse visivel
msetcursor(.T.)

// Limpa a tela
setColor( "w+/b" )
cls

// Aqui neste momento é criado o menu
oMenu := Monta_Menu()

// Espera por um evento do menu e nao sai enquanto o usuario
// nao escolher o item 'sair' do menu
do while MenuModal( oMenu, 01, 24, 01, 79, "w+/b" ) != 999
enddo

Set Color To
cls

return( NIL )




// A função a seguir é responsávl pela criação do menu retorna para o
// objeto oMenu o estado atual do menu, quando é escolhido uma opção

function Monta_Menu()

local oTopBar, oPopUp, oPopUp1, oItem, oItem1, oItem2

local cCorBar := "b*/w,w+/bg,b*/w,w+/bg,b*/w,b*/w"
local cCorItem := "w+/bg,b*/w,w+/bg,b*/w,w/bg,w+/bg"



// TopBar() cria o menu na posição indicada
oTopBar := TopBar( 0, 0, 79)
oTopBar:ColorSpec := cCorBar

// Cria um novo 'popup menu' chamado Arquivo e adiciona ele no objeto oTopBar
oPopUp := PopUp()
oPopUp :ColorSpec:= cCorItem
oTopBar:AddItem( MenuItem ( "&Arquivo", oPopUp, , "Opcoes de cadastro e alteracoes de registros..." ) )


// Aqui começa a adição de itens do menu 'Arquivo'

oItem := MenuItem( "Cadastro de &Clientes" ,{|| Alert() }, K_CTRL_C, "Mensagem do primeiro item...", 101)
oPopUp:AddItem( oItem )


oItem :=MenuItem( "Cadastro de &Produtos" ,{|| nItem:=oPopUp:Current,Alert("a"),oPopUp:Select(nItem)}, K_CTRL_P, "Mensagem do segundo item...")
oPopUp:AddItem( oItem )


oItem :=MenuItem( "Cadastro de &Forncedores" ,{|| Alert() }, K_CTRL_F, "Mensagem do terceiro item...")
oPopUp:AddItem( oItem )

oPopUp:AddItem( MenuItem( MENU_SEPARATOR ) )

oItem :=MenuItem( "&Grupos de Produtos" ,{|| Alert() }, K_CTRL_G, "Mensagem do quarto item...")
oPopUp:AddItem( oItem )

oItem :=MenuItem( "Contas &Bancarias", {|| Alert() }, K_CTRL_B, "Mensagem do quinto item...")
oPopUp:AddItem( oItem )

oPopUp:AddItem( MenuItem( MENU_SEPARATOR ) )

oItem :=MenuItem( "Sai&r" ,{|| .t. }, K_ALT_F4,"Abandona o aplicativo.", 999)
oPopUp:AddItem( oItem)


// Cria um novo 'popup menu' chamado Opcoes e adiciona ele no objeto oTopBar

oPopUp := PopUp()
oPopUp :ColorSpec:= cCorItem
oTopBar:AddItem( MenuItem ( "&Opcoes", oPopUp, , "Opcoes gerais do programa..." ) )


// Aqui começa a adição de itens do menu 'Opcoes'

// Interessante notar que se o mouse ja esta habilitado, podemos
// desabilitar o item que faria isso, e vice-versa

oItem1 := MenuItem( "&Habilitar cursor do mouse" ,{|| mSetCursor(.t.), oItem1:Enabled := .f., oItem2:Enabled := .t.}, , "Habilita o cursor do mouse" )
oItem1:Enabled := .f.
oPopUp:AddItem( oItem1 )

oItem2 := MenuItem( "&Desabilitar cursor mouse" ,{|| mSetCursor(.f.), oItem2:Enabled := .f., oItem1:Enabled := .t. }, , "Desabilita o cursor do mouse" )
oPopUp:AddItem( oItem2 )


// Retorna o estado de objeto TopBar para a função Main()
return ( oTopBar)


O NG e a pasta source do clipper contém um exemplo que não contempla a situação, ou seja, tanto o seu código quanto aquele fornecido pela CACLIPPER retornam ao menu principal (topbar).

O menu corrente (o:current) dentro do bloco de código sempre retorna 0.

Obrigado.

MarceloG.

PS: vou fazer um teste colocando a variável private em vez de local e testar a dica dentro da função, e não do código.

Enviado: 21 Fev 2006 11:09
por Stanis Luksys
Olá Marcelo,

Ok, você está certo, realmente não funcionou.

A titulo de exemplo, no final de semana eu te preparo algo neste sentido.


Ok.