Page 1 of 1

cantidad de items en un TREE

PostPosted: Wed Sep 08, 2021 3:49 pm
by goosfancito
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.

Re: cantidad de items en un TREE

PostPosted: Thu Sep 09, 2021 2:02 pm
by Antonio Linares
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 )

Re: cantidad de items en un TREE

PostPosted: Thu Sep 09, 2021 3:22 pm
by goosfancito
barbaro, necesitaba eso para progresar ocn el CORTAR y PEGAR,
asi lo subo definitivo.

gracias.

Re: cantidad de items en un TREE

PostPosted: Fri Sep 10, 2021 9:16 am
by goosfancito
::oTree es mi arbol
::oItemCortar es la "rama" que quiero cortar, con sus item dentro, que la selecciono cando hago esto:
Code: Select all  Expand view
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 view
 LOCAL oItem:= ::oItemCortar
   local nTotalItems:= 0

   ::oTree:scan( { | oItem | nTotalItems++,.F. } )

    msginfo(nTotalItems)


Que estoy haciendo mal?

Re: cantidad de items en un TREE

PostPosted: Sat Sep 11, 2021 5:12 am
by Antonio Linares
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 )

Re: cantidad de items en un TREE

PostPosted: Sun Sep 12, 2021 12:39 pm
by goosfancito
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.

Re: cantidad de items en un TREE

PostPosted: Mon Sep 13, 2021 1:52 am
by goosfancito
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.

Re: cantidad de items en un TREE

PostPosted: Mon Sep 13, 2021 6:17 am
by Antonio Linares
Gustavo,

Tienes que añadir estos métodos:

Clase TTreeView:

METHOD Len() INLINE Len( ::aItems )

y

Code: Select all  Expand view
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 view
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 :-)

Incluido en el próximo build de FWH

Re: cantidad de items en un TREE

PostPosted: Mon Sep 13, 2021 9:38 am
by goosfancito
bien! ahora si puedo hacer el CORTAR y PEGAR.
hay que agregar los encabezados en cada clase.

Code: Select all  Expand view
method count()...

Re: cantidad de items en un TREE

PostPosted: Mon Sep 13, 2021 10:09 am
by Antonio Linares
> hay que agregar los encabezados en cada clase

a que te refieres ?

Re: cantidad de items en un TREE

PostPosted: Mon Sep 13, 2021 11:38 am
by goosfancito
Code: Select all  Expand view
classs TTVItem
   METHOD Count() CLASS TTVItem

 

Re: cantidad de items en un TREE

PostPosted: Fri Apr 22, 2022 10:57 am
by goosfancito
Antonio,

Code: Select all  Expand view
? 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

Re: cantidad de items en un TREE

PostPosted: Fri Apr 22, 2022 11:34 am
by Antonio Linares
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

Re: cantidad de items en un TREE

PostPosted: Fri Apr 22, 2022 11:45 am
by goosfancito
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.

Re: cantidad de items en un TREE

PostPosted: Fri Apr 22, 2022 12:33 pm
by Antonio Linares
oItem = oTree:Scan( { | oItem | oItem:Cargo == nId } )