FiveTech Support Forums

FiveWin / Harbour / xBase community
Board index FiveWin para Harbour/xHarbour 驴C贸mo defino esto como bloque?
Posts: 1956
Joined: Fri Oct 07, 2005 07:08 PM
驴C贸mo defino esto como bloque?
Posted: Fri Dec 17, 2010 01:16 PM
hola.

Tengo una idea dando vueltas, necesito pasar en un array 3 parametros compuesto por:
un numero: 4,
una conficion: if(::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 (fw): Select all Collapse
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/
Posts: 189
Joined: Fri Oct 14, 2005 12:33 AM
Re: 驴C贸mo defino esto como bloque?
Posted: Fri Dec 17, 2010 01: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
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: 驴C贸mo defino esto como bloque?
Posted: Fri Dec 17, 2010 02:06 PM
Si la funcion a donde la pasar es un metodo conocera ::oDato , sino deberas pasar la referencia a la clase

Code (fw): Select all Collapse
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 (fw): Select all Collapse
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
Posts: 1956
Joined: Fri Oct 07, 2005 07:08 PM
Re: 驴C贸mo defino esto como bloque?
Posted: Fri Dec 17, 2010 03: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 (fw): Select all Collapse
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/
Posts: 1516
Joined: Thu May 27, 2010 02:06 PM
Re: 驴C贸mo defino esto como bloque?
Posted: Fri Dec 17, 2010 03:53 PM
pasa el array asi :
Code (fw): Select all Collapse
aArray:= {
{1,  {||saldo=2 }, "#001225"},
{10,{|| cliente=2 }, "#000025"},
}


y luego evalualo:

Code (fw): Select all Collapse
for nitem:= 1 to 5
   if (aArray[1,1] = nItem)
      if eval(aArray[1,2])
        PINTAR DEL COLOR aArray[1,3]
     endif
   endif
Posts: 189
Joined: Fri Oct 14, 2005 12:33 AM
Re: 驴C贸mo defino esto como bloque?
Posted: Fri Dec 17, 2010 04:25 PM
Creo que seria asi:

Code (fw): Select all Collapse
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
Posts: 1956
Joined: Fri Oct 07, 2005 07:08 PM
Re: 驴C贸mo defino esto como bloque?
Posted: Sat Dec 18, 2010 01:44 AM
Entendi lo que me explicas pero en mi codigo no me anda.

Code (fw): Select all Collapse
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/
Posts: 189
Joined: Fri Oct 14, 2005 12:33 AM
Re: 驴C贸mo defino esto como bloque?
Posted: Sat Dec 18, 2010 01: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
Posts: 601
Joined: Wed Jul 04, 2007 03:51 PM
Re: 驴C贸mo defino esto como bloque?
Posted: Sat Dec 18, 2010 01:42 PM
Hola amigo...
Prueba algo as铆:

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

Code (fw): Select all Collapse
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
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: 驴C贸mo defino esto como bloque?
Posted: Sat Dec 18, 2010 02: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 (fw): Select all Collapse
#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
Posts: 1956
Joined: Fri Oct 07, 2005 07:08 PM
Re: 驴C贸mo defino esto como bloque?
Posted: Sat Dec 18, 2010 03: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/
Posts: 2365
Joined: Wed Nov 02, 2005 11:46 PM
Re: 驴C贸mo defino esto como bloque?
Posted: Sat Dec 18, 2010 03:49 PM

...

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

Continue the discussion