RemoveChild

Résolu
Ariranha Messages postés 79 Date d'inscription mercredi 1 août 2007 Statut Membre Dernière intervention 27 juillet 2011 - 26 juil. 2011 à 13:15
Ariranha Messages postés 79 Date d'inscription mercredi 1 août 2007 Statut Membre Dernière intervention 27 juillet 2011 - 27 juil. 2011 à 11:27
Bonjour,

Je suis actuellement en train de travailler sur un site multilingue avec chargement des contenus via xml.

Chaque page contient un mini-menu et comme je ne connais pas les tailles des textes, etc, j'ai 2 fonctions menu();
et sousMenu(); [voir code ci-dessous] dans lesquelles je créé les éléments (TextField, MovieClip, Array) et les
ajoutent à un container.
Quand je change de page je réutilise les fonctions mentionnées ci-dessus pour modifié le contenu sauf que j'ai
l'erreur suivante :

TypeError: Error #2007: Le paramètre text ne doit pas être nul.

Je pensais pouvoir régler cela en faisant tout simplement un removeChild(container);
mais rien n'y fait.

Faut-il faire cette opération pour tous les éléments créés dans "container", à savoir vider les array, et les child
contenus dans "container" ?
Si c'est le cas j'ai certaines variables qui sont créées dans une boucle for donc inaccessibles dans d'autres
fonctions y a-t-il un moyen d'y remédier ?

Merci.

var formatTitre:TextFormat = new TextFormat();
formatTitre.font = myFont.fontName;
formatTitre.color = 0xFFFFFF;
formatTitre.size = 16;
formatTitre.align = TextFormatAlign.CENTER;
formatTitre.kerning = true;

var formatSousTitre:TextFormat = new TextFormat();
formatSousTitre.font = myFont.fontName;
formatSousTitre.color = 0xFFFFFF;
formatSousTitre.size = 12;
formatSousTitre.align = TextFormatAlign.CENTER;
formatSousTitre.kerning = true;

var mPosX:Number = 25;
var mPosY:Number = 80;
var mPosW:Number = 203;
var margeMenu:Number = 20;
var margeSousMenuP:Number = 30;
var margeSousMenuG:Number = 50;
var container:Sprite = new Sprite;
container.alpha = 0;
container.x = 640;
var cMenu:MovieClip = new MovieClip;
var cSousMenu:MovieClip = new MovieClip;
var yMenu:Array = new Array();
var aMenu:Array = new Array();
var hMenu:Array = new Array();
var aSousMenu:Array = new Array();
var ySousMenu:Array = new Array();

var aSeparation:Array = new Array();

var mArray:Array = new Array();

var sArray:Array = new Array();

var stockXmlMenu:XML;
var titreList:XMLList;
var nTitre:Number = 0;

var stockXmlSousMenu:XML;
var sousTitreList:XMLList;
var nSousTitre:Number = 0;

var tailleScroll:Number = 82;
var bounds:Rectangle;
var scrolling:Boolean = false;

var menuEnCours:String = new String();

var menuActif:String = "menus-fermes";

var overWatchTheFilm:OverWatchOrigin = new OverWatchOrigin();
var yOverWatch:Number;

var scrollEnCours:Number;

var tween:Number = 60;

var curseur:Cursor = new Cursor();
curseur.alpha = 0;
addChild(curseur);

function xmlContent ():void
{
var loadXml:URLLoader = new URLLoader;
var lienXml:String = new String();

switch (etatNav)
{
case "the-jewel":
lienXml = "xml/content-the_jewel_cosmetic-en.xml";
break;
case "the-line":
lienXml = "xml/content-the_line-en.xml";
break;
case "the-secret":
lienXml = "xml/content-the_secret-en.xml";
break;
}
var xml:URLRequest = new URLRequest(lienXml);

loadXml.addEventListener (Event.COMPLETE,xmlLoadComplete);
loadXml.load (xml);

addChild(container);
}

