Aide - Recherche - Membres - Calendrier
Version complète : dupliquer un élément d'un container (Form) ?
Centre de Formation Flash - Forums Adobe Flash > Rich media et intégration > Flex
programmeur_maniaque
salut smile.gif

savez vous comment faire pour dupliquer un élément ?

voici l'exemple :
CODE
<mx:Form width="100%" height="100%" id="form">

    <mx:FormItem label="" id="foiSource" width="100%" borderStyle="solid">
        <mx:TextInput id="txiSource" maxChars="70"/>
    </mx:FormItem>

    <mx:FormItem width="100%" label="Ajouter un titre" borderStyle="solid">
        <mx:Label text="Titre"/>
        <mx:TextInput/>
        <mx:Label text="Pays"/>
        <mx:TextInput/>
        <mx:Button label="Ajouter titre personnalisé" click="ajoutTitre();"/>
    </mx:FormItem>

</mx:Form>


a chaque clique sur le bouton j'aimerais dupliquer le FormItem qui contient un TextInput et les replacer dans le Form.


j'ai essayé de faire ceci :
CODE
var foi:DisplayObject = form.getChildByName('foiSource');
form.addChildAt(foi, form.getChildIndex(foi));

mais j'ai l'erreur : L'index indiqué sort des limites.


vous avez une idée ?


merci
Fusion
L'index en question c'est ton form.getChildIndex(foi). Fais un petit Alert.show de cet index, il y a toutes les chances qu'il soit négatif ou trop grand.

Rappel : si il y a 3 éléments dans un container , ils sont numérotés de 0 à 2, et donc 3 c'est déjà trop grand.
Et si ton index est égal à -1, ça veut dire que ton "form" considère que ton "foi" n'est pas dans le "form".

Reviens ici si tu veux des précisions. Et en conclusion : regarde ton index !! icon_razz.gif
programmeur_maniaque
pas de probleme a ce niveau ... tu penses bien que j'ai déja vérifier, c'est l'ID 4 alors que le getChildren().length me renvoie 6
et le foi est bien dans le form : regarde le mxml
programmeur_maniaque
ben zut, je peux pas éditer mon message icon_eek.gif

c'etait pour préciser que meme un form.addChild(foi) me provoque la meme erreur : RangeError: Error #2006: L'index indiqué sort des limites.
voici le texte complet :

CODE
[i]RangeError: Error #2006: L'index indiqué sort des limites.
    at flash.display::DisplayObjectContainer/getChildAt()
    at mx.core::Container/getChildAt()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\Container.as:2369]
    at mx.containers::Form/mx.containers::calculateLabelWidth()[C:\dev\flex_201_gmc\sdk\frameworks\mx\containers\Form.as:451]
    at mx.containers::FormItem/mx.containers:FormItem::getLabelWidth()[C:\dev\flex_201_gmc\sdk\frameworks\mx\containers\FormItem.as:900]
    at mx.containers::FormItem/mx.containers:FormItem::measure()[C:\dev\flex_201_gmc\sdk\frameworks\mx\containers\FormItem.as:542]
    at mx.core::UIComponent/mx.core:UIComponent::measureSizes()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\UIComponent.as:5448]
    at mx.core::UIComponent/validateSize()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\UIComponent.as:5394]
    at mx.core::Container/validateSize()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\Container.as:2688]
    at mx.managers::LayoutManager/mx.managers:LayoutManager::validateSize()[C:\dev\flex_201_gmc\sdk\frameworks\mx\managers\LayoutManager.as:557]
    at mx.managers::LayoutManager/mx.managers:LayoutManager::doPhasedInstantiation()[C:\dev\flex_201_gmc\sdk\frameworks\mx\managers\LayoutManager.as:670]
    at Function/http://adobe.com/AS3/2006/builtin::apply()
    at mx.core::UIComponent/mx.core:UIComponent::callLaterDispatcher2()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\UIComponent.as:7909]
    at mx.core::UIComponent/mx.core:UIComponent::callLaterDispatcher()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\UIComponent.as:7852][/i]
programmeur_maniaque
pour etre plus précis, je crois que le gros du probleme vient du fait que je ne fais pas de copie de l'objet :
-je créée juste une référence sur cet objet
-j'essaye de l'insérer la ou il existe déja .. le lecteur ne doit pas apprécier icon_idea.gif

la question est toujours d'actualité : savez vous comment faire pour dupliquer un élément ?
Fusion
En gros, tu prends un autre objet, dans ton cas un FormItem avec un TexInput dedans, et tu copies propriété à propriété. Ca marche bien.

Pour t'y aider, va sur ce lien (je le refile à tout le monde en ce moment dis donc) : http://wiki.mediabox.fr/tutoriaux/flash/parcours
Pour voir comment parcourir les propriétés de ton objet

Je sais qu'il existe une méthode clone() pour les événements Actionscript et Flex, mais s'il existe l'équivalent pour les objets, ce serait le top. Des noms ??
Niko
Une méthode efficace pour cloner un object c'est d'utiliser ByteArray :

CODE
package something
{

public class Example
{
    public function Example ()
    {
    }
}
}


import something.Example;

var foo:Example = new Example();
var ba:ByteArray = new ByteArray();
ba.writeObject(foo);
ba.position = 0;
var clonedFoo:Example = ba.readObject() as Example;
programmeur_maniaque
fusion : creer son propre cloneur pour une classe est un peu chiant a mettre en place icon_confused.gif
je ne pense pas que parcourir les propriétés d'une classe native soit possible en AS3 vu que les propriétés et méthodes ne sont plus énumérables et en plus je devrais modifier la classe FormItem et TextInput pour y integrer la méthode

Niko :
j'ai justement vu cet exemple dans la DOC :
function clone(source:Object):*
{
var myBA:ByteArray = new ByteArray();
myBA.writeObject(source);
myBA.position = 0;
return(myBA.readObject());
}

comme la DOC précisait que c'etait pour cloner un tableau je n'ai pas essayé de tester, mais maintenant je vais essayer d'adapter ton exemple, si ca fonctionne ca peut etre extrement pratique !


merci smile.gif


programmeur_maniaque
nada pour le cloneur de classe icon_confused.gif
a chaque fois j'ai null qui est renvoyé, tanpis, je vais devoir utiliser l'autre soluce
Tonic
Salut,

tu ne peux pas cloner un objet graphique, il te faut mettre en place ta propre fonction de clonage.

Un post parlant de ceci : http://flash.mediabox.fr/index.php?showtopic=63916&hl=
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2008 Invision Power Services, Inc.