FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour como saber que elemento de un menu se ha seleccionado
Posts: 564
Joined: Thu Oct 13, 2005 09:23 AM
como saber que elemento de un menu se ha seleccionado
Posted: Fri Apr 20, 2007 07:02 AM
Hola:
Quiero poner un menu que me permita hacer un filtro sobre una dbf en base a elementos de un array. Algo así:
	MENU oMenu POPUP
		MENUITEM i18n("Todas las actividades") ;
			ACTION AP->(DbClearFilter())
		SEPARATOR
		For i=1 to Len(aActividad)
			MENUITEM i18n(aActividad[i]) ;
				ACTION ( AC->(DbSetFilter( {|| AP->ApActivida==aActividad[i] })), AC->(DbGoTop()))
		Next
   ENDMENU

El menu me lo muestra bien, pero al ejecutar la opción evidentemente no puedo evaluar la i del codeblock, y ahi me pierdo. Hay un array llamado aItems que contiene los items del menu, pero no se como saber en tiempo de ejecución que item se ha seleccionado.
Saludos,
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
como saber que elemento de un menu se ha seleccionado
Posted: Fri Apr 20, 2007 08:47 AM
Jose Luis,

Usa "detached locals":
      local bAction
      ...
      For i=1 to Len(aActividad) 
         bAction = GenCodeBlock( aActividad, i ) 
         MENUITEM i18n(aActividad[i]) ACTION Eval( bAction ) 
      Next 
...

function GenCodeBlock( aActividad, i )
return { || AC->(DbSetFilter( {|| AP->ApActivida==aActividad[i] })), AC->(DbGoTop()) }
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 564
Joined: Thu Oct 13, 2005 09:23 AM
como saber que elemento de un menu se ha seleccionado
Posted: Fri Apr 20, 2007 09:59 AM

Antonio:
No funciona bien. Pulsando cualquier opción solo hace el filtro por el ultimo valor que ha cogido i cuando finaliza el bucle, es decir por len(aActividad).

Saludos,

Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
como saber que elemento de un menu se ha seleccionado
Posted: Fri Apr 20, 2007 12:19 PM

Es porque está usando el último bAction creado...

hay que modificarlo...

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
como saber que elemento de un menu se ha seleccionado
Posted: Fri Apr 20, 2007 12:57 PM
Jose Luis,

Prueba con:

MENUITEM i18n(aActividad[i]) BLOCK bAction
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 564
Joined: Thu Oct 13, 2005 09:23 AM
como saber que elemento de un menu se ha seleccionado
Posted: Fri Apr 20, 2007 02:06 PM

Antonio:
Así si funciona, gracias. Lo que no entiendo es porque, que diferencia hay entre el Eval y usar la clausula block.

Saludos,

Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
como saber que elemento de un menu se ha seleccionado
Posted: Fri Apr 20, 2007 02:13 PM

Jose Luis,

Al hacer: ... ACTION Eval( bAction )

En realidad se está creando un bloque de código:

{ || Eval( bAction ) }

que referencia a la variable local en ambito, con el último valor que tenga.

Al usar ... BLOCK bAction se está guardando el valor de bAction en ese momento. Es decir se hace una copia de él, con el valor actual.

regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 592
Joined: Tue Mar 14, 2006 11:34 PM
como saber que elemento de un menu se ha seleccionado
Posted: Wed Jun 13, 2007 05:14 PM
Hola Antonio :

Intento aplicar el mismo metodo a mi menu pero no se deja :


aCatEmps := ObtAllSysEmps()
aEmpsIds := {1,2,3,4}

	MENUITEM "Empresas"
	MENU
		MENUITEM "Empresa Demo" ACTION OpnXEmp2Wrk( 0 )
		FOR nQ := 1 TO Len( aCatEmps )
			bAction := GenCodeBlock( aEmpsIds, nQ )
			MENUITEM aCatEmps[nQ] ACTION BLOCK bAction
		NEXT
	ENDMENU

Static Function GenCodeBlock( aEmpsIds, nQ ) 
return { || OpnXEmp2Wrk( aEmpsIds[nQ] ) }


Lo que necesito es que las opciones del menu se generen en forma dinamica, segun existan en un Archivo, y que todas manden llamar la misma funcion "OpnXEmp2Wrk()" solo con el parametro diferente.

Al momento de compilar, me manda el mensaje :

Error E0030 Syntax error: "parse error at 'ACATEMPS'"



Muchas Gracias

Saludos
FWH 10.6 + xHarbour + Borland 582
Posts: 44162
Joined: Thu Oct 06, 2005 05:47 PM
como saber que elemento de un menu se ha seleccionado
Posted: Wed Jun 13, 2007 05:48 PM
Raymundo,

Aqui sobra la cláusula ACTION:

MENUITEM aCatEmps[nQ] ACTION BLOCK bAction
regards, saludos

Antonio Linares
www.fivetechsoft.com
Posts: 592
Joined: Tue Mar 14, 2006 11:34 PM
como saber que elemento de un menu se ha seleccionado
Posted: Wed Jun 13, 2007 07:09 PM

Antonio :

Funciona perfecto !!!!

Muchas Gracias Master :P

Saludos

FWH 10.6 + xHarbour + Borland 582
Posts: 74
Joined: Mon Jun 10, 2013 01:21 PM
Re: como saber que elemento de un menu se ha seleccionado
Posted: Wed Jan 25, 2017 01:41 PM

Estimados colegas,
Estuvimos trabajando con este mismo tema y utilizamos esto que podría serles de utilidad,

*-----------------------
MENU oPopRub POPUP 2007
*-----------------------
    MENUITEM "Todos los Productos" RESOURCE 'b_xopen'  ACTION ( wfprodu->(Dbclearfil()), wfprodu->(Dbgotop()),;
                                                        oBrw:refresh(),oBrw:Gotop(),oBrw:SetFocus(),;COLORPNEL CLR_HRED 
            SEPARATOR

           for x:= 1 TO len(aRubros)
        MENUITEM "Rubro " + aRubros[x] RESOURCE 'b_xopen' ;
                                     ACTION ( Dbclearfil(), Dbsetfilter({|| wfprodu->rubro = Substr( oPopRub:oLastItem:cCaption,7,1) }) , ;
                                        wfprodu->(Dbgotop()),oBrw:Refresh(),oBrw:Gotop(),oBrw:SetFocus() ) ;
                         COLORPNEL CLR_BLACK 
                        SEPARATOR          
       next

     ENDMENU

Saludos Mariano y Raul

Continue the discussion