function xmlLoadComplete (e:Event):void
{
stockXmlMenu = new XML(e.target.data);
titreList = stockXmlMenu.menu.submenu.titre;
sousTitreList = stockXmlMenu.menu.submenu.contenu;

for each (var titre:XML in titreList)
{
nTitre++;
}

for each (var sousTitre:XML in sousTitreList)
{
nSousTitre++;
}

menu();
}

function menu() {
container.addChild(cMenu);

for(var i=0; i<=(nTitre-1); i++)
{
var titreText:TextField = new TextField();
titreText.defaultTextFormat = formatTitre;

titreText.htmlText = titreList[i];

titreText.name = "titre"+i;
titreText.selectable = false;
titreText.wordWrap = true;
titreText.embedFonts = true;

titreText.width = mPosW;
if (titreText.length >= 22)
{
titreText.height = 42;
}
else
{
titreText.height = 20;
}
titreText.y = mPosY;
mPosY = (titreText.y+titreText.height)+margeMenu;

var separation:Shape = new Shape();
separation.graphics.beginFill(0xFFFFFF);
separation.graphics.drawRect(0, 0, 23, 1);
separation.x = (cMenu.width/2)-22;
separation.y = titreText.y - 9;

aSeparation.push(separation);

aMenu.push(titreText);
yMenu.push(titreText.y);
hMenu.push(titreText.height);

cMenu.addChild(separation);
cMenu.addChild(titreText);
}

aSeparation[0].alpha = 0;

cMenu.x = 160;

cMenu.buttonMode = true;
//cMenu.mouseChildren = false;
cMenu.addEventListener(MouseEvent.CLICK, cMenuClick);
cMenu.addEventListener(MouseEvent.MOUSE_OVER, cMenuOver);
cMenu.addEventListener(MouseEvent.MOUSE_OUT, cMenuOut);
sousMenu();
}

function sousMenu():void
{
container.addChildAt(cSousMenu, 0);

for(var j=0; j<=(nSousTitre-1); j++)
{
var sousTitreText:TextField = new TextField();

sousTitreText.defaultTextFormat = formatSousTitre;

sousTitreText.htmlText = sousTitreList[j];

sousTitreText.name = "sousTitre"+j;
sousTitreText.selectable = false;
sousTitreText.mouseWheelEnabled = false;
sousTitreText.wordWrap = true;
sousTitreText.embedFonts = true;
sousTitreText.width = 283;
sousTitreText.height = 102;

aSousMenu.push(sousTitreText);

if (hMenu[j] == 20)
{
sousTitreText.y = yMenu[j]+margeSousMenuP;
}
else
{
sousTitreText.y = yMenu[j]+margeSousMenuG;
}

ySousMenu.push(sousTitreText.y);

var masque:Masque = new Masque();
masque.name = "masque"+j;
mArray.push(masque);
masque.y = sousTitreText.y;
sousTitreText.x masque.x -13;
sousTitreText.mask = masque;

mPosY += 125;

var scrollBar:Scroll = new Scroll();
scrollBar.y = sousTitreText.y;
scrollBar.x = (sousTitreText.x + sousTitreText.width);
scrollBar.alpha = 0;
sArray.push(scrollBar);
bounds = new Rectangle(scrollBar.scrollBtn.x, scrollBar.scrollBtn.y, 0, tailleScroll);
cSousMenu.addChild(scrollBar);

cSousMenu.x = ((cMenu.width/2)+(cSousMenu.width/2))-130;
cSousMenu.addChild(sousTitreText);
cSousMenu.addChild(masque);
}

switch(etatNav)
{
case "the-jewel":
overWatchTheFilm.alpha = 0;
overWatchTheFilm.x = cSousMenu.x+65;
overWatchTheFilm.gotoAndStop(1);
cSousMenu.addChild(overWatchTheFilm);
container.y = (((contentJewel.height/2)+(container.height/2))+200);
TweenMax.to(container, 2,{alpha:1, y:(((contentJewel.height/2)+(container.height/2))-55)});
break;
case "the-secret":
overWatchTheFilm.alpha = 0;
overWatchTheFilm.x = cSousMenu.x+65;
overWatchTheFilm.gotoAndStop(2);
cSousMenu.addChild(overWatchTheFilm);
container.y = ((contentJewel.height/2)+(container.height/2));
TweenMax.to(container, 2,{alpha:1, y:(((contentJewel.height/2)+(container.height/2))-145)});
break;
case "the-line":
container.y = (((contentJewel.height/2)+(container.height/2))+200);
TweenMax.to(container, 2,{alpha:1, y:(((contentJewel.height/2)+(container.height/2))-65)});
break;
}
}

