Jump to content
Fivewin Brasil

Reabrir menu após executar uma opção


Yury

Recommended Posts

  • Replies 55
  • Created
  • Last Reply

Top Posters In This Topic

Olá Delair,

Não estou conseguindo rodar o programa abaixo. Tem como você testar ele aí e me falar ?


#include "FiveWin.ch"

static oWnd

//----------------------------------------------------------------------------//

function Main()

SET _3DLOOK ON

DEFINE WINDOW oWnd FROM 1, 1 TO 22, 75 ;

TITLE "Test Menu" MENU BuildMenu() ;

MDI

SET MESSAGE OF oWnd TO FWVERSION CLOCK DATE KEYBOARD NOINSET

ACTIVATE WINDOW ownd MAXIMIZED

RETURN NIL

//----------------------------------------------------------------------------//

function BuildMenu()

local oMenu

MENU oMenu

MENUITEM "Item 1"

MENU

MENUITEM "Item 1 - Sub 1" MESSAGE "Item 1 - Sub 1" ;

ACTION MsgInfo( "any action" ) ;

ACCELERATOR 0, VK_F2

MENUITEM "Item 1 - Sub 2" MESSAGE "Item 1 - Sub 2"

ENDMENU

MENUITEM "Item 2"

MENU

MENUITEM "Item 2 - Sub 1" MESSAGE "Item 2 - Sub 1"

MENUITEM "Item 2 - Sub 2" MESSAGE "Item 2 - Sub 2"

MENUITEM "Minha opcao" MESSAGE "Minha opcao" action TESTE()

ENDMENU

MENUITEM "Short"

MENU

MENUITEM "abcd" MESSAGE "dd"

ENDMENU

MENUITEM "Shorter"

MENU

MENUITEM "ab" MESSAGE "dd"

ENDMENU

MENUITEM "&Exit"

ENDMENU

return oMenu

**************

function TESTE

**************

MSGSTOP( "TESTE" )

ShowMenu( oWnd:oMenu )

return NIL

* Para utilizar basta chamar ShowMenu( oWnd:oMenu ) antes de retornar o foco para oWnd:oMenu.

* 1º - Descobre a o caminho até oM:LastItem()

* 2º - Ao sair, simula Alt para abrir o menu e, em seguida,

* a seqüência de setas para navegar até oM:LastItem()

#define KEYEVENTF_KEYUP 0x0002

*****************

function ShowMenu( oM, nNiv )

*****************

local nItem, oLItM, cMov :="", cMv, nChr

default oM :=WndMain():oMenu

default nNiv :=0

oLItM :=oM:LastItem()

*local nItem, oLItM :=oM:LastItem(), cMov :="", cMv, nChr

*default oM :=GetWndFrame():oMenu

*default nNiv :=0

for nItem :=1 to Len( oM:aItems )

if ValType( oM:aItems[nItem]:bAction ) ='O'

cMv :=ShowMenu( oM:aItems[nItem]:bAction, nNiv+1 )

if Right( cMv,1 ) =="x"

cMov += Chr( if( nNiv =0, VK_DOWN, VK_RIGHT ) )+cMv

if nNiv ==0

cMov :=Left( cMov,Len(cMov)-1 )

* MsgInfo( StrTran( StrTran( cMov,Chr(VK_DOWN),"V" ), Chr(VK_RIGHT), ">" ) ) // mostra a sequencia de movimentos.

keybd_event( VK_MENU,0,0,0)

keybd_event( VK_MENU,0,KEYEVENTF_KEYUP,0)

for nChr :=1 to Len( cMov )

keybd_event( Asc(SubStr(cMov,nChr,1)),0,0,0 )

keybd_event( Asc(SubStr(cMov,nChr,1)),0,KEYEVENTF_KEYUP,0 )

next

return .T.

endif

return cMov

endif

elseif oM:aItems[nItem]:nId == oLItM:nId

return cMov+"x"

endif

if !Empt( oM:aItems[nItem]:cPrompt ) // se não for um separador

cMov +=Chr( if( nNiv =0, VK_RIGHT, VK_DOWN ) )

endif

next

return if(nNiv ==0, .F., "")

DLL32 FUNCTION keybd_event(bVk AS 7,bScan AS 7,dwFlags AS 8,dwExtraInfo AS 7) AS 7 PASCAL LIB "User32.dll"

id=code>id=code>

Outra coisa. Quando executo o prgrama acima e sem seguida encerro ele, o teclado fica maluco. Se abro uma janela MS-DOS e digito: EXIT e enter , em vez de fechar a janela, ela é minimizada, doideira hehe

Obrigado,

Rossine

FW 2.2c + @say + Clipper 5.2e + libs 5.3b / FWH 2.7 + @say + xHarbour Divinópolis/ MG

Link to comment
Share on other sites

citação:

Olá Delair,

Não estou conseguindo rodar o programa abaixo. Tem como você testar ele aí e me falar ?

Outra coisa. Quando executo o prgrama acima e sem seguida encerro ele, o teclado fica maluco. Se abro uma janela MS-DOS e digito: EXIT e enter , em vez de fechar a janela, ela é minimizada, doideira hehe

Obrigado,

Rossine

FW 2.2c + @say + Clipper 5.2e + libs 5.3b / FWH 2.7 + @say + xHarbour Divinópolis/ MG


id=quote>id=quote>

Oi Rossine!

Você está usando Clipper ou xHarbour? É que não consegui fazer funcionar "keybd_event( Asc(SubStr(cMov,nChr,1)),0,KEYEVENTF_KEYUP,0 )" no Clipper, daí fica simulando a tecla como pressionada. Deste modo, é interpretado como - e comuta entre janela e tela cheia.

Não consegui localizar teu cadastro, para te enviar um exemplo por e-mail. Enviei o exemplo para o Daniel Lopes publicar, mas não sei no que deu.

-----------------------------------------------------------

FiveWin 8.02/ xHarbour 8.02 / Workshop / ADS 6.11

Link to comment
Share on other sites

citação:

Olá Delair,

Eu uso xharbour. Meu email é: qiinfo@ig.com.br

Obrigado,

Rossine

FW 2.2c + @say + Clipper 5.2e + libs 5.3b / FWH 2.7 + @say + xHarbour Divinópolis/ MG


id=quote>id=quote>

Já foi...

-----------------------------------------------------------

FiveWin 8.02/ xHarbour 8.02 / Workshop / ADS 6.2

Link to comment
Share on other sites

citação:

Olá Delair,

Não chegou aqui não. Envie novamente por favor icon_smile.gif

Obrigado,

Rossine

FW 2.2c + @say + Clipper 5.2e + libs 5.3b / FWH 2.7 + @say + xHarbour Divinópolis/ MG


id=quote>id=quote>

Reenviado.

-----------------------------------------------------------

FiveWin 8.02/ xHarbour 8.02 / Workshop / ADS 6.2

Link to comment
Share on other sites

Se alguém me disser como se faz, posso postar...

Havia faltado a definição de keybd_event.

Segue a baixo todo o prg, compilado com xHarbour 1.0.0 e ADS 8.02.


#define KEYEVENTF_KEYUP 2

function Main()

memvar oWnd

private oWnd

define window oWnd title "Teste de ShowMenu()" mdi from 0,0 to 15,80 menu MenuGer()

activate window oWnd

return NIL

*** * Fim de Main() = Teste.

static function SuaAcao()

MsgInfo( "Estou em "+oWnd:oMenu:LastItem():cPrompt )

ShowMenu( )

return NIL

*** * Fim de SuaAcao = Teste.

//-----------------------------------------------------------------------------

// Recupera mensagens dos itens do menu do resource/stringable.

static function MenuGer()

local oMnu

MENU oMnu

MENUITEM "SubMenu 1"

MENU

MENUITEM "Item 1.1" ACTION SuaAcao()

MENUITEM "Item 1.2" ACTION SuaAcao()

SEPARATOR

MENUITEM "Item 1.3" ACTION SuaAcao()

MENUITEM "SubMenu 1.1"

MENU

MENUITEM "Item 1.1.1" ACTION SuaAcao()

MENUITEM "Item 1.1.2" ACTION SuaAcao()

MENUITEM "Item 1.1.3" ACTION SuaAcao()

