Comunidad de diseño web y desarrollo en internet online

[REQ] Buscar informacion en un componente Tree

Citar            
MensajeEscrito el 10 Jun 2006 01:42 am
Hola saludos a todos.

Mi pregunta se refiere a cómo buscar informacion dentro del componente tree. Como se recorre para por ejemplo buscar un texto y cuando coincida con algun nodo en específico mostrar en el componente Tree el nodo respectivo seleccionado.

por ejemplo con la estructura

Código :

<nodo label="carpeta1"  >
  <nodo label="archivo 1.txt" idArchivo="5" />
  <nodo label="archivo 2.txt" idArchivo="6" />  
</nodo>



buscar la IdArchivo = 6 y seleccionar el nodo correspondiente.


Por favor no pido que me hagan el codigo sino que me guien de donde sacar la informacion o si hay métodos listos para los efectos que necesito.

Muchas gracias de antemano por cualquier comentario.

Por colaborame

50 de clabLevel



Genero:Masculino  



Ultima edición por colaborame el 11 Jun 2006 07:32 am, editado 1 vez

firefox
Citar            
MensajeEscrito el 10 Jun 2006 06:42 am
si cada componente usa un dataprovider, es cosa de que iteres en el dataprovider que es un array, y busques la coincidencia

Por lalo_5_2000

11 de clabLevel



 

firefox
Citar            
MensajeEscrito el 10 Jun 2006 06:58 pm
nop como ves ahi esta alimentado con un XML

Por colaborame

50 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 10 Jun 2006 11:30 pm
Para accesar al contenido de cada nodo necesitas internarte en el data provider como dice LALO,estoy de acuerdo contigo de que alimentas el arbol con el XML pero si te fijas bien la instruccion para asignarlo es miArbol.dataProvider = objetoXML;

Utiliza el arbol como si se tratara de un objeto XML para navegar entre las ramas y para obtener la información utiliza las instrucciones especificas del arbol.

Te paso un codigo que hice para cambiar los iconos de cada rama en el arbol, checa como navego entre las ramas y obtengo su valor, el codigo va desde la descarga del XML

Código :

System.useCodepage = true;
var xmlTutorial:XML = new XML();

xmlTutorial.ignoreWhite = true;
xmlTutorial.onLoad = function(exito){
   if(exito){
      // Asignas el objeto XML al proveedor de datos del arbol
      treeTemario.dataProvider = xmlTutorial.firstChild;
      // Abres el nodo primario del arbol
      treeTemario.setIsOpen(treeTemario.getItemAt(0),true,true);
      // Ejecutas la funcion cambiariconos
      CambiarIconos();
   }else{
      trace("No se pudo cargar el documento XML con el tutorial");
   }   
};

function CambiarIconos(){
   // Obtienes todo el nodo principal
   var Temario = treeTemario.getTreeNodeAt(0);
   // cambias el icono
   treeTemario.setIcon(Temario,Temario.attributes.icono);
   // Obtienes cuantos nodos hijos tiene
   var numTemas:Number = Temario.childNodes.length;
   Haces un ciclo para accesar a cada uno de ellos
   for(var i=0;i<numTemas;i++){
      var contenido:Number = Temario.getTreeNodeAt(i).childNodes.length;
      for(var j=0;j<contenido;j++){
         var subNodo = Temario.getTreeNodeAt(i).getTreeNodeAt(j);
         var icono:String = subNodo.attributes.icono;
         treeTemario.setIcon(subNodo,icono);
      }
   }
}

xmlTutorial.load("XML/tutorial.xml");


Espero sea de tu utilidad, saludos

Por heberto

263 de clabLevel

1 tutorial

1 ejemplo

 

Morelia, Michoacán

netscape
Citar            
MensajeEscrito el 10 Jun 2006 11:33 pm
aer... revisaré como lo hiciste y posteo lo que logre, gracias.

Por colaborame

50 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 11 Jun 2006 01:45 am
uf me ha resultado más deifil de lo que pensé jaja ...

Por colaborame

50 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 11 Jun 2006 09:15 am

heberto escribió:

Para accesar al contenido de cada nodo necesitas internarte en el data provider como dice LALO,estoy de acuerdo contigo de que alimentas el arbol con el XML pero si te fijas bien la instruccion para asignarlo es miArbol.dataProvider = objetoXML;

...


Bueno debo agradecerte por que la verdad es que me resulto en base al codigo que me diste y tus indicaciones. La cosa es que primero tenia un código HORRIBLE!!! jaja me dio hasta verguenza despues cuando logré simplificarlo.

Bueno aquí está por si a alguien le sirve después.

Código :


on (load) {
   // Esta es la funcion que es llamada desde un botón 
   // prop : el nombre de la propiedad en que se debe buscar
   // valor : el valor que se está buscando
   this.selectNodeBy = function(prop:String, valor:String) {
      // Se llama a searchNodeBy() con la raiz del arbol para buscar en forma
      // recursiva dentro del contenido. Busca en varios niveles ;) .
      var res:XMLNode = this.searchNodeBy_(prop, valor, this.dataProvider);
      if (!res) {
         trace("No se encontró el elemento");
         // si no se encontro la informacion
         return;
      }   
      //una vez abiertas las ramas por searchNodeBy_() seleccionamos el nodo encontrado
      this.selectedNode = res;
   };
        // Esta funcion busca un nodo desde la raiz un nodo específico.
   this.searchNodeBy_ = function(prop:String, valor:String, nodo:XMLNode):XMLNode  {
      // Obtienes cuantos nodos hijos tiene
      var numElementos:Number = nodo.childNodes.length;
      // Haces un ciclo para accesar a cada uno de ellos
      for (var i = 0; i<numElementos; i++) {
         var tmp:XMLNode = nodo.getTreeNodeAt(i);
         // Preguntamos si es una rama o una hoja
         if (tmp.childNodes.length == 0) {
            //Si es hoja comparamos la propiedad con el valor dado
            if (tmp.attributes[prop] == valor) {
               // Retornamos el nodo si coindice se abre la rama padre
               this.setIsOpen(tmp.parentNode,true)
               // Retornamos el nodo
               return tmp;
            }
            // Si no coincide se siguen revisando los demas nodos
         } else {
            // Si es una rama se pregunta busca dentro de ella, pasando como raiz
            // la misma rama
            var res:XMLNode= this.searchNodeBy_(prop, valor, tmp);
            if (res != undefined) {
               // Abrimos la rama padre de esta búsqueda y retornamos el nodo
               this.setIsOpen(nodo,true);
               return res;
            }
         }
         // Se revisa el siguiente nodo
      }
      // Si llegó hasta aqui es porque no ha encontrado el elemento 
      return undefined;
   };
}




Ahora como verás la funcion esta puesta en un onLoad de un Componente Tree.

Mi duda es. ¿Cómo hago ahora para que todos mis componentes que tengo PUESTOS en la película (no son dinámicos) tengan la misma función?

Con eso creo que sería muy util. Algo asi como un prorotype o algo, pero como los elementos no son dinamicos no funciona para mi.

Muchas gracias a LALO y heberto ;)

Por colaborame

50 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 11 Jun 2006 09:40 am
un update

luego de

Código :

 
this.selectedNode = res;


agregar

Código :

 
      this.selectedNode = res;
      this.firstVisibleNode = res;      


con eso el tree muestra siempre el elemento encontrado cuando el abol es muy grande y no se alcanza a ver completo

Por colaborame

50 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 22 May 2008 08:05 am
hola hber si me podeis ayudar tengo este codigo, pero quiero cambiar los iconos para poner dos tipos pero por mas que pruebo con el ejemplo de aqui no me sale nada. como abria que poner las lineas del .xml para que identifique que icono se pone?

este es el codigo en flash que tengo. exarme una mano porfavor:

Código :

//Cargamos el XML
xmlTree = new XML();
xmlTree.ignoreWhite = true;
xmlTree.onLoad = function(success) {
   if (success) {
      llenarTree();
   } else {
      trace("No se pudo cargar el XML");
   }
};
xmlTree.load("Tree.xml");

function llenarTree() {
   //Atacheamos el componente
   attachMovie("Tree", "miArbol", 1);
   
//--------------------------------
   //Cambiamos los Iconos
   function CambiarIconos(){
   // Obtienes todo el nodo principal
   var Temario = miArbol.getTreeNodeAt(0);
   // cambias el icono
   miArbol.setIcon(Temario,Temario.attributes.icono);
   // Obtienes cuantos nodos hijos tiene
   var numTemas:Number = Temario.childNodes.length;
   //Haces un ciclo para accesar a cada uno de ellos
   for(var i=0;i<numTemas;i++){
      var contenido:Number = Temario.getTreeNodeAt(i).childNodes.length;
      for(var j=0;j<contenido;j++){
         var subNodo = Temario.getTreeNodeAt(i).getTreeNodeAt(j);
         var icono:String = subNodo.attributes.icono;
         miArbol.setIcon(subNodo,icono);
      }
   }
}

//---------------------------------

   //Propiedades
//ACCIONES QUE CREAN LA TRANSPARENCIA DEL ARBOL SIN AFECTAR SUS PROPIEDADES DE SELECCION
   _global.styles.ScrollSelectList.backgroundColor = undefined;
   mx.controls.listclasses.SelectableRow.prototype.drawRowFill = function (miArbol:MovieClip, newClr:Number): Void {
   miArbol.clear();
   if (newClr == undefined)
   miArbol.beginFill(0xABCDEF, 0);
   else
   miArbol.beginFill(newClr);
   
   miArbol.drawRect(1, 0, this.__width, this.__height);
   miArbol.endFill();
   
   miArbol._width = this.__width;
   miArbol._height = this.__height;
   }
//FIN ACCIONES
   miArbol.setSize(700, 300);
   miArbol.setStyle("fontWeight", "bold"); //estilo del texto del árbol
   //_global.style.setStyle("color","0x000000"); //color de texto en reposo
   miArbol.setStyle("openEasing", mx.transitions.easing.Back.easeOut); //efecto de desplazamiento al momento de desplegar una opción del árbol
   //Llenamos el menu
   miArbol.dataProvider = xmlTree;
   //Eventos
   miArbol.addEventListener("change", alSeleccionar);
}

alSeleccionar = new Object();
alSeleccionar.change = function(evento) {
   var seleccion = evento.target.selectedNode;
   //Si es una carpeta...
   if (miArbol.getIsBranch(seleccion)){
      //La cerramos si esta abierta
      if (miArbol.getIsOpen(seleccion)){
         miArbol.setIsOpen(seleccion, false, true);
      }
      //La abrimos si esta cerrada
      else{
         miArbol.setIsOpen(seleccion, true, true);
      }
   }
   //Si es un vínculo...
   else{
      getURL(seleccion.attributes.dirurl, "_blank");
   }
}

Por adar

13 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.