2009-10-24 3 views
1

Je cherche un moyen d'étendre un champ de texte qui est allready sur la scène dans Flash (AS3) quelque chose comme ceci:Comment étendre un champ Textfield déjà présent sur la scène dans Flash (AS3)?

public class ChildTextField extends TextField 
{ 
    //code for childTextField comes here  
} 

J'ai placé un champ de texte avec le nom de l'instance de « thetextfield » sur la scène . Maintenant, je voudrais dire flash ce champ de texte est de type ChildTextField. Donc, dans ma classe de document Je déclare que textfield comme ChildTextField:

public class DocumentClass extends Sprite() 
{ 
    public var thetextfield : ChildTextField; 
} 

Ce type lance une erreur Coercion échoué. Est-il possible de modifier la classe utilisée pour un champ de texte dans l'EDI Flash comme vous pouvez le faire avec les symboles de bibliothèque?

Répondre

1

Peur pas. Vous devrez utiliser ActionScript si vous souhaitez ajouter votre classe de champs de texte étendue.

EDIT: il existe un moyen de piratage. source: http://board.flashkit.com/board/archive/index.php/t-738887.html

En fait, j'ai rencontré ce problème exact avant. Dans mon cas, j'étais essayant de créer un champ de texte avec des comportements supplémentaires pour d'autres non artistes non-coder à utiliser. Je vais vous dire vous ma solution originale qui est tous as3, mais avait une faille fatale, et ma solution actuelle , qui est une combinaison de as3 et jsfl.

La solution tout as3 est excellente, sauf pour 2 choses: Tout d'abord, il arrive à runtime plutôt que de temps de construction. Ce signifie qu'il y a une petite partie mais réelle du temps où le film n'est pas correctement initialisé. Deuxièmement, il ne fonctionne pas bien s'il y a plusieurs cadres dans le film. L'idée de base est pour détecter les TextFields que vous voulez changer, construire des choses pour les remplacer avec, puis les remplacer sur scène. Vous pouvez le faire avec soit en développant TextField, soit en créant une classe qui contient un TextField et gère l'interface . Disons que vous êtes en train de faire le premier. Ajouter un constructeur à SmartTextField qui copie tous les champs que vous soucier de:

public function SmartTextField(TextField tf) 
{ 
this.text = tf.text; //continue with copy of anything relevant. 
} 

dans votre film principal ont le code qui détecte et remplace les TextFields que vous souhaitez remplacer

var toreplace:Array = findTextFields(); 
var tf:TextField; 
var stf:SmartTextField; 
var where:int; 
for (int i = 0; i < toreplace.length;i++) 
{ tf = TextField(toreplace[i]); 
    stf = new SmartTextField(tf); 
    where = getChildIndex(tf); 
    addChildAt(stf,where); 
    removeChild(tf); 
} 

Cela fonctionne bien, sauf pour le entrées ci-dessus.

La solution JSFL est un peu trop complexe pour aller plus en détail, mais voici les bases . Avoir une classe as3 qui enveloppe un champ de texte avec le nouveau comportement que vous voulez .Écrire un script jsfl qui itère sur les éléments sélectionnés, et s'il s'agit d'un champ de texte, convertit en un symbole avec un baseclass de votre nouvelle classe d'emballage . Cela a les avantages qu'il se passe au moment de l'auteur, et des choses comme la position, instancename et d'autres choses est automatiquement conservé. Il a l'inconvénient que jsfl a beaucoup de petits ennuis à travailler.

modifier: Bien sûr, si cela est seulement pour un seul film , vous pouvez renoncer à le script de conversion JSFL, et juste faire à la main. convertir en symbole -> wrapper baseclass.

+0

Merci pour toutes vos informations utiles Allan, Je pense que pour mon but, la meilleure façon serait de créer une classe d'emballage contenant un champ de texte et d'ajouter la fonctionnalité à la Wrapper au lieu du TextField. Je pense que ce serait une fonctionnalité intéressante de pouvoir changer les classes de base de tous les objets de scène dans une future version Flash. Peut-être dans CS5 .... – Yens

+0

oui c'est une bonne idée :). Espérons que CS5 apporte quelques ajouts et améliorations. – Allan

Questions connexes