Pour un projet, j’ai eu à travailler avec une class de document et des TextField. Je suis tombé sur un étrange problème.
Mise en situation :
- Créer un fichier Flash AS 3 (monFlash.fla), et un fichier AS 3 (MonDocument.as)
- Faite de MonDocument.as la classe de document de monFlash.fla
- Rajouter une image clé à cette animation
- Sur chacune des deux images, placer un TextField dynamique de nom d’occurrence “monText”
- Passons maintenant à MonDocument.as
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package { import flash.display.MovieClip; import flash.text.TextField; public class MonDocument extends MovieClip { public function MonDocument () { stop (); trace (this.numChildren); //affiche: 1 trace (getChildAt (0)); //affiche: [object TextField] nextFrame (); trace (this.numChildren); //affiche: 1 trace (getChildAt (0)); //affiche: null trace (typeof (getChildAt (0))); //affiche: object } } } |
On remarque que sur l’image 1, on a un objet de type TextField, ce qui est parfaitement normal.
Passons à l’image suivante avec nextFrame ().
Nous avons toujours un objet sur scène, mais quand on regarde d’un peu plus près, on s’aperçoit que c’est un objet qui n’a pas été déclaré (trace retourne null…).
En allant plus loin, on veut connaître le type de cet objet, et on voit qu’il s’agit d’un object, et non d’un TextField… Bon certes tout est object, mais quand même, cela est très étrange.
On peut essayer de déclarer nous même notre TextField en décochant l’option “Déclarer automatiquement les occurrences de scène” dans “Fichier -> Paramètre de publication -> onglet Flash -> Paramètre” (ou Maj + shift + F12 ), mais cela ne change rien… C’est exactement le même problème.
Édit : Une explication et une solution au problème a été écrit en commentaire.
Vous avez aimé l'article ? Alors vous aimerez surement :
- AS : Evaluation ET/OU
- Pattern Singleton en Flash
- Simple composants avec Flash CS3 et AS3
- Flash – Restreindre l’instanciation d’une classe par un seul objet
- AS 3 : Modifier l’apparence du composant ComboBox de Flash
Mots-clefs :bug, Flash

avec le code suivant, ça marche; il faut attendre que la scéne ait été mise à jour graphiqueent pour pouvoir accéder à ses éléments graphiques.
package
{
import flash.display.MovieClip;
import flash.text.TextField;
import flash.events.Event;
public class effacer extends MovieClip
{
public function effacer()
{
stop();
trace(this.numChildren);//affiche: 1
trace(getChildAt (0));//affiche: [object TextField]
nextFrame();
stage.invalidate();
addEventListener(Event.RENDER,upToDate);
}
public function upToDate(e)
{
trace(this.numChildren);//affiche: 1
trace(getChildAt (0));//affiche: [object TextField]
trace(typeof (getChildAt (0)));//affiche: object
}
}
}
C’est en effet cela, à l’époque où j’ai écris cet article je n’en avais pas conscience.
Merci à toi Ademus en tout cas.
Armetiz.