5 réponses

aerolyte Messages postés 465 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 4 mai 2013 1
26 juil. 2011 à 23:36
Bonjour

//tu peux cumuler les valeurs dans une meme egalité
var formatTitre:TextFormat=new TextFormat();
var formatSousTitre:TextFormat=new TextFormat();
formatTitre.font=formatSousTitre.font=myFont.fontName;
formatTitre.color=formatSousTitre.color=0xFFFFFF;
formatTitre.size=16;
formatSousTitre.size=12;
formatTitre.align=formatSousTitre.font=TextFormatAlign.CENTER;
formatTitre.kerning=formatSousTitre.kerning=true;

/*non utilisé dans le bout de code fourni
var menuEnCours:String=new String();
var menuActif:String="menus-fermes";
var scrolling:Boolean=false;
var mPosX:Number=25;
var yOverWatch:Number;
var scrollEnCours:Number;
var tween:Number=60;


/* inutil voir plus loin
var nTitre:int=0;
var nSousTitre:int=0;
var stockXmlSousMenu:XML;
var titreList:XMLList;
var sousTitreList:XMLList;
var yMenu:Array=new Array();
var hMenu:Array=new Array();
var aMenu:Array=new Array();
var aSeparation:Array=new Array();
*/

var mPosW:Number=203;
var mPosY:Number=80;
//si les valeur suivante ne sont pas amenés a tre modifier il est d'usage d'utiliser des constantes et de les typer int. 
const margeMenu:int=20;
const margeSousMenuP:int=30;
const margeSousMenuG:int=50;
const tailleScroll:int=82;


//vue la quantité de array, je met ma main au feu que tu ne connais pas les possibillités d'un array surtout si tu l'utilise comme un vector
var aSousMenu:Array=new Array();
var ySousMenu:Array=new Array();
var mArray:Array=new Array();
var sArray:Array=new Array();


var stockXmlMenu:XML;

//il ne faut pas oublier les parenthèses();
var curseur:Cursor=new Cursor();
var container:Sprite=new Sprite();
container.alpha=curseur.alpha=0;
container.x=640;
var cMenu:MovieClip=new MovieClip();
cMenu.x=160;
var cSousMenu:MovieClip=new MovieClip();
var bounds:Rectangle;
var overWatchTheFilm:OverWatchOrigin=new OverWatchOrigin();


addChild(curseur);
container.addChild(cMenu);
addChild(container);

/*
je comprends pas pourquoi tout mettre sur un seul xml pose pb.

<ele>le contenu de ton xml the_jewel</ele>
<ele>le contenu de ton xml the_line</ele>
<ele>le contenu de ton xml the_secret</ele>



reste qu'a stocker une variable indiquant quel noeud ele est actuellemeny utilisé
par exemple val:int=1;

avec comme ciblage
stockXmlMenu.ele[val].menu.etc....

*/
var val:int=0;


private function xmlContent():void{
var loadXml:URLLoader=new URLLoader();
var xml:URLRequest=new URLRequest("xml_complet");
loadXml.addEventListener(Event.COMPLETE,xmlLoadComplete);
loadXml.load(xml);
}

function xmlLoadComplete(e:Event):void{
//tu peut suppprimer  l'eventListener vu que tu peut faire sur un seul xml
stockXmlMenu=new XML(e.target.data);

//pas sur que l'utilsation de xmlList se jusitfie
//titreList=stockXmlMenu.menu.submenu.titre;
//sousTitreList=stockXmlMenu.menu.submenu.contenu;

//alors la tu fais des incrémentations complétement inutile
//un xml a des propriété bien utile pour peu qu'il soit bien construit
//par exemple trace(stockXmlMenu.ele[val].menu.length);
//te donneras directement le nombre total de noeuds

//for each (var titre:XML in titreList){nTitre++;}
//for each (var sousTitre:XML in sousTitreList){nSousTitre++;}

menu();
}