MENUITEM "Item 1.1.4" ACTION SuaAcao()

ENDMENU

SEPARATOR

MENUITEM "Item 1.4" ACTION SuaAcao()

ENDMENU

SEPARATOR

MENUITEM "Item 1" ACTION SuaAcao()

MENUITEM "SubMenu 2"

MENU

MENUITEM "Item 2.1" ACTION SuaAcao()

SEPARATOR

MENUITEM "Item 2.2" ACTION SuaAcao()

MENUITEM "SubMenu 2.1"

MENU

MENUITEM "Item 2.1.1" ACTION SuaAcao()

MENUITEM "Item 2.1.2" ACTION SuaAcao()

MENUITEM "SubMenu 2.1.1"

MENU

MENUITEM "Item 2.1.1.1" ACTION SuaAcao()

MENUITEM "Item 2.1.1.2" ACTION SuaAcao()

SEPARATOR

MENUITEM "Item 2.1.1.3" ACTION SuaAcao()

MENUITEM "Item 2.1.1.4" ACTION SuaAcao()

ENDMENU

MENUITEM "Item 2.1.3" ACTION SuaAcao()

MENUITEM "Item 2.1.4" ACTION SuaAcao()

ENDMENU

MENUITEM "Item 2.3" ACTION SuaAcao()

SEPARATOR

MENUITEM "SubMenu 2.2"

MENU

MENUITEM "Item 2.2.1" ACTION SuaAcao()

MENUITEM "Item 2.2.2" ACTION SuaAcao()

MENUITEM "Item 2.2.3" ACTION SuaAcao()

MENUITEM "Item 2.2.4" ACTION SuaAcao()

ENDMENU

MENUITEM "Item 2.4" ACTION SuaAcao()

ENDMENU

ENDMENU

return oMnu

*** * Fim de MenuGer( oM ) = Teste.

//-----------------------------------------------------------------------------

// Reabre o menu que chamou uma rotina.

// 1§ Descobre o caminho para se chegar ate oM:LastItem()

// 2§ Abre o menu simulando a tecla Alt e, em seguida, a

// sequencia de setas para chegar ate oM:LastItem()

function ShowMenu( oM, nNiv )

local nItem, oLItM, cMov :="", cMv, nChr

default oM :=WndMain():oMenu

default nNiv :=0

oLItM :=oM:LastItem()

for nItem :=1 to Len( oM:aItems )

if ValType( oM:aItems[nItem]:bAction ) ='O'

cMv :=ShowMenu( oM:aItems[nItem]:bAction, nNiv+1 )

if Right( cMv,1 ) =="x"

cMov += Chr( if( nNiv =0, VK_DOWN, VK_RIGHT ) )+cMv

if nNiv ==0

cMov :=Left( cMov,Len(cMov)-1 )

* MsgInfo( StrTran( StrTran( cMov,Chr(VK_DOWN),"V" ), Chr(VK_RIGHT), ">" ) )

keybd_event( VK_MENU,0,0,0)

keybd_event( VK_MENU,0,KEYEVENTF_KEYUP,0)

for nChr :=1 to Len( cMov )

keybd_event( Asc(SubStr(cMov,nChr,1)),0,0,0 )

keybd_event( Asc(SubStr(cMov,nChr,1)),0,KEYEVENTF_KEYUP,0 )

next

return .T.

endif

return cMov

endif

else

if oM:aItems[nItem]:nId == oLItM:nId

return cMov+"x"

endif

endif

if !Empt( oM:aItems[nItem]:cPrompt ) // se não for um separador

cMov +=Chr( if( nNiv =0, VK_RIGHT, VK_DOWN ) )

endif

next

return if(nNiv ==0, .F., "")

***

************************************************************

DLL32 FUNCTION keybd_event(bVk as _INT,bScan as _INT,dwFlags ;

as LONG,dwExtraInfo as LONG) AS LONG PASCAL LIB "user32.dll"

************************************************************

id=code>id=code>

-----------------------------------------------------------

FiveWin 8.02/ xHarbour 8.02 / Workshop / ADS 6.2

Link to comment
Share on other sites

Show de bola Delair icon_smile_tongue.gifshow de bola...show de bola...show de bolaicon_smile_tongue.gif

