Menu (se podrá?)

Menu (se podrá?)

Postby dobfivewin » Sat Dec 13, 2008 9:29 am

Amigos del Foro


Se puede en MENU cuando el usuario haya seleccionado un MENUITEM

al ejecutado una funcion seleccionada desde una MENUITEM, al salir de la funcion regresar a dicho MENUITEM ? :shock:

david
argentina
dobfivewin
 
Posts: 325
Joined: Sun Feb 03, 2008 11:04 pm
Location: Argetnina

Postby horacio » Sat Dec 13, 2008 4:29 pm

En la página de Fivewin Brasil, en dicas podrás encontrar lo que estás buscando.
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Postby dobfivewin » Mon Dec 15, 2008 9:06 pm

discuplas

me podras pasar el link, no lo encuentro y se me complica por el portugues... :oops:

david
argentina
dobfivewin
 
Posts: 325
Joined: Sun Feb 03, 2008 11:04 pm
Location: Argetnina

Postby ADBLANCO » Tue Dec 16, 2008 9:00 pm

Aunque no es exactamente lo que estas pidiendo, pruedas probar Esto:

FUNCTION RESTMENU(cChar)
RETURN SendMessage( oWnd:hWnd, WM_SYSCOMMAND, SC_KEYMENU, nMakeLong( cChar, 0 ) )


LOCAL oMenu
MENU oMenu
MENUITEM '&Tablas' WHEN NIVEL(5,.F.) MESSAGE "Actualizar Tablas"
MENU
MENUITEM "&1.- Tipos de Accidente" ACTION (SSN01(oWnd),RESTMENU("T"));
MESSAGE "Actualizar Tipos de Accidente"
.
.
.
.
.
.
etc etc

lo que pasa es que solo trabaja a primer nivel
Saludos

Angel, Valencia, Venezuela

xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
User avatar
ADBLANCO
 
Posts: 299
Joined: Mon Oct 22, 2007 3:03 pm
Location: Valencia - Venezuela

Re: Menu (se podrá?)

Postby Maggiro » Sun Oct 11, 2015 3:58 pm

dobfivewin wrote:Amigos del Foro


Se puede en MENU cuando el usuario haya seleccionado un MENUITEM

al ejecutado una funcion seleccionada desde una MENUITEM, al salir de la funcion regresar a dicho MENUITEM ? :shock:

david
argentina


Creo que si se puede:
- Cualquier proceso cuya terminación obligadamente te retorna a la ventana donde se
encuentra la barra de menu que lo llamó (y que está cerrada mostrando el menu principal
por cierto debido al comportamiento del sistema de menu que oculta los submenus
desplegables) puede ser pasible de invocar el menuitem que lo llamó ...
- y cómo se hace??
- volviéndolo a desplegar usando el mismo juego de teclas que hiciste con tus dedos,
pero programando la ejecución de esas teclas interna e inmediatamente después del return
nil ...
- Busca en los manuales, el comando que ejecuta pulsos de teclas internamente, también
lo puedes buscar en el foro ... o de repente nuestros amigos que siguen el tema te acercarán
al comando ejecutor interno de teclas que buscas para posicionarte en el menuitem que desees.

Adelante con tu intento !!!

Saludos

Julio César Gómez Cortéz
Godryc Experiencias
Lima Perú
-
User avatar
Maggiro
 
Posts: 84
Joined: Thu Oct 14, 2010 3:26 am
Location: LIMA - PERU

Re: Menu (se podrá?)

Postby horacio » Sun Oct 11, 2015 4:21 pm

Fijate si es la función que necesitas

Code: Select all  Expand view

#define KEYEVENTF_KEYUP 2
//----------------------------------------------------------------------------//
Function ShowMenu( oM, nNiv )
                       
    Local cMv
    Local nChr
    Local nItem
    Local oLItM
    Local cMov := ""
   
    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 )
                    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 i
                    Return( .t. )
                End
                Return cMov
            End
        Else
            If( oM : aItems[ nItem ] : nId == oLItM : nId )
                Return cMov + "x"
            End
        End
        If( !Empt( oM : aItems[ nItem ] : cPrompt ) ) // se não for um separador
            cMov +=Chr( If( nNiv == 0, VK_RIGHT, VK_DOWN ) )
        End
    Next nItem
    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"
 


Y se usa de la siguiente manera

Code: Select all  Expand view

MenuItem 'Tabla &empresas' Action( SeleccionaEmpresa(), ShowMenu() )
 



Saludos
horacio
 
Posts: 1363
Joined: Wed Jun 21, 2006 12:39 am
Location: Capital Federal Argentina

Re: Menu (se podrá?)

Postby FranciscoA » Sun Oct 11, 2015 8:45 pm

horacio wrote:Fijate si es la función que necesitas

Code: Select all  Expand view

#define KEYEVENTF_KEYUP 2
//----------------------------------------------------------------------------//
Function ShowMenu( oM, nNiv )
                       
    Local cMv
    Local nChr
    Local nItem
    Local oLItM
    Local cMov := ""
   
    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 )
                    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 i
                    Return( .t. )
                End
                Return cMov
            End
        Else
            If( oM : aItems[ nItem ] : nId == oLItM : nId )
                Return cMov + "x"
            End
        End
        If( !Empt( oM : aItems[ nItem ] : cPrompt ) ) // se não for um separador
            cMov +=Chr( If( nNiv == 0, VK_RIGHT, VK_DOWN ) )
        End
    Next nItem
    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"
 


Y se usa de la siguiente manera

Code: Select all  Expand view

MenuItem 'Tabla &empresas' Action( SeleccionaEmpresa(), ShowMenu() )
 



Saludos


Horacio, gracias por compartir tu codigo. Lo he probado, y está funcionando.
Code: Select all  Expand view
     MENUITEM "PRUEBAS"
      MENU
         MENUITEM "Pruebas varias"
            MENU
            MENUITEM "Volver al sub menu"
                MENU
                MENUITEM "Probando volver a este menu-item"   ACTION ( MsgInfo("Primer sub-menu"), ShowMenu() )
                MENUITEM "Probando2 volver a este menu-item"  ACTION ( MsgInfo("Ajai segundo sub-menu"), ShowMenu() )
                ENDMENU
 

Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Menu (se podrá?)

Postby joseluisysturiz » Sun Oct 11, 2015 9:27 pm

Francisco, estas usando menu dinamico.? es decir contruido desde una tabla o dbf dependiendo del usuario.? si es asi, podrias compartir el codigo de construccion y lectura desde la tabla o dbf.? gracias, saludos... :shock:
Dios no está muerto...

Gracias a mi Dios ante todo!
User avatar
joseluisysturiz
 
Posts: 2064
Joined: Fri Jan 06, 2006 9:28 pm
Location: Guatire - Caracas - Venezuela

Re: Menu (se podrá?)

Postby jcenteno » Sun Oct 11, 2015 11:13 pm

joseluis

Esto funciona para mi desde hace algunos años.

Saludos.


FUNCTION BldMenu()
*----------------------------------------------------------------*
LOCAL oMainMenu, oMnuItem, lRight, cValue, cMnuAlias, i:= 1, nRec, fAction, cFileBmp, cResName
LOCAL cQry, oQry, nL, nEnd

IF ! oApp:lMySql && Si es DBF

IF !AbreDbf( @cMnuAlias, oSystem:csysmenu, 1 )
oWnd:PostMsg(WM_CLOSE)
ENDIF
nRec := (cMnuAlias)->( AdsKeyCount( ,,ADS_RESPECTSCOPES ) )

MENU oApp:oMainMenu 2010

FOR i := 1 To nRec

IF (cMnuAlias)->FLDSEPARAT
SEPARATOR
ENDIF

IF (cMnuAlias)->FLDVIRTKEY == 0
MENUITEM oMnuItem PROMPT OemToAnsi(ALLTRIM((cMnuAlias)->FLDTXTOPT)) ;
MESSAGE OemToAnsi(ALLTRIM((cMnuAlias)->FLDMESSAGE))
ELSE
MENUITEM oMnuItem PROMPT OemToAnsi(ALLTRIM((cMnuAlias)->FLDTXTOPT)) ;
MESSAGE OemToAnsi(ALLTRIM((cMnuAlias)->FLDMESSAGE)) ;
ACCELERATOR (cMnuAlias)->FLDNSTATE, (cMnuAlias)->FLDVIRTKEY
ENDIF

oMnuItem:lChecked := (cMnuAlias)->FLDCHECK

oMnuItem:lActive := ( lRight:= Eval( {||&(ALLTRIM((cMnuAlias)->FLDCONDI))} ) )

IF ! EMPTY( fAction := ALLTRIM((cMnuAlias)->FLDACTION) )
oMnuItem:bAction := &( fAction )
ENDIF

IF FILE( cFileBmp := oGraph:cmnuimgpath + ALLTRIM((cMnuAlias)->FLDFILEBMP) )
oMnuItem:hBitmap:= ReadBitmap( 0, cFileBmp )
ENDIF
IF ! EMPTY( cResName := ALLTRIM((cMnuAlias)->FLDRESBMP) )
oMnuItem:hBitmap:= LoadBitmap( GetResources(), cResName )
ENDIF

IF ! EMPTY( ALLTRIM((cMnuAlias)->FLDSYS) )
AAdd( oApp:aObjSys, oMnuItem )
ENDIF

cValue := ALLTRIM((cMnuAlias)->CNEXT)

nEnd := (cMnuAlias)->NLOOP
FOR nL := 1 TO nEnd

DO CASE
CASE Left(cValue,1) = 'M'
MenuBegin( ,,, TRUE )
CASE Left(cValue,1) = 'E'
MenuEnd()
END CASE

NEXT nL

(cMnuAlias)->(dbSkip())
NEXT i

MENUITEM 'A&yuda' HELP
MENU
MENUITEM '&Help' ACTION HelpIndex() RESOURCE 'AYUDA1'
MENUITEM '&Acerca de...' ACTION fAbout()
ENDMENU
ENDMENU

