Logo

¡Bienvenido a Stratos!

Acceder

Foros





Funcion recursiva para recorrer un treeviev

Iniciado por ethernet, 03 de Noviembre de 2002, 07:37:53 PM

« anterior - próximo »

ethernet



    Al control treeview a mi juicio le faltan algunas funciones como CheckAll o FindItem. Para esto escribi estas funciones. Lo que hacen es simplemente ir recorriendo el control, si tienen hijos no es archivo y por lo tanto entra y busca hermanos si son carpetas(tienen hijos) se vuelve a llamar a si misma hasta que no tiene mas hijos y entonces lo chekea y se ajustan los contadores. Siempre hay que conservar el valor anterior del HTREEITEM "hElementoMem" para volver a las precesivas carpetas cuando termina la llamada a la funcion recursiva y vuelve para terminar la funcion. Observar que se declara la variable hElementoMem dentro del bucle y que cada vez que se vuelve a llamar a la funcion recursiva se crea otra nueva variable y asi indefinidamente.
    Con este sistema tambien se podrian buscar cadenas de texto en los items para que por ejemplo al pulsar sobre ellos se cargue el archivo y tambien lo he usado para montar la ruta completa del mismo y asi no tener que guardar un array con las rutas completas.

    PD: Supongo que vosotros esto lo tendreis mas que visto, pero si no es asi o creeis que es de interes, gustoso os mandare los otros ejemplos citados en la descripcion.






void CReempView::SelTodoLista()//Al cargar una lista de archivos en un treeview con checks ejecutamos esta funcion

{

 nArchTotal=0;

nArchCheq=0;

 

hElemento=m_CtrlLista.GetRootItem();

m_CtrlLista.SetCheck(hElemento);

m_CtrlLista.GetChildItem(hElemento);



RecurSelTodoLista();

}



void CReempView::RecurSelTodoLista()//Funcion recursiva

{



do{

 if(!m_CtrlLista.ItemHasChildren(hElemento))//Si no tiene hijos

 {

  m_CtrlLista.SetCheck(hElemento,bSelTodo);

  hElemento=m_CtrlLista.GetNextSiblingItem(hElemento);

  nArchTotal++;

  nArchCheq++;  

 }

 else if(m_CtrlLista.ItemHasChildren(hElemento))//Si Tiene Hijos

 {

  HTREEITEM hElementoMem;

 

  hElementoMem=hElemento;

  m_CtrlLista.SetCheck(hElemento,bSelTodo);

  hElemento=m_CtrlLista.GetChildItem(hElemento);

  RecurSelTodoLista();

  hElemento=hElementoMem;

  hElemento=m_CtrlLista.GetNextSiblingItem(hElemento);

 }

}while(hElemento!=NULL);

}








    Éste código fue enviado por Antares el 28 de octubre del 2002
orionmaps@tiscali.es

Si quieres enviar tu propio código hazlo a  eth_cotd@lycos.es

    fiero

                                    Sin duda, una forma peculiar de función recursiva  :) ...

    Por optimizar un poquillo, yo diria que sobra código en la siguiente línea:


    else if(m_CtrlLista.ItemHasChildren(hElemento))


    ya que es la misma comparación pero a la inversa yo pondría solo esto  :ojo: :


    else



    un saludo                                
    www.videopanoramas.com Videopanoramas 3D player