Página 1 de 1

Uso de TreeView

Publicado: Mié Ene 09, 2013 10:27 pm
por ddupre
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1">
</head>
<body text="#000000" bgcolor="#FFFFFF">
Estimados,<br>
Viendo el ejemplo de Xailer sobre uso de TreeView y buscando
informaciÃn en el foro lleguà a un ejemplo de donde se utiliza un
botÃn para dar el valor predeterminado a cada item. En el evento
OnClick de dicho botÃn està esto:<br>
<br>
<small>METHOD Button3Click( oSender ) CLASS FrmUsua<br>
ÂÂ aeval( ::oTV:GetAllItems(),{|v,a|v:lChecked :=
(substr("11111011100000000000",a,1) == "1")})<br>
ÂÂ aeval( ::oTV:GetAllItems(),{|v,a|v:nImage :=
iif(v:lChecked,1,2)})<br>
RETURN Nil<br>
</small><br>
Si bien puedo ver el efecto que tiene el primer "aeval" (dado que
descarguÃÂ y compile el proyecto), no logro entender como lo hace. <br>
<br>
Toda la vida me costà entender como funciona un CodeBlock y las
pocas veces que los use fue por copiar de algÃn ejemplo, pero aquÃ
veo que se usan mucho.<br>
<br>
Les agradezco si alguien me pude dar una mano y me explica como
funciona el primer aeval.<br>
<br>
Por ejemplo, no entiendo por quà si el treeview tiene 10 items, la
cadena de unos y ceros tiene 20 caracteres y tampoco entiendo por
quà el resultado es que aparecen checked los items que corresponden
a los nros. uno y unchecked los que corresponden a los nros. 0, si
lChecked es lÃgico<br>
<br>
<br>
Un saludo<br>
Daniel<br>
<br>
</body>
</html>

Uso de TreeView

Publicado: Jue Ene 10, 2013 11:00 am
por jfgimenez
Daniel,
> Estimados,
> Viendo el ejemplo de Xailer sobre uso de TreeView y buscando
> información en el foro llegué a un ejemplo de donde se utiliza un
> botón para dar el valor predeterminado a cada item. En el evento
> OnClick de dicho botón está esto:
>
> METHOD Button3Click( oSender ) CLASS FrmUsua
> aeval( ::oTV:GetAllItems(),{|v,a|v:lChecked :=
> (substr("11111011100000000000",a,1) == "1")})
> aeval( ::oTV:GetAllItems(),{|v,a|v:nImage := iif(v:lChecked,1,2)})
> RETURN Nil
>
> Si bien puedo ver el efecto que tiene el primer "aeval" (dado que
> descargué y compile el proyecto), no logro entender como lo hace.
>
> Toda la vida me costó entender como funciona un CodeBlock y las pocas
> veces que los use fue por copiar de algún ejemplo, pero aquí­ veo que
> se usan mucho.
>
> Les agradezco si alguien me pude dar una mano y me explica como
> funciona el primer aeval.
La función AEval() actúa de forma similar a un bucle FOR-NEXT o FOR-EACH
sobre un array. Lo que hay dentro del codeblock es lo que se va a
ejecutar. Lo más destacado es que el codeblock recibe dos parámetros: el
primero es una variable con el valor del elemento de cada iteración,
exactamente igual que la variable que se indica en los bucles FOR-EACH.
Y el segundo parámetro es el í­ndice del bucle, o número de iteración,
comenzando por 1. Así­, el primer AEval que has puesto se "traducirí­a" así­:
FOR a := 1 TO Len( ::oTV:GetAllItems() )
v := ::oTV:GetAllItems()[ a ]
v:lChecked :=(substr("11111011100000000000",a,1) == "1")
NEXT
y el segundo serí­a así­:
FOR a := 1 TO Len( ::oTV:GetAllItems() )
v := ::oTV:GetAllItems()[ a ]
v:nImage := iif(v:lChecked,1,2)
NEXT
> Por ejemplo, no entiendo por qué si el treeview tiene 10 items, la
> cadena de unos y ceros tiene 20 caracteres
Respecto al número de elementos, pues efectí­vamente, en el ejemplo puede
que no coincidan, pero como ejemplo sirve.
> y tampoco entiendo por qué el resultado es que aparecen checked los
> items que corresponden a los nros. uno y unchecked los que
> corresponden a los nros. 0, si lChecked es lógico
El "truco" está en que al comparar el resultado de substr() con "1", esa
comparación devuelve .T. o .F., y es éste valor el que se está asignando
a lChecked. De ahí­ el uso de los paréntesis (aunque realmente aquí­ no
habrí­a hecho falta), para dejar claro que primero se hace la comparación
y después, el resultado de esta comparación es lo que se asigna a lChecked.
Un saludo,
José F. Giménez
http://www.xailer.com
http://www.xailer.info

Uso de TreeView

