Comunidad de diseño web y desarrollo en internet online

Más de un tree en un panel

Citar            
MensajeEscrito el 03 Jun 2009 08:07 am
Hasta ahora estoy cargando los datos de un tree en un panel(mediante xml), pero ahora necesito que en vez de cargar un xml en un tree, sean X xml-s en X trees dentro de un panel. Lo he conseguido haciendolo en plan sencillo(o mejor dicho cutre, ya que no será lo más sencillo), pero quisiera poder hacerlo dinamicamente. Cuando sean 2 xml-s que cree dos trees, cuando sean 3 que cree . No se como se podría hacer esto dinamicamente en Flex, ya que soy novatillo.

Alguien em puede ayudar?

Os pongo el código actual que crea un tree por si alguien se anima a editarlo.

Código :

<?xml version="1.0" encoding="utf-8"?>
<mx:Application
 xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init();">

   <mx:Script>
   <![CDATA[
    private function init():void {
     httpTree.send();
    }
    private function treeLoaded():void {
     xmlTree = XML(httpTree.lastResult.node);
     treeTree.dataProvider = xmlTree;
    }
   ]]>
   </mx:Script>

   <mx:XML id="xmlTree"/>
   <mx:HTTPService id="httpTree" url="Arbol.xml" resultFormat="e4x" result="treeLoaded()"/>
   <mx:Panel id="treePanel" title="Carpetas" width="252" height="405" x="26" y="86">
      <mx:Tree id="treeTree" dataProvider="{httpTree}" showRoot="false" labelField="@label" width="100%" height="100%"/>
   </mx:Panel>
</mx:Application>

Por zakabalt

48 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Jun 2009 10:55 am
Para agregar un componente por código simplemente lo instancias y agregas al displayList, por ejemplo

Código ActionScript :

var newTree:Tree = new Tree()
newTree.dataProvider = xxxx
treePanel.addChild(newTree)
... etc


Debes setear todas las propiedades que necesites (incluso antes de hacer el addChild)

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 04 Jun 2009 10:56 am
Más o menos entiendo lo que me has puesto, pero no entiendo como implementar eso en lo que necesito. Entiendo lo que me cuentas, pero nose como meterlo en lo que quiero hacerlo.

Por zakabalt

48 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Jun 2009 11:23 am
En treeLoaded recibes el resultado de tu httpService. Si no tuvieras el tree en escena podrías agregarlo así:

Código ActionScript :

private function treeLoaded():void {
     xmlTree = XML(httpTree.lastResult.node);
     var newTree:Tree = new Tree() 
    newTree.dataProvider = xmlTree;
    treePanel.addChild(newTree) 
 }


Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 04 Jun 2009 03:37 pm
Voy acercandome un poco pero tengo dos problemillas.

1.- Creo un tree con el archivo Arbol.xml que lo consigo mediante el httpService, pero como tendría que hacer para que me creara un tree con el archivo arbol.xml y otro con arbol2.xml?

2.- Hago algo mal en la declaración del Tree, porque si no meto un <mx:tree> en alguna parte de la aplicación me da un error al hacer "var newTree:Tree = new Tree()"

Este es el código actual:

Código :

<mx:Application
 xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" initialize="init();">

   <mx:Script>
   <![CDATA[
    private function init():void {
     httpTree.send();
    }
    
    private function treeLoaded2():void { 
        xmlTree = XML(httpTree.lastResult.node); 
        var newTree:Tree = new Tree()  
          newTree.dataProvider = xmlTree;
          newTree.labelField="@label"; 
          treePanel.addChild(newTree)  
 } 
   ]]>
   </mx:Script>

   <mx:XML id="xmlTree"/>

   <mx:HTTPService id="httpTree" url="xml/Arbol.xml" resultFormat="e4x" result="treeLoaded2()"/>

   <mx:Panel id="treePanel" title="Carpetas" width="252" height="405" x="26" y="86">
   <mx:Tree/><!--no meto para que no de error arriba, no tiene otra función-->
   </mx:Panel>
</Application>


Gracias

Por zakabalt

48 de clabLevel



 

firefox
Citar            
MensajeEscrito el 04 Jun 2009 04:08 pm
Esto es porque tienes que importarlo

Código ActionScript :

<![CDATA[
     import mx.controls.Tree;
     .....


Luego EL HTTPService obtiene una sola respuesta, combina toda la info en un solo archivo o haz una segunda petición para cargar el otro XML ... la segunda opción no es muy reutilizable

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 05 Jun 2009 11:34 am
No consigo cargar más de un tree a la vez. Lo ideal sería hacerlo desde un mismo archvio, pero no se coo hacer para diferenciar un tree del otro en el xml, o mejor dicho como estructurarlo.

Por zakabalt

48 de clabLevel



 

firefox
Citar            
MensajeEscrito el 05 Jun 2009 11:44 am
Usa un nodo distinto para cada tree, dado que un XML es un documento estructurado, puedes hacer un nodo tree que contenga la info de cada uno

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 08 Jun 2009 08:37 am
Para tener dos trees diferentes esta opción sería correcta? Me da el siguiente error. No entiendo mucho de xml pero creo que esta bien estructurado no? O al ser trees tiene que tener otra estructuración?

Código XML :

<?xml version="1.0" encoding="UTF-8"?>
<MyTree>

<Archivo id="archivo" label="archivo">
<node label="INBOX">
   <node label="Nombre">
      <node label="Apellido">
         <node label="Carpeta1">
            <node label="Carpeta11">
            </node>
            <node label="Carpeta12">
            </node>
            <node label="Carpeta13">
               <node label="Carpeta131">
               </node>
            </node>
         </node>
         <node label="Carpeta2">
            <node label="Carpeta21">
            </node>
         </node>
      </node>
   </node>
</node>
</Archivo>

<Archivo2 id="archivo2" label="archivo2">
<node label="INBOX">
   <node label="Nombre2">
      <node label="Apellido2">
         <node label="Carpeta1">
            <node label="Carpeta11">
            </node>
            <node label="Carpeta12">
            </node>
            <node label="Carpeta13">
               <node label="Carpeta131">
               </node>
            </node>
         </node>
         <node label="Carpeta2">
            <node label="Carpeta21">
            </node>
         </node>
      </node>
   </node>
</node>
</Archivo2>

</MyTree>


Me da el siguiente error: El marcado del documento que sigue al elemento raíz debe estar bien formado.

Si se supone que está bien como haría para cargar los dos trees a la vez dinamicamente? Quiero decir que cuando sean 3 carge 3 cuando sean 5 5 y cuando sea 1 pues 1.

Gracias de antemano

Por zakabalt

48 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Jun 2009 08:47 am
Me contesto porque el error no estaba en el xml, lo tenía en el AS pero ya lo he encontrado. Tengo un treeLoaded con este codigo y cargo el tree Archivo o Archivo2 según que le ponga en el lastResult:

Código :

private function treeLoaded():void { 
        xmlTree = XML(httpTree.lastResult.Archivo2.node); 
        var newTree:Tree = new Tree()  
          newTree.dataProvider = xmlTree;
          newTree.labelField = "@label"; 
          newTree.showRoot = false;
          newTree.width = 252;
          newTree.height = 300;
          treePanel.addChild(newTree)  
    }


Cual es la mejor forma o l forma para que me carga los distintos archivos(Archivo1, Archivo2...ArchivoN)? Al no ser muy bien como lee este código, no se donde meterle el punto en el que diga cargame todas las estructuras que veas(Archivo1, Archivo2,..ArchivoN)

Gracias

Por zakabalt

48 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Jun 2009 11:51 am
Nop, dentro del XML el nodo base es myTree y dentro tienes dos nodos Archivo, porque puedes tener nodos del mismo nombre, es lícito. Luego busca la sobre sintaxis Ex4, accede a todo el resultado, luego vas parseando, ej

Código ActionScript :

xmlTree = XML(httpTree.lastResult); 
var lista:XMLList= xmlTree ..item
for(var i:Number=0;i<lista.length; i++){
   var tmpTree:XMLList = xmlTree..item[i].@nombre
    ..... crea arbol, asigna dataProvider, etc
}


Para un panorama de sintaxis EX4 puedes mirar http://www.sephiroth.it/tutorials/flashPHP/E4X/page002.php

Jorge

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 08 Jun 2009 02:33 pm
Ok, no sabía ue los dos podían tener el mismo nombre, eso me sinplifica algunas cosas. Hay algo que no entendí bien o nose pero no me carga nada, sale el panel vacio.

Código :

private function treeLoaded2():void { 
       xmlTree = XML(httpTree.lastResult);  
      var lista:XMLList= xmlTree..item
      for(var i:Number=0;i<lista.length; i++){ 
            var tmpTree:XMLList = xmlTree..item[i].@label;
             var newTree:Tree = new Tree();
              newTree.dataProvider = tmpTree;
             newTree.labelField = "@label"; 
              treePanel.addChild(newTree);
           } 
    }


Diría que lo que tengo mal es la linea de la asignación de 'var tmpTree:XMLList = xmlTree..item[i].@label;'. Todo lo demás creo que lo entiendo, pero esa linea no se si la tengo que poner así, o tengo que poner ..item.Archivo.nodo.. A lo demás le encunetro más lógica(o porlomenos mi lógica con loq ue se actualmente), aunque probablemente este mal.

Por zakabalt

48 de clabLevel



 

firefox
Citar            
MensajeEscrito el 08 Jun 2009 03:11 pm

Por solisarg

BOFH

13669 de clabLevel

4 tutoriales
5 articulos

Genero:Masculino   Bastard Operators From Hell Premio_Secretos

Argentina

firefox
Citar            
MensajeEscrito el 09 Jun 2009 07:04 am
Ya he ido entendiendo el código un poco, el ejemplo e sirvio para algo pero demasiado para las dudas que tenía(que no quiero decir que era un mal ejemplo). Comentarte también que no tenías razón con lo de que el comando 'newTree.labelField = "@label";' no tiene lógica. Yo porlomenos lo utilizo para que mi prite bien lso nombres de cada carpeta, no se si tu eso lo haces de otra forma. Por otra parte el fallo que tenía era el item, que yo creía que era una palabra clave, pero ahí tenía que poner el nombre que le doy yo a la estructura.

Ya he "conseguido" printar los arboles, pero me da un fallo al debuggear.

Código :

var tmpTree:XMLList = xmlTree..Cuenta[i].node;


Error #1010: Un término no está definido y no tiene propiedades.

Aquí te pongo el código completo, a ver si consigo que no me de ese error al debuggear y termino ya el asunto.

Código :

private function treeLoaded():void { 
       
       xmlTree = XML(httpTree.lastResult);  
      var lista:XMLList= xmlTree.Cuenta
      trace(lista.length());
      for(var i:Number=0;i<=lista.length(); i++){ 
            var tmpTree:XMLList = xmlTree..Cuenta[i].node;
          trace(i);
            var newTree:Tree = new Tree();
             newTree.dataProvider = tmpTree;
             newTree.labelField = "@label";
             newTree.width = 252;
              treePanel.addChild(newTree);
       }
    }


Gracias!

Por zakabalt

48 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 Jun 2009 09:47 am
No le hagais caso al anterior mensaje, ya me funciona bien, el error estaba en el for, que lo había probado pero ejecutaba otro programa y no me di cuenta.

Bueno ya consegui hacer lo que quería. Podría hacer lo mismo llamando a una función que me devuelve un String con toda la información del xml, el formato y todo no? La llamada sería diferente, pero la función no cambiaría demasiado, no?

Gracias por la ayuda solisarg!

Por zakabalt

48 de clabLevel



 

firefox

 

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