In order for this site to work correctly we need to store a small file (called a cookie) on your computer. Most every site in the world does this, however since the 25th of May 2011, by law we have to get your permission first. Please abandon the forum if you disagree.

Para que este foro funcione correctamente es necesario guardar un pequeño fichero (llamado cookie) en su ordenador. La mayoría de los sitios de Internet lo hacen, no obstante desde el 25 de Marzo de 2011 y por ley, necesitamos de su permiso con antelación. Abandone este foro si no está conforme.

Uso de TreeView

Foro público de Xailer en español
Responder
ddupre
Mensajes: 329
Registrado: Lun Nov 12, 2007 3:53 pm

Uso de TreeView

Mensaje 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>
Avatar de Usuario
jfgimenez
Site Admin
Mensajes: 5706
Registrado: Lun Abr 06, 2015 8:48 pm
Contactar:

Uso de TreeView

Mensaje 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
José F. Giménez
[Equipo de Xailer / Xailer team]
http://www.xailer.com
http://www.xailer.info
jlalin
Mensajes: 926
Registrado: Sab Dic 25, 2010 11:10 pm

Uso de TreeView

Mensaje 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
ddupre
Mensajes: 329
Registrado: Lun Nov 12, 2007 3:53 pm

Uso de TreeView

Mensaje 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
>
Responder