Publicado: Jue Ene 10, 2013 11:20 am
por jlalin
Daniel,
los codeblocks son fáciles de usar y muy potentes.
> aeval( ::oTV:GetAllItems(),{|v,a|v:lChecked :=
> (substr("11111011100000000000",a,1) == "1")})
Para que entiendas cómo funcionan lo primero que tienes que tener claro son
los parámetros que recibe:
{|v,a|
El primero "v" es el elemento del array y el segundo "a" su í­ndice y ambos
los "enví­a" el motor de Harbour/Clipper y puedes llamarlos como quieras,
son variables "locales" dentro del codeblock.
Puedes probarlo con código "normal" y verás que son equivalentes:
LOCAL aItems := ::oTV:GetAllItems()
FOR a := 1 TO Len( aItems )
v := aItems[ a ]
v:lChecked := ( SubStr( "11111011100000000000", a, 1 ) == "1" )
NEXT
> aeval( ::oTV:GetAllItems(),{|v,a|v:nImage := iif(v:lChecked,1,2)})
> RETURN Nil
Este te lo dejo como ejercicio para que lo pases a un bloque FOR..NEXT como
el ejemplo de arriba.
> Les agradezco si alguien me pude dar una mano y me explica como funciona el
> primer aeval.
> Por ejemplo, no entiendo por qué si el treeview tiene 10 items, la cadena de
> unos y ceros tiene 20 caracteres y tampoco entiendo por qué el resultado es que
> aparecen checked los items que corresponden a los nros. uno y uncheckedlos que
> corresponden a los nros. 0, si lChecked es lógico
La clave es esto: v:lChecked := ( SubStr( "11111011100000000000", a, 1 ) ==
"1" )
Lo que hace es comprobar si la posición es un "1" o un "0" y compararlo con
"1" ( el == "1" ), y si es cierto se activa lChecked parar el item.
Creo que lo mejor que puedes hacer es empezar con ejemplos pequeños que se
te ocurran y te aseguro que en un rato manejas los codeblocks sin problemas.
LOCAL aNames := { "Daniel", "Du Pre", "codeblocks" }
AEval( aNames, {|x| MsgInfo( x ) } )
AEval( aNames, {|x,i| x := IIF( i == 2, "Hola", x ) )
AEval( aNames, {|x| MsgInfo( x ) } )
Sin compilar el código, intenta ver lo que hace sobre un papel y luego
pruébalo.
Saludos,
José Lalí­n

Uso de TreeView

Publicado: Vie Ene 11, 2013 2:00 am
por ddupre
José y José,
Mil gracias por las explicaciones, mientras las leí­a me sentí­ como un
alumno frente a sus profesores.
Realmente muy claro. Me han resuelto un problema que llevaba años sin
entender y mucho menos, sin resolver.
Nuevamente Gracias.
Un Saludo
Daniel
El 10/01/2013 8:22, José Lalí­n escribió:
> Daniel,
>
> los codeblocks son fáciles de usar y muy potentes.
>
>> aeval( ::oTV:GetAllItems(),{|v,a|v:lChecked :=
>> (substr("11111011100000000000",a,1) == "1")})
>
> Para que entiendas cómo funcionan lo primero que tienes que tener
> claro son los parámetros que recibe:
>
> {|v,a|
>
> El primero "v" es el elemento del array y el segundo "a" su í­ndice y
> ambos los "enví­a" el motor de Harbour/Clipper y puedes llamarlos como
> quieras, son variables "locales" dentro del codeblock.
>
> Puedes probarlo con código "normal" y verás que son equivalentes:
>
> LOCAL aItems := ::oTV:GetAllItems()
>
> FOR a := 1 TO Len( aItems )
> v := aItems[ a ]
> v:lChecked := ( SubStr( "11111011100000000000", a, 1 ) == "1" )
> NEXT
>
>> aeval( ::oTV:GetAllItems(),{|v,a|v:nImage := iif(v:lChecked,1,2)})
>> RETURN Nil
>
> Este te lo dejo como ejercicio para que lo pases a un bloque FOR..NEXT
> como el ejemplo de arriba.
>
>> Les agradezco si alguien me pude dar una mano y me explica como
>> funciona el
>> primer aeval.
>
>> Por ejemplo, no entiendo por qué si el treeview tiene 10 items, la
>> cadena de
>> unos y ceros tiene 20 caracteres y tampoco entiendo por qué el
>> resultado es que
>> aparecen checked los items que corresponden a los nros. uno y
>> uncheckedlos que
>> corresponden a los nros. 0, si lChecked es lógico
>
> La clave es esto: v:lChecked := ( SubStr( "11111011100000000000", a, 1
> ) == "1" )
>
> Lo que hace es comprobar si la posición es un "1" o un "0" y
> compararlo con "1" ( el == "1" ), y si es cierto se activa lChecked
> parar el item.
>
> Creo que lo mejor que puedes hacer es empezar con ejemplos pequeños
> que se te ocurran y te aseguro que en un rato manejas los codeblocks
> sin problemas.
>
> LOCAL aNames := { "Daniel", "Du Pre", "codeblocks" }
>
> AEval( aNames, {|x| MsgInfo( x ) } )
>
> AEval( aNames, {|x,i| x := IIF( i == 2, "Hola", x ) )
> AEval( aNames, {|x| MsgInfo( x ) } )
>
> Sin compilar el código, intenta ver lo que hace sobre un papel y luego
> pruébalo.
>
> Saludos,
> José Lalí­n
>