cantidad de items en un TREE
- goosfancito
- Posts: 1955
- Joined: Fri Oct 07, 2005 7:08 pm
cantidad de items en un TREE
hola.
en un tree, si hago un len(oItem:aitems) me devulve la cantidad de item de esa rama, pero si existen ramas dentro de ese "oItem" no me las cuenta, debo hacerlo recorrindom la rama misma. Hay algun atributo o DATA que la clase tenga esa cantidad de items?
gracias.
en un tree, si hago un len(oItem:aitems) me devulve la cantidad de item de esa rama, pero si existen ramas dentro de ese "oItem" no me las cuenta, debo hacerlo recorrindom la rama misma. Hay algun atributo o DATA que la clase tenga esa cantidad de items?
gracias.
- Antonio Linares
- Site Admin
- Posts: 42520
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 75 times
- Contact:
Re: cantidad de items en un TREE
Prueba así:
local nItems := 0
oTree:Scan( { || nItems++, .F. } ) // la forma completa sería { | oItem | nItems++, .F. } .F. significa que no ha encontrado lo que busca
MsgInfo( nItems )
local nItems := 0
oTree:Scan( { || nItems++, .F. } ) // la forma completa sería { | oItem | nItems++, .F. } .F. significa que no ha encontrado lo que busca
MsgInfo( nItems )
- goosfancito
- Posts: 1955
- Joined: Fri Oct 07, 2005 7:08 pm
Re: cantidad de items en un TREE
barbaro, necesitaba eso para progresar ocn el CORTAR y PEGAR,
asi lo subo definitivo.
gracias.
asi lo subo definitivo.
gracias.
- goosfancito
- Posts: 1955
- Joined: Fri Oct 07, 2005 7:08 pm
Re: cantidad de items en un TREE
::oTree es mi arbol
::oItemCortar es la "rama" que quiero cortar, con sus item dentro, que la selecciono cando hago esto:
Ahora bien, cuando hago esto siempre me devuelve "el total de los items" del arbol, y pretendo obtener solamente el total de item de "::oItemCortar"
Que estoy haciendo mal?
::oItemCortar es la "rama" que quiero cortar, con sus item dentro, que la selecciono cando hago esto:
Code: Select all | Expand
METHOD MenuPop( nRow, nCol )
LOCAL oMenu
LOCAL oItem := ::oTree:hitTest( nRow, nCol )
IF ( oItem != NIL )
Menu oMenu POPUP
IF ( ::nHitemCortar ) == 0
IF ( oItem:hItem != ::nIdRaiz )
MenuItem "Cortar" ACTION ::accionesArbol( VK_INSERT, oItem )
ENDIF
ELSE
MenuItem "Pegar aquí..." ACTION ::accionesArbol( VK_RETURN, oItem )
ENDIF
EndMenu
ACTIVATE POPUP oMenu At nRow, nCol OF ::oTree
ENDIF
RETURN ( NIL )
//------------------------------------------------------------------------------
METHOD accionesArbol( nOpcion, oItem )
CASE nOpcion == VK_INSERT // cortar
::oItemCortar := oItem
endcase
return (nil)
Ahora bien, cuando hago esto siempre me devuelve "el total de los items" del arbol, y pretendo obtener solamente el total de item de "::oItemCortar"
Code: Select all | Expand
LOCAL oItem:= ::oItemCortar
local nTotalItems:= 0
::oTree:scan( { | oItem | nTotalItems++,.F. } )
msginfo(nTotalItems)
Que estoy haciendo mal?
- Antonio Linares
- Site Admin
- Posts: 42520
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 75 times
- Contact:
Re: cantidad de items en un TREE
Gustavo,
la cantidad de items que contiene un item:
Len( oItem:aItems )
La cantidad de items que contiene el contenedor del item:
Len( oItem:oParent:aItems )
la cantidad de items que contiene un item:
Len( oItem:aItems )
La cantidad de items que contiene el contenedor del item:
Len( oItem:oParent:aItems )
- goosfancito
- Posts: 1955
- Joined: Fri Oct 07, 2005 7:08 pm
Re: cantidad de items en un TREE
bien,
si me permitis voy a colgar aca el metodo que quiero hacer para saber
cuantos item posee el actual nodo, haciendo recursividad me imagino, con esos dos metodos que me pasaste ninguno me dice el total en si, solo los items que posee un nodo, pero si en ese nodo hay un "parent" no lo cuenta... y es lo que necesito para saber cuales son los item que tengo que "mover" a otra rama.
si me permitis voy a colgar aca el metodo que quiero hacer para saber
cuantos item posee el actual nodo, haciendo recursividad me imagino, con esos dos metodos que me pasaste ninguno me dice el total en si, solo los items que posee un nodo, pero si en ese nodo hay un "parent" no lo cuenta... y es lo que necesito para saber cuales son los item que tengo que "mover" a otra rama.
- goosfancito
- Posts: 1955
- Joined: Fri Oct 07, 2005 7:08 pm
Re: cantidad de items en un TREE
necesito por favor que me ayuden con la recursividad porque no se como hacerla.
tengo que recorrer cada oItem que exista en una rama para saber cuantos item tiene.
gracias.
tengo que recorrer cada oItem que exista en una rama para saber cuantos item tiene.
gracias.
- Antonio Linares
- Site Admin
- Posts: 42520
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 75 times
- Contact:
Re: cantidad de items en un TREE
Gustavo,
Tienes que añadir estos métodos:
Clase TTreeView:
METHOD Len() INLINE Len( ::aItems )
y
Ahora en la Clase TTVItem añadimos estos métodos:
METHOD Len() INLINE Len( ::aItems )
y
He modificado el ejemplo FWH\samples\pim.prg para usar estos nuevos métodos y obtener lo que necesitas:
MENUITEM "Tree items" ACTION MsgInfo( oTree:Count() )
MENUITEM "Count items" ACTION If( oTree:GetSelected() != nil, MsgInfo( oTree:GetSelected():Count() ), )
Ahora puedes pulsar el botón derecho en cualquier item y saber cual es su longitud ó cuantos items y subitems tiene en total![Smile :-)](./images/smilies/icon_smile.gif)
Incluido en el próximo build de FWH
Tienes que añadir estos métodos:
Clase TTreeView:
METHOD Len() INLINE Len( ::aItems )
y
Code: Select all | Expand
METHOD Count() CLASS TTreeView
local nItems := 0, bAction := { | oItem | nItems++, .F. }
::Scan( bAction )
return nItems
Ahora en la Clase TTVItem añadimos estos métodos:
METHOD Len() INLINE Len( ::aItems )
y
Code: Select all | Expand
METHOD Count() CLASS TTVItem
local oItem, nItems := 1
for each oItem in ::aItems
nItems += 1 + If( ! Empty( oItem:aItems ), ( oItem:Count() - 1 ), 0 )
next
return nItems
He modificado el ejemplo FWH\samples\pim.prg para usar estos nuevos métodos y obtener lo que necesitas:
MENUITEM "Tree items" ACTION MsgInfo( oTree:Count() )
MENUITEM "Count items" ACTION If( oTree:GetSelected() != nil, MsgInfo( oTree:GetSelected():Count() ), )
Ahora puedes pulsar el botón derecho en cualquier item y saber cual es su longitud ó cuantos items y subitems tiene en total
![Smile :-)](./images/smilies/icon_smile.gif)
Incluido en el próximo build de FWH
- goosfancito
- Posts: 1955
- Joined: Fri Oct 07, 2005 7:08 pm
Re: cantidad de items en un TREE
bien! ahora si puedo hacer el CORTAR y PEGAR.
hay que agregar los encabezados en cada clase.
hay que agregar los encabezados en cada clase.
Code: Select all | Expand
method count()...
- Antonio Linares
- Site Admin
- Posts: 42520
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 75 times
- Contact:
- goosfancito
- Posts: 1955
- Joined: Fri Oct 07, 2005 7:08 pm
Re: cantidad de items en un TREE
Code: Select all | Expand
classs TTVItem
METHOD Count() CLASS TTVItem
- goosfancito
- Posts: 1955
- Joined: Fri Oct 07, 2005 7:08 pm
Re: cantidad de items en un TREE
Antonio,
Por que puede ser que eso me de este error?
tengo esta version:
#define FWVERSION "FWH 21.11"
#define FW_VersionNo 21110
Code: Select all | Expand
? oTree:getselected():count()
Por que puede ser que eso me de este error?
Time from start: 0 hours 0 mins 1 secs
Error occurred at: 04/22/22, 07:55:45
Error description: Error BASE/1004 No exported method: COUNT
Args:
[ 1] = U
tengo esta version:
#define FWVERSION "FWH 21.11"
#define FW_VersionNo 21110
- Antonio Linares
- Site Admin
- Posts: 42520
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 75 times
- Contact:
Re: cantidad de items en un TREE
Ese error te aparece porque no hay ningún item del tree seleccionado, por eso devuelve nil
Hazlo asi:
if oTree:getselected() != nil
? oTree:getselected():count()
endif
Hazlo asi:
if oTree:getselected() != nil
? oTree:getselected():count()
endif
- goosfancito
- Posts: 1955
- Joined: Fri Oct 07, 2005 7:08 pm
Re: cantidad de items en un TREE
Hecho.
a ver si me das una mano con esto:
yo tengo un Tree que tiene ramas y la propiedad cargo me guarda en cada ADD un ID (que lo trae de una DB sino usaria el hitem)
cuando quiero agregar un item nuevo que esta identificado por un "id" (sacado de la dB) "necesito" recorrerme TODO el arbol
y donde el "id" de la rama nueva coincida con cargo["id"] de alguna de las ramas que ya contiene el arbol AHI agregarla.
Estoy dando vueltas pero no logro conseguir lo que quiero.
a ver si me das una mano con esto:
yo tengo un Tree que tiene ramas y la propiedad cargo me guarda en cada ADD un ID (que lo trae de una DB sino usaria el hitem)
cuando quiero agregar un item nuevo que esta identificado por un "id" (sacado de la dB) "necesito" recorrerme TODO el arbol
y donde el "id" de la rama nueva coincida con cargo["id"] de alguna de las ramas que ya contiene el arbol AHI agregarla.
Estoy dando vueltas pero no logro conseguir lo que quiero.
- Antonio Linares
- Site Admin
- Posts: 42520
- Joined: Thu Oct 06, 2005 5:47 pm
- Location: Spain
- Has thanked: 31 times
- Been thanked: 75 times
- Contact: