begin process at 2012 05 27 16:34:10
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Flash / Flash MX

 > 

Scripts

 > 

ActionScript

 > 

removeChild


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

removeChild

mardi 26 juillet 2011 à 13:15:42 | removeChild

Ariranha

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.

Code ActionScript :
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;
	}
}
mardi 26 juillet 2011 à 14:05:11 | Vider contenu sprite

Ariranha

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 :

Code ActionScript :
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 :

Code ActionScript :
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&#8217;un voit une solution à mon problème ..?
mardi 26 juillet 2011 à 23:36:37 | Re : removeChild

aerolyte

Réponse acceptée !
Bonjour

Code ActionScript :
//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.
<parent>
<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>
</parent>

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<imax; i++){
		var titreText:TextField=new TextField();
		titreText.defaultTextFormat=formatTitre;
		titreText.htmlText=stockXmlMenu.ele[val].menu.submenu[i].titre;
		titreText.name="titre"+i;
		titreText.selectable=false;
		titreText.wordWrap=titreText.embedFonts=true;
		titreText.width=mPosW;
		// inutile regarde la propriété autosize
		//if(titreText.length>=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
mardi 26 juillet 2011 à 23:38:56 | Re : removeChild

aerolyte

Réponse acceptée !
correction

on aura pas la meme chose que si on fait
trace(yMenu[0]):
mercredi 27 juillet 2011 à 11:18:47 | Re : removeChild

Ariranha

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.




mercredi 27 juillet 2011 à 11:27:27 | Re : removeChild

Ariranha

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 :

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

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


Encore merci.


Cette discussion est classée dans : var, array, height, container, soustitretext


Répondre à ce message

Sujets en rapport avec ce message

Chifres aléatoires non répétés [ par n_lefebvre ] Salut,Je débute un peu dans Flash et ActionS. Je dévelope un clip qui doit attribuer 22 chiffres de maniere aléatoire a dans un liste en Array, mais i If "valeur" est dans array() .... [ par mattdelavega ] BonjourJ'ai des tableaux avec tous les départements françaisCeux ci sont répartis en 4 Zones : var Zone_1 = new Array gallerie image [ par moveslang ] Bonjour tout le monde, un petit problème avec un tuto que j'ai choppé je ne sais plus où. il s'agit de réaliser une gallerie photo. j'essaie de modifi Création en manipulation de clip en AS [ par ypauleau ] J'ai cherché sur le net et j'ai toujours pas compris, Voici mon problème : Je cherche à créer des instances d'un clip que j'ai créer dans la bibliothè pb de progressbar [ par lespaulz ] Bonjour,Afin de progresser en AS.Je suis en train d'essayer de mettre en place une galerie photo.Ceci m'a permis de comprendre la manipulation des Mov affiche_photos aléatoirement [ par kartoon ] Bonjour,Voilà j'ai un code qui va chercher des photos dans un fichier nommé "images" dans lequel se trouve 11 photos au format jpg, et qui pioche les array de classes??? [ par Jamesbound ] Bonjour,J'ai créé une classe disons:  PersonneJ'essais maintenant de l'inclure dans une collection de personne (ou autrement dit un Array de Personnes Assigner une image dynamique à un clip [ par Vano05 ] Bonjour à tous ! J'ai un petit probleme tout bete, mais qui me rend fou !Je voudrais adapter le code suivant pour assigner des positions bie Problème de chargement array [ par adramele ] Bonjour à tous !Je suis face à un soucis... je débute. Ce code va chercher une variable faite d'une séquence avec virgule dans un fichier php pour ens array [ par kapac ] bonjour;qui pourrait me renseigner ce qui ne marche pas ds le code suivant:mya = new Array();mya2 = new Array();var st:String;var y:Number=0;for(x=0;x


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,702 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales