¿Cómo defino esto como bloque?

¿Cómo defino esto como bloque?

Postby goosfancito » Fri Dec 17, 2010 1:16 pm

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  Expand view
aArray:= {4, || if(::oDato:fields(2):value==2) ,"#D9DFF0" }


gracias
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
goosfancito
 
Posts: 1954
Joined: Fri Oct 07, 2005 7:08 pm

Re: ¿Cómo defino esto como bloque?

Postby jllinas » Fri Dec 17, 2010 1:47 pm

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),
Julio Llinás
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
User avatar
jllinas
 
Posts: 189
Joined: Fri Oct 14, 2005 12:33 am
Location: Santo Domingo, Dominican Republic

Re: ¿Cómo defino esto como bloque?

Postby mastintin » Fri Dec 17, 2010 2:06 pm

Si la funcion a donde la pasar es un metodo conocera ::oDato , sino deberas pasar la referencia a la clase

Code: Select all  Expand view


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  Expand view


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



 
User avatar
mastintin
 
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

Re: ¿Cómo defino esto como bloque?

Postby goosfancito » Fri Dec 17, 2010 3:34 pm

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  Expand view
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?
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
goosfancito
 
Posts: 1954
Joined: Fri Oct 07, 2005 7:08 pm

Re: ¿Cómo defino esto como bloque?

Postby mastintin » Fri Dec 17, 2010 3:53 pm

pasa el array asi :
Code: Select all  Expand view

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

 


y luego evalualo:

Code: Select all  Expand view

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

 
User avatar
mastintin
 
Posts: 1516
Joined: Thu May 27, 2010 2:06 pm

Re: ¿Cómo defino esto como bloque?

Postby jllinas » Fri Dec 17, 2010 4:25 pm

Creo que seria asi:

Code: Select all  Expand view

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,
Julio Llinás
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
User avatar
jllinas
 
Posts: 189
Joined: Fri Oct 14, 2005 12:33 am
Location: Santo Domingo, Dominican Republic

Re: ¿Cómo defino esto como bloque?

Postby goosfancito » Sat Dec 18, 2010 1:44 am

Entendi lo que me explicas pero en mi codigo no me anda.

Code: Select all  Expand view
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
 
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
goosfancito
 
Posts: 1954
Joined: Fri Oct 07, 2005 7:08 pm

Re: ¿Cómo defino esto como bloque?

Postby jllinas » Sat Dec 18, 2010 1:22 pm

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,
Julio Llinás
Visita mi Blog en http://mangucybernetico.blogspot.com/
xHarbour 1.1.0 + FWH810 + Borland 5.5.1
User avatar
jllinas
 
Posts: 189
Joined: Fri Oct 14, 2005 12:33 am
Location: Santo Domingo, Dominican Republic

Re: ¿Cómo defino esto como bloque?

Postby jrestojeda » Sat Dec 18, 2010 1:42 pm

Hola amigo...
Prueba algo así:

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

Code: Select all  Expand view
for nitem:= 1 to 3
   if aArray[nItem][2]
     PINTAR DEL COLOR aArray[nItem][3]
  endif
next


Espero te sirva.
Ojeda Esteban Eduardo.
Buenos Aires - Argentina.
FWH - PellesC - DBF/CDX - ADS - Gloriosos .Bat - MySql - C# .net - FastReport
Skype: jreduojeda
User avatar
jrestojeda
 
Posts: 583
Joined: Wed Jul 04, 2007 3:51 pm
Location: Buenos Aires - Argentina

Re: ¿Cómo defino esto como bloque?

Postby Daniel Garcia-Gil » Sat Dec 18, 2010 2:10 pm

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  Expand view
#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
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita

Re: ¿Cómo defino esto como bloque?

Postby goosfancito » Sat Dec 18, 2010 3:45 pm

voy a tener que ver otra forma entonces.
porque nItem lo utilice como ejemplo, pero la realidad es que esos campos van a ser
o de un RecordSet o de alguna otra variable que podr'ia ser como nItem.

gracias.
FWH 21.02
Harbour 3.2.0dev (r2104281802)
Copyright (c) 1999-2021, https://harbour.github.io/
User avatar
goosfancito
 
Posts: 1954
Joined: Fri Oct 07, 2005 7:08 pm

Re: ¿Cómo defino esto como bloque?

Postby Daniel Garcia-Gil » Sat Dec 18, 2010 3:49 pm

...

Ok pasalo como parametro al codeblock al momento de evaluarlo, mira el ejemplo que te expuse
User avatar
Daniel Garcia-Gil
 
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 pm
Location: Isla de Margarita


Return to FiveWin para Harbour/xHarbour

Who is online

Users browsing this forum: No registered users and 16 guests