Menu (se podrá?)
-
- Posts: 325
- Joined: Sun Feb 03, 2008 11:04 pm
- Location: Argetnina
Menu (se podrá?)
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 ?
david
argentina
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 ?
david
argentina
-
- Posts: 325
- Joined: Sun Feb 03, 2008 11:04 pm
- Location: Argetnina
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
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
Angel, Valencia, Venezuela
xH .997 - FW 7.9 - BCC55 - WorkShop - MySql
Re: Menu (se podrá?)
Creo que si se puede: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 ?
david
argentina
- 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ú
-
Re: Menu (se podrá?)
Fijate si es la función que necesitas
Y se usa de la siguiente manera
Saludos
Code: Select all
#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"
Code: Select all
MenuItem 'Tabla &empresas' Action( SeleccionaEmpresa(), ShowMenu() )
Saludos
- FranciscoA
- Posts: 1964
- Joined: Fri Jul 18, 2008 1:24 am
- Location: Chinandega, Nicaragua, C.A.
Re: Menu (se podrá?)
Horacio, gracias por compartir tu codigo. Lo he probado, y está funcionando.horacio wrote:Fijate si es la función que necesitas
Y se usa de la siguiente maneraCode: Select all
#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"
Code: Select all
MenuItem 'Tabla &empresas' Action( SeleccionaEmpresa(), ShowMenu() )
Saludos
Code: Select all
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
Francisco J. Alegría P.
Chinandega, Nicaragua.
Fwxh1204-MySql-TMySql
Chinandega, Nicaragua.
Fwxh1204-MySql-TMySql
- joseluisysturiz
- Posts: 2024
- Joined: Fri Jan 06, 2006 9:28 pm
- Location: Guatire - Caracas - Venezuela
- Contact:
Re: Menu (se podrá?)
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...
Dios no está muerto...
Gracias a mi Dios ante todo!
Gracias a mi Dios ante todo!
Re: Menu (se podrá?)
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
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
- FranciscoA
- Posts: 1964
- Joined: Fri Jul 18, 2008 1:24 am
- Location: Chinandega, Nicaragua, C.A.
Re: Menu (se podrá?)
Hola José Luis. Lo siento, no estoy usando menus dinámicos, desde dbf.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...
Viendo el código de jcenteno, voy a tratar de adaptarlo. Gracias por compartirlo.
Saludos.
Francisco J. Alegría P.
Chinandega, Nicaragua.
Fwxh1204-MySql-TMySql
Chinandega, Nicaragua.
Fwxh1204-MySql-TMySql
Re: Menu (se podrá?)
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ú
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ú
Re: Menu (se podrá?)
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ú
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ú