Page 1 of 1

¿Cómo defino esto como bloque?

Posted: Fri Dec 17, 2010 1:16 pm
by goosfancito
hola.

Tengo una idea dando vueltas, necesito pasar en un array 3 parametros compuesto por:
un numero: 4,
una conficion: if(::oDato:fields(2):value==2)
un valor de color: "#D9DFF0"
para luego analizar esa "condición"(segundo parametro) y dependiendo de el resultado ponerle un color.

Lo que no logro hacer es poder pasar la condicion y luego utilizarla.

Code: Select all

aArray:= {4, || if(::oDato:fields(2):value==2) ,"#D9DFF0" }
gracias

Re: ¿Cómo defino esto como bloque?

Posted: Fri Dec 17, 2010 1:47 pm
by jllinas
Amigo,

Ignoro que significa el "4" (parecería que es primer elemento en un arreglo que quieres usar después en "algo"), pero si lo que deseas es evaluar la condición, y en base al resultado retornar el color, seria algo asi:

array := {4, if(condicion, color,)}

Y creo que para evaluarla podrias usar AEVAL(). Fijate en los ejemplos de xHarbour, y alli te puedes ayudar.

Suerte (si te interpreté bien),

Re: ¿Cómo defino esto como bloque?

Posted: Fri Dec 17, 2010 2:06 pm
by mastintin
Si la funcion a donde la pasar es un metodo conocera ::oDato , sino deberas pasar la referencia a la clase

Code: Select all


local bcondicion:= {|o |  if (o:oDato:fields(2):value==2) } 
local aArray:= {4, bcondicion , self ,"#D9DFF0" }
recibe(aArray)

function recibe(aArray)
local bcondicion:=aArray[2]
local o:=aArray[3]
if eval(bcondicion,o )
  ...
else
...
endif


Return nil

 
Aunque yo evaluaria la condicon antes de pasarla y pasaría el resultado ...

Code: Select all


local lcondicion:=  Iif (::oDato:fields(2):value==2, .t. ,.f.)  
local aArray:= {4, lcondicion , "#D9DFF0" }
recibe(aArray)


function recibe(aArray)

if aArray[2]
  ...
else
...
endif


Return nil



 

Re: ¿Cómo defino esto como bloque?

Posted: Fri Dec 17, 2010 3:34 pm
by goosfancito
Gracias a ambos. Pero tomando este ejemplo paso a explicarme mejor.
El array aArray puede o no contener mas de un arreglo del que mensionaba. A ver...

aArray:= {
{1, "saldo=2", "#001225"},
{10, "cliente=2", "#000025"},
}


quiero que luego poder desglozar esas dos condiciones. ya que "saldo" y "cliente" son variables.

Code: Select all

for nitem:= 1 to 5
   if (aArray[1,1] = nItem)
      if ACA QUIERO HACER QUE PREGUNTE POR LA CONDICION///// 
        PINTAR DEL COLOR aArray[1,3]
     endif
   endif
next 
 

Me explique mejor?

Re: ¿Cómo defino esto como bloque?

Posted: Fri Dec 17, 2010 3:53 pm
by mastintin
pasa el array asi :

Code: Select all

aArray:= {
{1,  {||saldo=2 }, "#001225"},
{10,{|| cliente=2 }, "#000025"},
}

 
y luego evalualo:

Code: Select all

for nitem:= 1 to 5
   if (aArray[1,1] = nItem)
      if eval(aArray[1,2])
        PINTAR DEL COLOR aArray[1,3]
     endif
   endif

 

Re: ¿Cómo defino esto como bloque?

Posted: Fri Dec 17, 2010 4:25 pm
by jllinas
Creo que seria asi:

Code: Select all

for nitem:= 1 to 5
   if (aArray[1,1] = nItem)
      if &("("+aArray[1,2]+")") 
        PINTAR DEL COLOR aArray[1,3]
     endif
   endif
next 
 
Lo que ocurre es que la condicion debe ser testeada en tiempo real (no se puede evaluar antes), ese elemento del aArray esta en string, por lo cual debes utlizar el macro (&()) de la expresion, que seria, por ejemplo "(cliente==2)"

Suerte,

Re: ¿Cómo defino esto como bloque?

Posted: Sat Dec 18, 2010 1:44 am
by goosfancito
Entendi lo que me explicas pero en mi codigo no me anda.

Code: Select all

Ejmplo:

:aColorear   := {{4,"nItem==1","#001225"}}
...

FOR nItem:= 1 TO Len(::aColumna)
   IF &("("+::aColorear[1,2]+")")
      // cuando lo ejecuto me dice NITEM no definido... es por eso que no lo entiendo.
      // nitem esta definido.
            ENDIF
next nITem
 

Re: ¿Cómo defino esto como bloque?

Posted: Sat Dec 18, 2010 1:22 pm
by jllinas
El mensaje de error que dices aquí tiene que ver con otra cosa (definición de variables). Busca por otro lado.

Yo haría debug paso-a-paso, a ver que está pasando con nItem (antes, durante y despues del bucle).

Suerte,

Re: ¿Cómo defino esto como bloque?

Posted: Sat Dec 18, 2010 1:42 pm
by jrestojeda
Hola amigo...
Prueba algo así:

AADD(aArray ,{ n1 , lCondicion1 , Color1 } )
AADD(aArray ,{ n2 , lCondicion2 , Color2 } )
AADD(aArray ,{ n3 , lCondicion3 , Color3 } )

Code: Select all

for nitem:= 1 to 3
   if aArray[nItem][2]
     PINTAR DEL COLOR aArray[nItem][3]
  endif
next
Espero te sirva.

Re: ¿Cómo defino esto como bloque?

Posted: Sat Dec 18, 2010 2:10 pm
by Daniel Garcia-Gil
Goosfancito

Esta bien que te genere ese error, un code block es un proceso que se ejecuta en un area de memoria distinta a la funcion actual, donde maneja sus propias variables, a menos que declares nItem como publica no tendras acceso a su valor, realmente nItem no existe dentro de ese proceso (code block)

Cambiando un poco la idea de Julio podria usarse algo asi

Code: Select all

#include "fivewin.ch"

function main()

   local aArray := { { 4, "nItem==1", "#001225" } }

   Bloque( aArray )

return nil

FUNCTION Bloque( aArray )
   local nItem
   local cBloque
   
   FOR nItem:= 1 TO Len( aArray )
      cBloque = "{| nItem | " + aArray[ 1, 2 ] + "}"
      IF Eval( &cBloque, nItem )
         ? "PASO"   
      ENDIF
   next nITem
   
return nil

Re: ¿Cómo defino esto como bloque?

Posted: Sat Dec 18, 2010 3:45 pm
by goosfancito
voy a tener que ver otra forma entonces.
porque nItem lo utilice como ejemplo, pero la realidad es que _ van a ser
o de un RecordSet o de alguna otra variable que podr'ia ser como nItem.

gracias.

Re: ¿Cómo defino esto como bloque?

Posted: Sat Dec 18, 2010 3:49 pm
by Daniel Garcia-Gil
...

Ok pasalo como parametro al codeblock al momento de evaluarlo, mira el ejemplo que te expuse