Parabéns funcionou 100%

Na minha opnião, uma grande contribuição para o FWH

icon_smile_big.gificon_smile_big.gificon_smile_big.gificon_smile_big.gificon_smile_big.gificon_smile_big.gificon_smile_big.gificon_smile_big.gif

Valeu mesmo,

Rossine

FW 2.2c + @say + Clipper 5.2e + libs 5.3b / FWH 2.7 + @say + xHarbour Divinópolis/ MG

Link to comment
Share on other sites

otimo exemplo ... pra quem esta migrando a aplicação

de modo texto para modo grafico ... isso é maravilhoso

parabens

manda o exemplo pro linhares pra ele colocar no samples do fw

******

xharbour 1.1.0 + gtwvw + dbfcdx

fw 8.01+borland resouce workshop/fw pcc

USANDO GTWVW + FW JUNTO ....

msn..: zazibr@hotmail.com

skype: zazibr

Daniel lopes Filho

Campo Grande/MS

Link to comment
Share on other sites

Realmente fantastica !!!,caiu como uma luva no meu sistema de folha de pagamento onde tenho um menu enorme, e o pessoal já me cobravam a tempo essa solução. parabéns !!!

FWH7.04/XH9971/Pelles/Mysql/aprendiz(Java/PHP)

laurentinocarlos@gmail.com

Rio de Janeiro/Montes/Curvel Claros MG

Link to comment
Share on other sites

Pessoal, se me permitem meter o bedelho, eu decidi resolver esta questão de uma outra maneira. Resolvi fazer como o Windows faz, colocar os programas mais utilizados no menu iniciar. O que eu fiz foi fazer uma barra de botões na janela principal e cada vez que se usa uma função, esta função está associada a um botão com sua imagem já pré-definida juntamente com o perfil do usuário e vai se atualizando automaticamente. Cada vez que o usuário entra no sistema, o sistema verifica quais as opções mais utilizadas por ele e coloca na barra de botões ordenado decrescente da esquerda pra direita. Desta forma, o usuário terá sempre a mão a sua opção mais utilizada.

Eroni

(48) 3045-1575

xHarbour 0.99.5 & FWH 2.4

SqlLib, MySql & Dbf

Link to comment
Share on other sites

Realmente muito bom Delair

funciona mesmo.. apenas uma observação, quando

não usamos pelo menu.. isto é eu abro pelos botoes

de atalho.. sua rotina dá um erro.. pois ele tenta

retornar ao item do menu chamado.. e nao houve nenhum

objeto do menu.. entao apenas modifiquei sua funcao..

apenas esse detalhe...

PARABENS !!!

function ShowMenu( oM, nNiv )

local nItem, oLItM, cMov :="", cMv, nChr

default oM :=WndMain():oMenu

default nNiv :=0

oLItM :=oM:LastItem()

// coloquei isso aqui para quando nao é chamado

// pelo menuitem

if empty(oLItM)

return .f.

end

//////////////////////

vitor

s.b.c.

Link to comment
Share on other sites

Eroni,sua idéia também é ótima, você só não teve a iniciativa de compartilhá-la conosco e é isso que faz desse fórum o melhor de todos....

FWH7.04/XH9971/Pelles/Mysql/aprendiz(Java/PHP)

laurentinocarlos@gmail.com

Rio de Janeiro/Montes/Curvel Claros MG

Link to comment
Share on other sites

citação:

Realmente muito bom Delair

funciona mesmo.. apenas uma observação, quando

não usamos pelo menu.. isto é eu abro pelos botoes

de atalho.. sua rotina dá um erro.. pois ele tenta

retornar ao item do menu chamado.. e nao houve nenhum

objeto do menu.. entao apenas modifiquei sua funcao..

apenas esse detalhe...

PARABENS !!!

function ShowMenu( oM, nNiv )

local nItem, oLItM, cMov :="", cMv, nChr

default oM :=WndMain():oMenu

default nNiv :=0

oLItM :=oM:LastItem()

// coloquei isso aqui para quando nao é chamado

// pelo menuitem

if empty(oLItM)

return .f.

end

//////////////////////

vitor

s.b.c.


