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

  • 1 year later...

Acompanhei este tópico na época, mais só agora fui colocar em pratica, realmente muito bom mesmo a solução do Delair, agora estou tento a seguinte dificuldade ao retornar de minha rotina chamada pelo menu, o sistema executa a linha abaixo se eu tirar ela blz a rotina funciona certo, alguém passou por isto e tem alguma solução.

SETKEY( VK_F10, {|| MsgCalc() } )

Obrigado

Luiz Fernando

msn: empresoft@globo.com

skype:empresoft

empresoft@globo.com

FWH 8.04,XHARBOUR 1.1,PELES,XDEV,VLIB,ADS 8.1

Link to comment
Share on other sites

Olá Luiz, algumas teclas são utilizadas pelo windows com F1 ( Help ) e F10 ( ABre menu ), então acho que seria melhor vc trocar de tecla. ou fazer alguma manobra para isso, mas aí não sei lhe indicar.

Alessandroid=blue>

FW20d+CL53b+Blk7+@Say+CDX

FW9.02+xHb110+@Say+CDX

"O fracasso jamais me surpreenderá, se minha vontade de vencer for suficientemente forte..."id=red>

Link to comment
Share on other sites

citação:

Olá Luiz, algumas teclas são utilizadas pelo windows com F1 ( Help ) e F10 ( ABre menu ), então acho que seria melhor vc trocar de tecla. ou fazer alguma manobra para isso, mas aí não sei lhe indicar.

Alessandroid=blue>

FW20d+CL53b+Blk7+@Say+CDX

FW9.02+xHb110+@Say+CDX

"O fracasso jamais me surpreenderá, se minha vontade de vencer for suficientemente forte..."id=red>


id=quote>id=quote>

Vlw Alessandro , era isto mesmo substitui pelo F9 e resolveu o problema...

Abraços

Luiz Fernando

msn: empresoft@globo.com

skype:empresoft

empresoft@globo.com

FWH 8.04,XHARBOUR 1.1,PELES,XDEV,VLIB,ADS 8.1

Link to comment
Share on other sites

Sua Indentação não esta pequena só voce que não usou o

<> por []id=red>

Aqui

voce

escreve

seu codigo

citação:

Oi Yuri.

Demorei, mas consegui entender o problema. É que Keybd_Envent() processa separadamente os dois eventos: pressionar e soltar a tecla.

No teu exemplo você simula estar pressionando e não simula soltar a tecla Alt.

Acho que consegui uma solução para o teu caso. Basta chamar a função, a segui, no final de suas rotinas, informando o menu que a chamou e ela se encarrega de reabrir na posição final, sozinha.

.#define KEYEVENTF_EXTENDEDKEY 1

.#define KEYEVENTF_KEYUP 2

.

.* 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()

.function ShowMenu( oM, nNiv )

.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

. 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., "")

Coloquei os pontos a esquerda para preservar a identação, não sei como de outra forma.

Funcionou bem com FWH 8.02.

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

FiveWin 8.02/ xHarbour 8.02 / Workshop / ADS 6.11


id=quote>id=quote>


#define KEYEVENTF_EXTENDEDKEY 1

#define KEYEVENTF_KEYUP 2

* 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()

function ShowMenu( oM, nNiv )

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

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., "")

id=code>id=code>

Marcelo Michels

Msn/E-mail:marcelo@infototal.com.br

Msn/E-mail:celo.michels@hotmail.com

xHarbour 1.1 + Fwh 8.01 + WorkShop + Bcc 5.82 + WvwTools + SQLRDD + xMate.

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...