function menu(){
//n'ayant pas l'xml de dispo, je me base uniquement sur ce que tu as ecrit, mais c'est clairement faux car cela signifierai que ta balise menu est inutile
var imax:int=stockXmlMenu.ele[val].menu.submenu.length;
for(var i=0; i=22){titreText.height=42;}else{titreText.height=20;}
titreText.autoSize=TextFieldAutoSize.LEFT;

// la gestion des positions en y peut etre faite très différemment, mais bon
titreText.y=mPosY;
mPosY=(titreText.y+titreText.height)+margeMenu;

var separation:Shape=new Shape();
//il est préféranle de nommer les éléments créer dans une boucle
separation.name="sep"+i;
separation.graphics.beginFill(0xFFFFFF);
separation.graphics.drawRect(0,0,23,1);
separation.x=(cMenu.width/2)-22;
separation.y=titreText.y-9;



/*mort de rire, vive les array inutiles
a t'on avis si l'on fait:

var ptitre:Texfield=aMenu[0] as TextField;
trace(pTitre.y);

on aura pas la meme chose que si on fait
trace(aMenu[0]):

ben si? quand tu construit un tableau d'objet, ils garde leur propriétés
*/
//yMenu.push(titreText.y);
//hMenu.push(titreText.height);


//maintenant quel est l'interet de mettre les éléments titretetxt et separateur dans un array?
// ben a rien non?
//aMenu.push(titreText);
//aSeparation.push(separation);


cMenu.addChild(separation);
cMenu.addChild(titreText);
}
// et oui sa marche
var psep:Shape=cMenu.getChildByName("sep0");
psep.alpha=0;

cMenu.buttonMode=true;
cMenu.addEventListener(MouseEvent.CLICK,cMenuClick);
cMenu.addEventListener(MouseEvent.MOUSE_OVER,cMenuOver);
cMenu.addEventListener(MouseEvent.MOUSE_OUT,cMenuOut);

//a partir de la je te laisse faire  mais en gros:
//tu peux gérer tes sousmenu directement dans ta boucle menu au lieu de refaire une fonction
// et tout comme mes correctifs précédent tu peux fiir de faire sauter tout tes arrays et un paquet d'autre chose inutil
sousMenu();
}

function sousMenu():void
{
container.addChildAt(cSousMenu, 0);

for(var j=0; j<=(nSousTitre-1); j++)
{
var sousTitreText:TextField=new TextField();

sousTitreText.defaultTextFormat=formatSousTitre;

sousTitreText.htmlText=sousTitreList[j];

sousTitreText.name="sousTitre"+j;
sousTitreText.selectable=false;
sousTitreText.mouseWheelEnabled=false;
sousTitreText.wordWrap=true;
sousTitreText.embedFonts=true;
sousTitreText.width=283;
sousTitreText.height=102;

aSousMenu.push(sousTitreText);

if (hMenu[j] == 20)
{
sousTitreText.y=yMenu[j]+margeSousMenuP;
}
else
{
sousTitreText.y=yMenu[j]+margeSousMenuG;
}

ySousMenu.push(sousTitreText.y);

var masque:Masque=new Masque();
masque.name="masque"+j;
mArray.push(masque);
masque.y=sousTitreText.y;
sousTitreText.x=masque.x=-13;
sousTitreText.mask=masque;

mPosY += 125;

var scrollBar:Scroll=new Scroll();
scrollBar.y=sousTitreText.y;
scrollBar.x=(sousTitreText.x + sousTitreText.width);
scrollBar.alpha=0;
sArray.push(scrollBar);
bounds=new Rectangle(scrollBar.scrollBtn.x, scrollBar.scrollBtn.y, 0, tailleScroll);
cSousMenu.addChild(scrollBar);

cSousMenu.x=((cMenu.width/2)+(cSousMenu.width/2))-130;
cSousMenu.addChild(sousTitreText);
cSousMenu.addChild(masque);
}

switch(etatNav)
{
case "the-jewel":
overWatchTheFilm.alpha=0;
overWatchTheFilm.x=cSousMenu.x+65;
overWatchTheFilm.gotoAndStop(1);
cSousMenu.addChild(overWatchTheFilm);
container.y=(((contentJewel.height/2)+(container.height/2))+200);
TweenMax.to(container, 2,{alpha:1, y:(((contentJewel.height/2)+(container.height/2))-55)});
break;
case "the-secret":
overWatchTheFilm.alpha=0;
overWatchTheFilm.x=cSousMenu.x+65;
overWatchTheFilm.gotoAndStop(2);
cSousMenu.addChild(overWatchTheFilm);
container.y=((contentJewel.height/2)+(container.height/2));
TweenMax.to(container, 2,{alpha:1, y:(((contentJewel.height/2)+(container.height/2))-145)});
break;
case "the-line":
container.y=(((contentJewel.height/2)+(container.height/2))+200);
TweenMax.to(container, 2,{alpha:1, y:(((contentJewel.height/2)+(container.height/2))-65)});
break;
}
}


