Una funcion embebida en una variable??

General Help regarding HMG, Compilation, Linking, Samples

Moderator: Rathinagiri

Post Reply
User avatar
jorge_riv
Posts: 86
Joined: Thu Nov 22, 2018 2:20 pm
DBs Used: DBF, MySQL,SQL SERVER, Oracle.

Una funcion embebida en una variable??

Post by jorge_riv »

Temgo esto_

FUNTION MAIN
...
...
FOR nI:=1 TO 4
Em_Menu( cWnd, nF,20,aMn[nI],aMnI[nI][1],aMnI[nI][2], nI, ;
"Em9_Validar_Base('nI')",4 )
nF += 100
NEXT
..
*"Em9_Validar_Base(nI)" // nO FUNCIONA TAMPOCO ASI
---------------------------
FUNTION Em_Menu(cWnd,nF,nC,aImg,aIco1,aIco2,nI,fAct,nL)
@ nF,nC IMAGE &(aImg) OF &(cWnd) PICTURE aIco1+'.jpg';
WIDTH 70 HEIGHT 70 STRETCH ;
ON MOUSEHOVER (This.Icon := aIco2+'.jpg') ;
ON MOUSELEAVE (This.Icon := aIco1+'.jpg') ;
ACTION IF(nI<nL,&(fAct),ThisWindow.Release)
*
RETURN Nil
**********
Problema:
Me da Error de que la variable que envio embebida en la variable no existe (variable nI)
Consulta:
Alguien sabe una forma de ejecutar una funcion con una variable dentro de una variable????
Gracias
User avatar
Claudio Ricardo
Posts: 367
Joined: Tue Oct 27, 2020 3:38 am
DBs Used: DBF, MySQL, MariaDB
Location: Bs. As. - Argentina

Re: Una funcion embebida en una variable??

Post by Claudio Ricardo »

Hola... probastes con &nl
Corrige al sabio y lo harás más sabio, Corrige al necio y lo harás tu enemigo.
WhatsApp / Telegram: +54 911-63016162
User avatar
AUGE_OHR
Posts: 2117
Joined: Sun Aug 25, 2019 3:12 pm
DBs Used: DBF, PostgreSQL, MySQL, SQLite
Location: Hamburg, Germany

Re: Una funcion embebida en una variable??

Post by AUGE_OHR »

hi,

try use a Codeblock which you can "build" at Runtime

Code: Select all

PROCEDURE MAIN
LOCAL MyFunc := "MyFunc2"
   MyFunc1(MyFunc,123)
   WAIT
RETURN

PROCEDURE MyFunc1(cFunc,nIn)
LOCAL cBlock := "{||" + cFunc + "(" + STR(nIn) +")}"
   EVAL(&cBlock)
RETURN

PROCEDURE MyFunc2(cIn)
   ? cIn
RETURN
have fun
Jimmy
User avatar
jorge_riv
Posts: 86
Joined: Thu Nov 22, 2018 2:20 pm
DBs Used: DBF, MySQL,SQL SERVER, Oracle.

Re: Una funcion embebida en una variable??

Post by jorge_riv »

Hola AUGE_OHR, Alias Jimmy, muy bueno tu codigo, lo probe y funciona perfecto, gracias con tu ejemplo pude solucionar el tema, solo tengo un inconveniente cuando presiono el boton derecho del mousse, logro capturar el codigo (en un textbox) pero no encuentro la forma de eliminar la opciones que aparecen, o sea quiero anular la el boton derecho en los texboxs, u no encuentro ejemplo alguno, si tenes algo por alli, manda ejemplo. Muchas Gracias
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: Una funcion embebida en una variable??

Post by SALINETAS24 »

AUGE_OHR wrote: Sun Apr 25, 2021 2:39 am hi,

try use a Codeblock which you can "build" at Runtime

Code: Select all

PROCEDURE MAIN
LOCAL MyFunc := "MyFunc2"
   MyFunc1(MyFunc,123)
   WAIT
RETURN

PROCEDURE MyFunc1(cFunc,nIn)
LOCAL cBlock := "{||" + cFunc + "(" + STR(nIn) +")}"
   EVAL(&cBlock)
RETURN

* PROCEDURE MyFunc2(cIn)
*   ? cIn
* RETURN

