Estimados amigos
Treeview en lenguaje coloquial. Mi aporte Más sencillo imposible
Hace literalmente varios años he querido incorporar éste control en mis aplicaciones porque siempre me ha parecido el ideal para mostrar datos de forma jerárquica, y lo he necesitado en muchas oportunidades y no había podido lograrlo.
Hasta que consulté en el foro y me dieron unas ideas. Sin embargo, fue en la web de damtong donde conseguí el ejemplo mas sencillo y como fue con ese que pude entenderlo, lo modifique al lenguaje mas coloquial que pude para publicarlo y asi puedan otros también aprovecharse de ese trabajo. (Adjunto link en el ejemplo). El formulario ejemplo que trae VFP es incluso sencillo de entender, pero una vez conocida la lógica del control, antes me fue imposible. Y los que presentó el maestro Luis María, que hacen de manera genial todo lo que necesito, me resultan en extremo difíciles. Aunque ya los entiendo; pero, no puedo lograr hasta hoy 12 de diciembre del 2016, adaptarlos a mis aplicaciones. Aunque ahí voy. Esa es la meta.
Al principio, cuando comencé a participar en el foro, fue muy curioso para mi saber que otros tenían mis mismas inquietudes, así que pensando en ellos, decidí hacer lo que han hecho muchos genios de éste foro ayudar a otros. Pero traduciendo el lenguaje complejo de esos maestros al lenguaje coloquial, que considero puede llegar mas a los novatos.
Antes de mostrar mi código ejemplo. Quiero explicar con mis palabras lo que logré entender.
El control TreeView es como la gaveta de un archivador, si tengo varias carpetas, que para el ejemplo puse las carpetas de los personajes de “El Chavo del 8”, algo que todo el mundo conoce, y esas carpetas quiero almacenarlas con las instrucciones del control TreeView. Mi lógica es la siguiente.
La primera carpeta tiene que ser necesariamente raíz, no puedo meter la carpeta de “Kiko” que tiene una madre, porque debe estar organizada de forma jerárquica en la carpeta de la madre, Lo mismo con la chilindrina, va en la carpeta de su padre.
Pero si puedo meter al chavo de primero porque no tiene padres ni hijos.
Ahora si meto las carpetas de todos los padres, puedo meter a los hijos, poniendo como referencia sus padre para que las carpetas queden organizadas de forma jerárquica. Porque, si quiero conseguir a Kiko debo buscar a la mamá, Florinda.
Cuando se habla de padres o madres e hijos y también hijas, nuestro cerebro por lógica busca abuelos y nietos y eso no existe en el control. Aunque si existen hermanos, (Y nadie lo menciona) o sea nodos que tienen la misma jerarquía.
Así que mi lógica para agregar nodos es agregar primero los nodos raíces, los que no tienen padres, y pueden tener o no nodos hijos. Quienes van a dependen de un padre. Luego puedo también agregar los nodos hermanos que están al mismo nivel de un nodo en particular, en ese caso (de hermanos) no necesito especificar si es hijo o raíz.
Le doy la referencia primero, lo que se llama padre, (pero que a mi modo de ver es preferible llamarlo referencia, porque no tiene que ser padre ni hijo, para ponerlo como referencia) ese nuevo nodo correspondería al tipo de hermano, entonces coloco el valor numérico del tipo de nodo (segundo parámetro de la función Add) parámetro 0 (cero) si es primero, 1 para último, 2 siguiente y 3 anterior. Cualquiera teniendo en cuenta al nodo de referencia.
Toda ésta teoría en “Lenguaje Coloquial” se entiende mejor con el siguiente código que les recomiendo que copien y ejecuten para que vean lo sencillo que ahora resulta hacer un control TreeView.
Algo que me costó muchísimo entender, es lo de los últimos 2 parámetros. Porque VFP no se maneja así. En el init del TreeView se indica con una súper tonta línea que las imágenes del nodo sin seleccionar las tome de otro control, el número que se coloca primero es un índice. Si coloco 1 toma la primera imagen del otro control, si coloco 2 la segunda imagen contenida en el otro control, que de paso no es tampoco de VFP, por tanto no es muy intuitivo. El sexto parámetro de la función add es similar, la imagen que se coloca en el treeview pero cuando el nodo está seleccionado.
Bueno. Así quedó el PRG, espero les sea útil.
Gracias a todos los maestros que me han ayudado a llegar a éste nivel, no de maestro, pero si de auxiliar docente..jajaja..
Ahora entiendo el placer que se siente al ayudar a otros.
* Aqui comienza el PRG
*------Ejemplo-basico-de-treeview-207/
* http://www.davphantom.net/consulta
* Defino las constantes algo que tiene sus ventajas
* Aunque yo prefiero usar los número en programas como este
* sencillos, No obstante es la forma como se debe hacer
* para reutilizar códigos. etc..
#Define Primero 0
#Define Ultimo 1
#Define Siguiente 2
#Define Anterior 3
#Define Hijo 4
* Así lo presentan los maestros pero para mi resulta
* mas difíil de comprender..
*!* #Define tvwFirst 0
*!* #Define tvwLast 1
*!* #Define tvwNext 2
*!* #Define tvwPrevious 3
*!* #Define tvwChild 4
oForm = Createobject('miForm')
oForm.Caption = "Ejemplo de Treeview"
With oForm
With .Tree
.Left = 10
.Top = 10
.Width = 640
.Height = 650
* Los nodos Raíces no llevan el primer parámetro,
* El segundfo parámetro es un valor numérico
* que indica la ubicación que se le quiere
* dar al nodo. (En este caso es cero)
* El tercer parámetro es el código de Referencia
* Chavo. Este personaje no tiene hijos ni padre
* El cuarto parámetro es el Texto que verá el usuario
* "Chavo del 8"
* El quinto y sexto parámetro son índices que ubican
* en otro control las imagenes que se presentan en el nodo
* cuando está contraído y cuando está expandido o seleccionado
* Pero en éste caso lo he omitido no hay imágenes
*------------------------------------------------------
oForm.Tree.Nodes.Add(,0,"Chavo",' Chavo del 8 Protagonista').bold=.T.
*Observe que luego de mandar con la función los parámetros
* al objeto, le doy al mismo tiempo la propiedad al nodo bold
* o negritas
.Nodes.Add(,Ultimo,"Bruja",'Bruja del 78 doña Clotilde')
* con la instrucción anterior agrego otro personaje
* que tampoco tiene padre ni hijos, la muestro en la Raíz
.Nodes.Add(,Anterior,"Ramon",'Don Ramon Padre de chilindrina')
* Este personaje tiene hija, pero hasta ahora no se ha
* nombrado, solo en el "Archivo" hay 3 "carpetas"
* Es raíz lo escribí después de bruja, pero le estoy diciendo
* que lo coloque de primero relativo, primero entre los
* escritos hasta ahora, no necesariamente queda primero
* le puedo colocar otro nodo de primero y éste ya no lo será
* El hijo lleva como primer parámetro el código del padre
* Aunque prefiero llamarlo referencia en lugar de padre
* El cual hasta ahora no se había guardado
* el segundo parámetro indica tipo de nodo que algunos
* llaman Hijo, prefiero llamarlo clave para entenderlo mejor
* porque si quiero agregarle otro hijo es mas fácil referiem a
* ese nodo como el padre de otro o la referencia con la que
* se va a colocar el siguiente nodo
* para decir que coloque un nodo debajo el doy el valor 4
* (al tercer parámetro)
* tipo de nodo 4 significa que es un hijo. Se debe tener el cuidado
* al decir que es un hijo, se debe indicar quien es el padre
* Luego viene (En lugar de 4 escribí hijo)
*------------------------------------------------------
*Chilindrina es el padre
* Hijo = 4 le dice que el nodo es hijo
.Nodes.Add('Ramon',Hijo,"Chilindrina",'Chilindrina Hija de Don Ramón').Bold=.T.
* así incluimos un nodo que depende de otro
*Agregamos otro padre
.Nodes.Add(,3,"Barriga",'Señor BarrigaPadre del Ñoño')
*Agregamos otro padre o Madre
.Nodes.Add(,3,"Florinda",'Doña Florinda madre de Kiko')
*Agregamos otro Su hijo
.Nodes.Add('Barriga',Hijo,"Nono",'Ñoño Hija del Señor Barriga')
*Agregamos otro Su hijo
.Nodes.Add('Florinda',Hijo,"Kiko",'Kiko es Hijo de Doña Florinda')
* El siguiente nodo sería como un nieto porque tiene como
* padre = Kiko quien es hija de Florinda
* Recuer que Hijo = 4 significa hijo.
* perrito es el valor de la hija de Kiko (hija de Florinda)
* Pero en el control no se define nieto, solo hijo
.Nodes.Add('Kiko',Hijo,"Perro",'Perrito hijo de Kiko')
* Ahora Puedo crear un nodo que se coloca previo a otro nodo
* no importa si es padre o hijo es previo
* Anterior vale 3 o sea el Previo
*-------------------------------------
With .Nodes.Add('Florinda',Anterior,"Jirafales",'Prof Jirafales Anterior a Florinda')
.Bold=.T.
ENDWITH
* Ahora Puedo crear un nodo que se coloca
* después de otro nodo
* no importa si es padre o hijo es siguiente
* Siguiente vale 3 o sea el Previo
*-------------------------------------
With .Nodes.Add('Chavo',Siguiente ,"Pati",'Pati después del Chavo')
.Bold=.T.
.Forecolor = RGB(0,0,255)
ENDWITH
With .Nodes.Add('Kiko',Primero ,"Pedrito",'Pedrito (Hermano nuevo) va primero que Kiko')
.Bold=.T.
.Forecolor = RGB(0,0,255)
ENDWITH
For Each oNode In .Nodes
oNode.Expanded = .T.
Endfor
Endwith
.Show()
Endwith
Read Events
Define Class miForm As Form
Add Object Tree As OleControl With ;
Name = 'Tree',OleClass='MSComCtlLib.TreeCtrl'
WIDTH = 650
HEIGHT = 550
Procedure Init
With This.Tree
.linestyle = 1
.Font.Name = 'Tahoma'
.Font.Size = 14
.indentation = 5
Endwith
Endproc
Procedure QueryUnload
Clear Events
EndProc
Enddefine
Saludos.
Elides Paredes
Barquisimeto Venezuela
Gracias por compartirlo
Saludos
El presente correo y sus anexos son exclusivamente para el uso de los destinatarios indicados en el encabezado del mismo, pueden contener información confidencial y/o privilegiada. Si usted por error ha recibido la presente correspondencia agradezco hacer omisión de esta y hacerme del conocimiento por esta misma vía
Bendito el Hombre que ha sido llamado por Cristo para ser el soldado del ejército en cuya mano empuñe como arma la palabra de Dios
Se certificó que el correo no contiene virus.
Comprobada por AVG - www.avg.com
Versión: 2016.0.7924 / Base de datos de virus: 4728/13580 - Fecha de la versión: 12/12/2016
Gracias Elides por el aporte voy a probarlo..
Bastante didáctico...
Sencillamente explicado..
Saludos y bendiciones..
A simple vista encontré un error
La bruja es del 71 no del 78.. :-)
Que tal Amigo Antonio.
Será que dejaron de pasar El Chavo en tu país? jajaja.
,Text To m.lcSelect Textmerge Noshow Pretext 15
No entiendo dos cosas, Primero, porque habría de molestarme? Al contrario todo lo que sea aprender es mi comida favorita..jajaja..Que tal amigo Integral.?
Elides Paredes
Barquisimeto Venezuela
Debes quitar las lineas intermedias que se generaron con el CORTAR y PEGAR del mensaje original
Luis María Guayán
Tucumán, Argentina
_______________________________
Comunidad Visual FoxPro en Español
http://comunidadvfp.blogspot.com
PROCEDURE ESCENA_DEL_CHAVO Local lcDialogo, lnPos, lcLinExt
lcLinExt = ""
lcDialogo = "y la próxima vez, vaya a depurar lineas de código con su ABUELAAA...!!!" DO HABLAR WITH lcDialogo, "Doña Florinda" lcDialogo = "Señor..?, a su abuelita también le gusta programar???" DO HABLAR WITH lcDialogo, "El Chavo" lcDialogo = "TOMAAAAAAAAAAA......!!!!!!!!!" DO HABLAR WITH lcDialogo, "Don Ramón" lcDialogo = "Pi" For lnPos = 1 To 15 Step 1 lcLinExt = lcLinExt + lcDialogo DO HABLAR WITH lcDialogo, "El Chavo" Next DO HABLAR WITH lcLinExt, "Don Ramón" && Ron Damón tambien remeda al chavo sarcasticamente despues de lloriquear. lcDialogo = "y no te doy otra nomás porque... Mi abuelita creó el sistema de cobros del Mariachi Vargas...!!!" DO HABLAR WITH lcDialogo, "Don Ramón" ENDPROC
Amigo Erwin.
Estimado amigo Integral.
Estimado Erwin
Te muestro lo que hice, guardando en una tabla
La estructura de la tabla es:
Los campos archivo y tipo, son para cuestiones propias de mi programa, puedes obviarlos.
El codigo para grabar los nodos en la tabla es:
loNodes = THISFORM.oleTree.Nodes
FOR i = 1 TO loNodes.Count
IF ISNULL(loNodes.Item(i).Parent)
lcParent = "0_" && Root
ELSE
lcParent = loNodes.Item(i).Parent.Key
ENDIF
SELECT arch_rep
SEEK loNodes.Item(i).Key
IF .not. FOUND() THEN
APPEND BLANK
replace NEXT 1 clave WITH loNodes.Item(i).Key
ENDIF
replace NEXT 1 primaria WITH lcParent, texto WITH loNodes.Item(i).Text, tipo WITH m.tipo
ENDFOR
El código para leer la tabla y aplicarlo al treeview es el siguiente:
o = THISFORM.oleTree.Nodes
o.Clear
SCAN
IF ALLTRIM(primaria) = '0_'
oNode = o.add(,1,ALLTRIM(clave),ALLTRIM(texto),0)
ELSE
oNode = o.add(ALLTRIM(primaria),4,ALLTRIM(clave), ALLTRIM(texto),0)
ENDIF
IF VAL(clave) >= VAL(thisform.cnextkey) THEN
THISFORM.cNextKey = ALLTRIM(STR(VAL(clave) + 1) + "_")
ENDIF
ENDSCAN
USE
Espero te sirva.
Bendiciones.
Carlos Alfaro
Adjunto otro ejemplo mas completo.
Estimados amigos
Treeview en lenguaje coloquial. Mi aporte Más sencillo imposible
Hace literalmente varios años he querido incorporar éste control en mis aplicaciones porque siempre me ha parecido el ideal para mostrar datos de forma jerárquica, y lo he necesitado en muchas oportunidades y no había podido lograrlo.
Deci, ce contează? Nu are nici un sens pentru mine alineatul
Estimado, Amigo Narcizo,
Estimado Amigo. Integral.
SET DEFAULT TO c:\software
this.MaxWidth=this.Width
this.Caption = "lcCaption" && Aqui yo Elides le puse las comillas
*
** this.menu.Width = 200
*
this.cargamenu()
Thisform.Resize
Que tal Amigo ELIDES :Ahora si se pudo ejecutar sin problemas el ejemplo del código mostrado.Solo un comentario sin desmerecer tu trabajo, pero ahora esta pegando un poco el estilo que muestro en la imagen adjuntaHasta la próxima.Saludos,
Hola DIana.
Que tal Amigo ELIDES :Ahora si se pudo ejecutar sin problemas el ejemplo del código mostrado.Solo un comentario sin desmerecer tu trabajo, pero ahora esta pegando un poco el estilo que muestro en la imagen adjuntaHasta la próxima.