Cordialement
3
aerolyte Messages postés 465 Date d'inscription mardi 17 avril 2007 Statut Membre Dernière intervention 4 mai 2013 1
26 juil. 2011 à 23:38
correction

on aura pas la meme chose que si on fait
trace(yMenu[0]):
3
Ariranha Messages postés 79 Date d'inscription mercredi 1 août 2007 Statut Membre Dernière intervention 27 juillet 2011
26 juil. 2011 à 14:05
Je viens de résoudre le problème concernant l'erreur :

TypeError: Error #2007: Le paramètre text ne doit pas être nul.

En effet j'avais oublié de réinitialiser les valeurs à 0 de nTitre et de nSousTitre avant le code suivant :

for each (var titre:XML in titreList)
{
nTitre++;
}

for each (var sousTitre:XML in sousTitreList)
{
nSousTitre++;
}


Ceci dit je me retrouve toujours avec un problème à savoir que "container" ne se vide pas de son contenu et les
différents mini-menus de chaque page se chargent les uns en dessous des autres malgré le fait que je fasse :

yMenu.length = 0;
aMenu.length = 0;
hMenu.length = 0;
aSousMenu.length = 0;
ySousMenu.length = 0;
aSeparation.length = 0;
mArray.length = 0;
sArray.length = 0;
removeChild(container);


Est-ce que quelqu’un voit une solution à mon problème ..?
0
Ariranha Messages postés 79 Date d'inscription mercredi 1 août 2007 Statut Membre Dernière intervention 27 juillet 2011
27 juil. 2011 à 11:18
Bonjour,

Et merci pour les éléments que tu viens de m'apporter.

//si les valeur suivante ne sont pas amenés a tre modifier il est d'usage d'utiliser des constantes et de les typer int.
C'est bon à savoir.

//vue la quantité de array, je met ma main au feu que tu ne connais pas les possibillités d'un array surtout si tu l'utilise comme un vector
Apparement non

//tu peut suppprimer l'eventListener vu que tu peut faire sur un seul xml
Malheureusment non car c'est une demande du client, un fichier xml par page.

Sinon encore un grand merci pour ta réponse.
Je vais tenter d'optimiser le tout avec les éléments que tu m'as donné.

Bonne journée.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Ariranha Messages postés 79 Date d'inscription mercredi 1 août 2007 Statut Membre Dernière intervention 27 juillet 2011
27 juil. 2011 à 11:27
Sinon j'ai résolu mon problème initial. Je pensais qu'en vidant sprite principal à savoir "container" ce serait bon.
Or si je vide aussi le contenu des objet contenu dans container cela marche à savoir :

while(cMenu.numChildren>0)
{
cMenu.removeChildAt(0);
}

while(cSousMenu.numChildren>0)
{
cSousMenu.removeChildAt(0);
}


Encore merci.
0
Rejoignez-nous