Page 1 of 1

Ejecutar funciones creadas a traves de codigo

Posted: Thu Jun 22, 2006 7:26 am
by txon
Saludos amigos:

Trato de crear una rutina que me permita ejecutar funciones creadas desde codigo, quizas con un ejemplo se entienda mejor.

DEFINE WINDOW oWnd TITLE "Pruebas" COLOR "W+/BG";
@ 8,10 COMBOBOX oCbx VAR cCbx {"Cliente","Proveedor","Articulo"} OF oWnd SIZE 50,40
@ 10, 10 BUTTON oBtn1 PROMPT "Funcion" OF oWnd SIZE 32,16 ACTION MiFuncion(oWnd,cCbx)
@ 14, 10 BUTTON oBtn2 PROMPT "Salir" OF oWnd SIZE 32,16 ACTION oWnd:End()
ACTIVATE WINDOW oWnd MAXIMIZED
//
FUNCTION MiFuncion(oWnd,cCbx)
[// Aqui deberia ir el codigo que en funcion del valor del Combobox, lanzara la funcion correspondiente, algo asi como:
&(cCbx+"(oWnd)") // Esto no funciona

RETURN nil
//
FUNCTION CLiente(oWnd)
MsgInfo("Archivo de clientes")
RETURN nil
//
FUNCTION Proveedor(oWnd)
MsgInfo("Archivo de proveedores")
RETURN nil
//
FUNCTION Articulo(oWnd)
MsgInfo("Archivo de articulos")
RETURN nil

Gracias de antemano por vuestra ayuda

Posted: Thu Jun 22, 2006 10:16 am
by Antonio Linares
Alfonso,

Puedes usar la clase Symbol de Harbour, que está basada en la clase Symbol de Class(y):

Code: Select all

FUNCTION MiFuncion(oWnd,cCbx) 

   local oSymbol :=  Symbol():New( cCbx )

   oSymbol:Exec( oWnd )

return nil

Posted: Thu Jun 22, 2006 8:48 pm
by Mike Serra
Txon:

Si quieres prueba esto, a mi me funciona perfectamente:

function main()
....
..... ACTION eval( &( "{|| pruebas()}" ) )
....
return


function pruebas()
msginfo("Probando")
return

SALUDOS

Miguel A.

Posted: Fri Jun 23, 2006 8:59 am
by txon
Gracias a todos por responder, he probado, eval( &( "{|| pruebas()}" ) ) y funciona perfectamente, el problema es cuando queremos pasar parametros en la funcion, por ejemplo eval( &( "{|| pruebas(oGet,nCampo)}" ) ), en ese caso devuelve un error al tiempo de ejecucion "Variable oGet no encontrada", cuando realmente esta definida con anterioridad.

Posted: Fri Jun 23, 2006 9:02 am
by Antonio Linares
Alfonso,

Las macros (&) usan la tabla de símbolos pública y las variables locales no estan en dicha tabla, por eso falla.

Pruébalo así:
eval( &( "{| o | pruebas( o,nCampo)}" ), oGet )

Posted: Fri Jun 23, 2006 11:08 am
by txon
Funciona perfectamente, gracias, habia olvidado las nociones basicas de Clipper.