id=quote>id=quote>

Maravilha!!

Já estou ganhando, também. Já corrigi a função.

Obrigado.

-----------------------------------------------------------

FiveWin 8.02/ xHarbour 8.02 / Workshop / ADS 6.2

Link to comment
Share on other sites

citação:

Pessoal, se me permitem meter o bedelho, eu decidi resolver esta questão de uma outra maneira. Resolvi fazer como o Windows faz, colocar os programas mais utilizados no menu iniciar. O que eu fiz foi fazer uma barra de botões na janela principal e cada vez que se usa uma função, esta função está associada a um botão com sua imagem já pré-definida juntamente com o perfil do usuário e vai se atualizando automaticamente. Cada vez que o usuário entra no sistema, o sistema verifica quais as opções mais utilizadas por ele e coloca na barra de botões ordenado decrescente da esquerda pra direita. Desta forma, o usuário terá sempre a mão a sua opção mais utilizada.

Eroni

(48) 3045-1575

xHarbour 0.99.5 & FWH 2.4

SqlLib, MySql & Dbf


id=quote>id=quote>

Bem legal sua solução. Me parece que seria ainda mais simpática se ela fosse incorporada ao TMru, pois não popularia a tela com elementos extras (botões).

Alguém se habilita em alterar a classe TMru, para guardar e retornar todos os parâmentos dos últimos MenuItems? Vocês acham válida esta idéia?

-----------------------------------------------------------

FiveWin 8.02/ xHarbour 8.02 / Workshop / ADS 6.2

Link to comment
Share on other sites

citação:

citação:

Realmente muito bom Delair

funciona mesmo.. apenas uma observação, quando

não usamos pelo menu.. isto é eu abro pelos botoes

de atalho.. sua rotina dá um erro.. pois ele tenta

retornar ao item do menu chamado.. e nao houve nenhum

objeto do menu.. entao apenas modifiquei sua funcao..

apenas esse detalhe...

PARABENS !!!

function ShowMenu( oM, nNiv )

local nItem, oLItM, cMov :="", cMv, nChr

default oM :=WndMain():oMenu

default nNiv :=0

oLItM :=oM:LastItem()

// coloquei isso aqui para quando nao é chamado

// pelo menuitem

if empty(oLItM)

return .f.

end

//////////////////////

vitor

s.b.c.


id=quote>id=quote>

Maravilha!!

Já estou ganhando, também. Já corrigi a função.

Obrigado.

-----------------------------------------------------------

FiveWin 8.02/ xHarbour 8.02 / Workshop / ADS 6.2


id=quote>id=quote>

bom, ví mais um problema,, em relatorios quando abre a preview, ele nao retorna...

alguem se habilita??? estou tentanto tambem

vitor

s.b.c.

Link to comment
Share on other sites

citação:

bom, ví mais um problema,, em relatorios quando abre a preview, ele nao retorna...

alguem se habilita??? estou tentanto tambem

vitor

s.b.c.


id=quote>id=quote>

Como estou apenas iniciando em FW não tenho nenhum relatório com preview, para testar, mas acredito que deva estar perdendo a informação de LastItem. Para contornar, armazene WndMain():oMenu em variável local, no início de seu relatório, e passe para ShowMenu() como parâmetro oM.

Nos reporte quando testar.

-----------------------------------------------------------

FiveWin 8.02/ xHarbour 8.02 / Workshop / ADS 6.2

Link to comment
Share on other sites

Oi Marcelo.

citação:

Se quiserem eu coloco isso dentro da classe Tmenu sem precisar alterar a classe nativa!...

Marcelo Gomes

elitenet@terra.com.br

(32) 3728-1288

Muriae - MG

FW 2.3C/FWH 2.6/CLIPPER 5.X/XHARBOUR/C/C++/JAVA/DELPHI/XMATE/MD/MYSQL/FIREBIRD/INTERBASE


id=quote>id=quote>

Você está se referindo ao TMru() ou ShowMenu()? Ambas me interessam desde que sejam opcionais, selecionáveis para cada item.

-----------------------------------------------------------

FiveWin 8.02/ xHarbour 8.02 / Workshop / ADS 6.2

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

×
×
  • Create New...