Accueil > Code > C’est moche, le public.

C’est moche, le public.

En AS3, on peut faire un chouette truc tel que décrit dans le billet sur les balises embed, à savoir ceci :

package net.tynambule.exp {
	import flash.display.Sprite;
	[Embed(source="assets/test.swf", symbol="test")]
	public class PrivateEmbed extends Sprite
	{
		public function PrivateEmbed()
		{
		}
	}
}

(Pour les détails, se référer au billet sur la métadonnée embed.)

Maintenant, imaginons que dans notre symbole « test », on aie un TextField qui se nomme « _tfFoo« . Dans notre classe décrivant ce symbole, on en aura certainement besoin. Tout naturellement, je l’aurais ajouté en faisant :

package net.tynambule.exp {
	import flash.display.Sprite;
	import flash.text.TextField;
	[Embed(source="assets/test.swf", symbol="test")]
	public class PrivateEmbed extends Sprite
	{
		internal var _tfFoo : TextField;
		public function PrivateEmbed()
		{
		}
	}
}

Sauf qu’en fait non. Si on fait ça, le compilateur gueule :

 ReferenceError: Error #1056: Impossible de créer la propriété _foo sur net.tynambule.exp.PrivateEmbed. 	at flash.display::Sprite/flash.display:Sprite::constructChildren() 	at flash.display::Sprite$iinit() 	at net.tynambule.exp::PrivateEmbed$iinit()[Y:\Code\Workspace\Exp\src\net\tynambule\exp\PrivateEmbed.as:11] 	at net.tynambule.exp::PrivateEmbedContainer$iinit()[Y:\Code\Workspace\Exp\src\net\tynambule\exp\PrivateEmbedContainer.as:12]

Pourquoi? Parce que les éléments placés sur la scène dans un symbol embed ne sont pas internal (ni private, ni protected), mais… public. Ce qui m’oblige à réécrire :

public var _tfFoo : TextField;

Et là, ça marche. Sauf que moi, j’aurais bien aimé que mon joli TextField ne soit pas accessible depuis n’importe où dans mon code, vu que je préfère quand l’interface est planquée dans son coin et qu’elle n’a rien à voir avec la logique.

Voili voilou, c’est pas très joli et c’est un peu prise de tête de piger pourquoi ça foire. J’me demande pourquoi Adobe a fait ça. Snif. Allez, salut.

Categories: Code Tags: ,
  1. 14/02/2008 à 17:45 | #1

    Salut,
    Merci pour ton post, j’ai bien galerer pour trouver cette solution :p
    Et j’aurai une question face à ca..
    Si tu place ton TextField sur la deuxieme frame de ta scene.. Que tu l’appel "monText".

    Dans ta classe, lorsque tu fera nextFrame () pour passer de l’image une, à la deux.. Pourra tu juste en dessous faire "monText.text = ‘ma chaine’;" ?

    Je suppose aussi que tu as du décocher l’option dans les parametres de publication : "Declarer automatiquement les occurences de scene" ?

    En utilisant la meme methode, lorsque je fais "monText.text = …;" juste apres le nextFrame () rien ne change.. Mon TextField à l’ecran reste vide.. Par contre si je ne change pas de frame et que je refais un "monText.text = …;" un peu plutard en cliquant sur un bouton par exemple (1sec apres.. meme pas), là ca fonctionne…

    Je n’ai aucune explication, et j’avou etre fatiguer de chercher.. Si tu as une solution, ou simplement une explication que je reparte de plus belle, je t’en serai reconnaissant.

    Merci à toi.

  1. Pas encore de trackbacks