(cMnuAlias)->(dbCloseArea())

ELSE && MySql

cQry := "SELECT * FROM " + oSystem:csysmenu + " WHERE lActive ORDER BY fldnivel ASC"

IF !AbreDbf( @oQry, oSystem:csysmenu, 1,, oRDD:rdbms, cQry )
MsgInfo('Error de apertura')
oWnd:PostMsg(WM_CLOSE)
ENDIF

nRec := oQry:LastRec()

oApp:oMainMenu := MenuBegin( ,,, TRUE )

FOR i := 1 To nRec

IF ( oQry:FLDSEPARAT )
oMnuItem:= MenuAddItem()
ENDIF

IF FILE( cFileBmp := oGraph:cmnuimgpath + ALLTRIM(oQry:FLDFILEBMP) )
ENDIF
IF ! EMPTY( cResName := ALLTRIM(oQry:FLDRESBMP) )
ENDIF
IF ! EMPTY( ALLTRIM(oQry:FLDACTION) )
fAction := &( ALLTRIM(oQry:FLDACTION) )
ENDIF

&& Crea nuevo Item del Menú
WITH OBJECT ( oMnuItem := MenuAddItem( ,,,,, cFileBmp, cResName, oApp:oMainMenu ) )

:cPrompt := ALLTRIM( oQry:FLDTXTOPT )
:cMsg := ALLTRIM( oQry:FLDMESSAGE )
:bAction := fAction
:lActive := ( lRight:= Eval( {||&( ALLTRIM( oQry:FLDCONDI ) )} ) )
:lBreak := FALSE
:lChecked := oQry:FLDCHECK
:lHelp := FALSE
:oMenu := oApp:oMainMenu
:nVKState := oQry:FLDNSTATE
:nVirtKey := oQry:FLDVIRTKEY

END

IF ! EMPTY( ALLTRIM(oQry:FLDSYS) )
AAdd( oApp:aObjSys, oMnuItem )
ENDIF

cValue := ALLTRIM(oQry:CNEXT) && Próximo nivel a crear o eliminar

nEnd := oQry:NLOOP
FOR nL := 1 TO nEnd

DO CASE
CASE Left(cValue,1) = 'M'
MenuBegin( ,,, TRUE )
CASE Left(cValue,1) = 'E'
MenuEnd()
END CASE

NEXT nL

oQry:Skip()
NEXT i

MENUITEM 'A&yuda' HELP
MENU
MENUITEM '&Help' ACTION HelpIndex() RESOURCE 'AYUDA1'
MENUITEM '&Acerca de...' ACTION fAbout()
ENDMENU
ENDMENU

oQry:End()

ENDIF

RELEASE lRight, cValue, cMnuAlias, i, nRec, fAction, cFileBmp, cResName, cQry

RETURN oApp:oMainMenu
jcenteno
 
Posts: 23
Joined: Thu Dec 10, 2009 6:07 am

Re: Menu (se podrá?)

Postby FranciscoA » Mon Oct 12, 2015 12:58 am

joseluisysturiz wrote:Francisco, estas usando menu dinamico.? es decir contruido desde una tabla o dbf dependiendo del usuario.? si es asi, podrias compartir el codigo de construccion y lectura desde la tabla o dbf.? gracias, saludos... :shock:


Hola José Luis. Lo siento, no estoy usando menus dinámicos, desde dbf.

Viendo el código de jcenteno, voy a tratar de adaptarlo. Gracias por compartirlo.

Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.

Fwxh-MySql-TMySql
User avatar
FranciscoA
 
Posts: 2158
Joined: Fri Jul 18, 2008 1:24 am
Location: Chinandega, Nicaragua, C.A.

Re: Menu (se podrá?)

Postby Maggiro » Mon Oct 12, 2015 3:29 am

Francisco:
Si el comando de Horacio funciona, acercaría FWH al comportamiento @ PROMPT del MENU TO de Clipper en un 50%
Lo restante sería
- el hacer que la barra de menú se active al solo golpe de una letra que coincida con cualquiera de
los menuitems primarios que conforman la barra. ejemplo (en vez de Alt + A) (solo A)
- el hacer wraps en los submenus
(no lo he probado aún, de repente FWH ésto de los wraps si lo tiene).

Saludos
Julio César Gómez Cortéz
Godryc Experiencias
Lima Perú
User avatar
Maggiro
 
Posts: 84
Joined: Thu Oct 14, 2010 3:26 am
Location: LIMA - PERU

Re: Menu (se podrá?)

Postby Maggiro » Mon Oct 12, 2015 2:55 pm

Horacio:
Probado !! tu código si funciona !!!
y FWH tiene wraps activos !!!
80% de acercamiento al comportamiento de los menus Clipper ...

Saludos y gracias por compartir tu código
Julio César Gómez Cortéz
Godryc Experiencias
Lima Perú
User avatar
Maggiro
 
Posts: 84
Joined: Thu Oct 14, 2010 3:26 am
Location: LIMA - PERU


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 49 guests