STATIC PROCEDURE MyFunc2(cIn)
   ? cIn
RETURN


Hola a todos, tengo una duda.

Yo uso un procedimiento parecido a este, llamo a una función que cargo previamente en una variable y funciona correctamente, siempre y cuando no use "STATIC PROCEDURE MyFunc2".
Si llamo a una STATIC FUNC o STATIC PROC me dice que el procedimiento no existe, aunque este lineas más abajo

¿Alguien sabe porque...?

Tambien he probado solo con &funcion y obtengo el mismo resultado

¿Como puedo llamar desde una variable a una FUNCION o PROCEDURE con la clausula STATIC..?

Muchas gracias
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
Claudio Ricardo
Posts: 367
Joined: Tue Oct 27, 2020 3:38 am
DBs Used: DBF, MySQL, MariaDB
Location: Bs. As. - Argentina

Re: Una funcion embebida en una variable??

Post by Claudio Ricardo »

Hola Salinetas

"Si llamo a una STATIC FUNC o STATIC PROC me dice que el procedimiento no existe, aunque este lineas más abajo"

Me pasó lo mismo y lo solucioné cortando esa función y pegándola mas arriba en el .prg (antes de la función que la llama)
para que ya esté definida cuando la llame.
Corrige al sabio y lo harás más sabio, Corrige al necio y lo harás tu enemigo.
WhatsApp / Telegram: +54 911-63016162
User avatar
SALINETAS24
Posts: 667
Joined: Tue Feb 27, 2018 3:06 am
DBs Used: DBF
Contact:

Re: Una funcion embebida en una variable??

Post by SALINETAS24 »

Hola Claudio, gracias por contestar.
Tu solución no me funciona, tengo esto

Code: Select all

PROC _EjecutaVirtual(cFuncion)
	IF !EMPTY(cFuncion)
*		EVAL({||&cFuncion})
	    &cFuncion
	ENDIF
RETURN
Y lo tengo en una libreria, a modo de las antiguas "lib" con diversos procedimientos standard que uso en mis PRG.
En la compilación, este fichero esta puesto el ultimo.., pero me sigue dando el error cuando lo ejecuto.

Lo he resuelto un poco chapucilla, pero me vale. Llamo al procedimiento que quiero, y este a su vez llama al procedimiento STATIC, donde tengo el desarrollo.

Code: Select all

PROC _PantallaDatosVirtual()
	_PantallaDatosVirtual1()
RETURN
STATIC PROC _PantallaDatosVirtual1()
Sl2
Como dijo el gran pensador Hommer Simpson..., - En este mundo solo hay 3 tipos de personas, los que saben contar y los que no. :shock:
User avatar
luisvasquezcl
Posts: 1263
Joined: Thu Jul 31, 2008 3:23 am
Location: Chile
Contact:

Re: Una funcion embebida en una variable??

Post by luisvasquezcl »

Hola, creo que el problema es que tienes entre comillas la variable nl
Em9_Validar_Base('nI')", además que es de tipo numérico.
Espero te ayude, saludos.
User avatar
Claudio Ricardo
Posts: 367
Joined: Tue Oct 27, 2020 3:38 am
DBs Used: DBF, MySQL, MariaDB
Location: Bs. As. - Argentina

Re: Una funcion embebida en una variable??

Post by Claudio Ricardo »

Hola Salinetas, eso es porque al llamar a la función por su verdadero nombre obligas al compilador
a tenerla cargada previamente cosa que no sucede si la llamás por referencia con " & " (amperstand)...
Es como como si a una variable que no has definido le preguntas el valor... por ejemplo MsgDebug (cVarNoDefinida)
cuando el programa llegue a esa linea te dará el mismo error de que no existe la variable " cVarNoDefinida "
Eso se soluciona si compilas con /n ese parámetro "creo si no recuerdo mal" obliga a compilar las funciones y
procedures aunque no sean llamadas desde el resto del programa, entonces sí las podés llamar por referencia con &.
Tu puedes tener una librería con 1000 funciones pero si el programa llama a sólo 2, esas serán las que se compilarán.
Corrige al sabio y lo harás más sabio, Corrige al necio y lo harás tu enemigo.
WhatsApp / Telegram: +54 911-63016162
Post Reply