constructeur du TextField en AS1

6 views
Skip to first unread message

Ejoe

unread,
May 29, 2006, 12:01:16 PM5/29/06
to FCNG
Salut à tous,

premier post sur ce groupe :-)

Voilà, je travail sur une série de classe en AS1 (pas encore passé
en AS2...la honte sur moi) pour me simplifier la vie.

Je bloque sur un truc:
J'aimerai qu'à la création de chaque TextField, une fonction ou
méthode que j'ai développé (membre de TextField) soit appelé.

J'ai bien essayé les truc du genre:

TextField.prototype.onLoad = function(){

trace("je suis appelé dès qu'un TextFiled est créé");

};

mais çà ne marche pas. J'imagine qu'il y a peut être un truc du
coté de Object.registerClass...mais là aussi , je n'y arrive pas

Quelqu'un aurait il une soluce? Merci d'avance.

Ejoe

ekameleon

unread,
May 29, 2006, 12:36:55 PM5/29/06
to FCNG
Hello :)

Pourquoi la honte ? :) AS1, AS2 même combat hein ;) suffit que le code
soit propre et pas de problème là dessus ;)

Alors pour ton problème :)

1 - faire une classe qui hérite de TextField

2 - Utiliser correctement l'héritage et le __proto__ !

3 - utiliser un petit hack pour créer un textField et lui passer la
classe que tu as créé ...

Exemple :


// ---- Constructor MyField

_global.MyField = function () {
trace( "> " + this + " constructor !!! ") ;
this.textColor = 0xCCCCCC ;
this.text = "Empty Field" ;
// ici lancer ton code ou ta méthode
this.myMethod() ;
}

// ---- Inherit TextField !!

MyField.prototype.__proto__ = TextField.prototype ;

// ---- Public Methods

MyField.prototype.myMethod = function () {
trace( "> " + this + " : myMethod") ;
}

MyField.prototype.toString = function () {
trace("[" + this + "]") ;
}


// ----o Fonction pour transformer une instance visuelle (TextField ou
MovieClip)

function transformVisualInstance (c:Function, oInit) {
this.__proto__ = c.prototype ;
if (oInit) for (var each:String in oInit) this[each] = oInit[each]
;
c.apply(this) ;
return this ;
}

// ----o Décorer les prototypes des fonctions constructeur de
MovieClip et TextField.

MovieClip.prototype.transformVisualInstance = transformVisualInstance ;
TextField.prototype.transformVisualInstance = transformVisualInstance ;

// ----o Exemple d'utilisation

var init:Object = {
selectable : false ,
border : true ,
borderColor : 0xFF00FF
}

// ---- Création d'une instance de la classe TextField
_root.createTextField ("field", 1, 50, 50, 200, 20) ;

// ---- Transformation de l'instance
var field = field.transformVisualInstance( MyField, init) ;


Voilà c'est tout simple, il suffit de bien comprendre le
fonctionnement de l'héritage dans flash et du __proto__ :)

PS : __proto__ est un objet que l'on trouve sur toutes les instances
d'une classe et cet objet est une référence(raccourci) vers le
prototype de la classe de l'instance !
Dans le prototype d'une classe, on retrouve un nouveau objet __proto__
qui cible vers le prototype de la SuperClass de la Class de l'instance
!! Au final tu as une chaine d'héritage entre les __proto__ et tout
cela s'arrête dans le prototype de Object vu que toutes les classes
héritent de Object :)

EKA+ :)

ekameleon

unread,
May 29, 2006, 12:40:34 PM5/29/06
to FCNG
Euh .. j'ai oublié de te dire lol
Quand tu passeras en AS2 (j'espère vite car tu pourrais commencer à
t'habituer à utiliser les structures sous forme de class etc.. c'est
pas mal en attendant l'AS3 qui arrive dans pas longtemps ;)) .. .bref
... j'ai codé des classes dans un framework "VEGAS" qui peuvent te
simplifier la vie dans ce genre de manipulation :

Par exemple

- vegas.util.ConstructorUtil.createVisualInstance :
http://svn1.cvsdude.com/osflash/vegas/AS2/trunk/src/vegas/util/ConstructorUtil.as

- vegas.util.factory.DisplayFactory avec sa méthode createChild !!
http://svn1.cvsdude.com/osflash/vegas/AS2/trunk/src/vegas/util/factory/DisplayFactory.as

+ d'info sur le framework ici : http://live.burrrn.com/wiki/VEGAS et
pour l'installer c'est ici :
http://www.ekameleon.net/blog/index.php?2006/03/05/27--vegas-installation

EKA+ :)

Ejoe

unread,
May 30, 2006, 5:03:18 AM5/30/06
to FCNG
Merci merci ekameleon!

Je suis désolé, ya un léger quiproquo (de ma faute).
En faite, j'essaye de faire appeler une fonction par le constructeur de
la classe TextField qui s'occupe des TextField créé par l'IDE. C'est
pour automatiser des taches sur des fla qui comportent des champs de
texte créé en "dur" avec l'IDE Flash. Crois tu que c'est quand même
possible?

Ta solution est super pratique(et je crois que je vais la réutiliser
souvent...;-)), mais elle ne marche que pour les champs de textes
créé par "createTextField" si je ne me trompe. Or j'ai la vague
impression que le constructeur pour les champs de textes créés "à la
volée" n'est pas le même que pour celui créé avec l'IDE.

J'ai passé un bon moment a chercher sur le web (même sur les
archives de "Flashcoders"), mais j'avoue que je ne trouve pas.

ekameleon

unread,
May 30, 2006, 7:37:07 AM5/30/06
to FCNG
Hello :)

Le constructeur d'un champ de texte c'est quoi qu'il arrive la fonction
TextField ! que cela soit avec un createTextField ou pas :)

Du coup tu peux faire un hack .... sur cette fonction comme ceci :

// je copie la valeur de la fonction TextField dans une variable
var tmp:Function = TextField ;

// j'écrase la fonction _global TextField et je la remplace par une
nouvelle qui
_global.TextField = function () {
tmp.apply(this, arguments) ;
// ici ton code perso
this.initialize() ; // exemple
}

TextField.prototype.initialize = function () {
trace("my initialize in TextField constructor") ;
}

Tu mets ce code sur la première image clé de ton animation et il faut
que ce code soit lancé avant l'apparition de tes champs de textes dans
ton animation...

Mais bon de façon général si tu maitrises pas l'apparition de tes
champs de textes dynamiques avec des createTextField ou autre... c'est
pas top top je trouve :) Le mieux reste dans tous les cas de bien
maitriser l'architecture de l'application en ayant un controle dès le
départ sur son contenu :)

Maintenant tu nous as pas dit exactement le but de ta question ;) Et
sans cela impossible de te dire exactement ce peut aller ou pas ? :)

EKA+ :)

Philippe

unread,
May 30, 2006, 8:41:11 AM5/30/06
to FCNG
Ca alors, j'ai jamais pensé à attaquer le constructeur comme ça.
C'est culoté :D

ekameleon

unread,
May 30, 2006, 8:48:10 AM5/30/06
to FCNG
Ma fois.. c'est cela la force de l'ECMAScript et de l'Actionscript
dynamique ^_^ A force de faire toujour de l'AS2 on oublie que l'on peut
faire ce que l'on veut des objets .. petite manipulation des fonctions,
des scopes, des portées de variables etc.. et le tour et joué.

EKA+ :)

Ejoe

unread,
May 30, 2006, 10:01:39 AM5/30/06
to FCNG
Ben mon cochon...
Bravo, c'est exactement çà!!! Merci beaucoup!

Je suis quand même content de voir que j'étais sur la bonne
voie...j'avais essayé "TextField.prototype.initialize", mais sur la
même frame que mon champs de texte. j'oubliais que le plugin
interprétait d'abord ce qu'il y a sur la scène avant
l'actionscript(d'où la frame de décalage entre la prise en compte
pour la scène de la fonction "initialize" et sa déclaration).
Il me manquait aussi ce satané "_global" auquel je ne pense jamais
assez!

En fait le but de tout ceci, est de travailler avec un graphiste qui ne
code pas du tout du tout. il connait juste la différence entre un
champs de texte simple et dynamique.
Je peut donc ajouter une fonction qui va remplir directement le champs
de texte en fonction de son nom. çà n'a pas l'air très propre, mais
çà me fait gagner un temps fou(j'avoue que j'aurai pu utiliser
JSFL...en fait, je pensais à cette dernière solution, au cas où ce
n'était pas possible).

Par ailleurs, si ma problématique interresse quelqu'un, je peut poster
le résultat de mon travail(pour ceux qui ont la même problematique
avec des graphistes....;-p)

Ejoe

ekameleon

unread,
May 30, 2006, 10:29:44 AM5/30/06
to FCNG
Hello :)

(tiens j'ai eu un problème en envoyant mon message et je sais pas si
il est parti ou pas ?? donc je le recommence en espérant ne pas faire
un double post !)

Cela peut tjs servir à quelqu'un et donc n'hésite pas à mettre des
sources :)

Pour le reste si tu veux éviter la frame du début parasite etc.. tu
peux toujours faire simple avec une fonction qui va te permettre de
parcourir une cible avec un for..in et pour tous les textField qu'il
trouve dans cette cible il va lancer la fonction initialize que tu
auras ajouté au prototype de TextField :)

exemple :

var initializeAllField = function ( mcTarget:MovieClip ) {
for (var each:String in mcTarget) {
var item = mcTarget[each] ;
if (item instanceof TextField) item.initialize() ;
}
}

En fait faut que les champs de textes soient énumérables... en
principe ils le seront.

EKA+ :)

Ejoe

unread,
May 30, 2006, 11:19:23 AM5/30/06
to FCNG
Bien vu, mais j'ai un petit soucis. j'ai l'impression qu'à partir du
moment ou j'ai overridé la class TextField, flash retrouve plus ses
petits :
TextField perd toutes ses propriété et fonctions.

exemple:
trace(typeof(TextField.prototype.getTextFormat)); // retourne Function


var tmp:Function = TextField ;

_global.TextField = function () {
tmp.apply(this, arguments) ;
// ici ton code perso

//this.initialize() ; // exemple


}
TextField.prototype.initialize = function () {
trace("my initialize in TextField constructor") ;
}

trace(typeof(TextField.prototype.getTextFormat)); // retourne undefined


Bizarre !?! Quelqu'un aurait il une idée ?

Ejoe

ekameleon

unread,
May 30, 2006, 12:22:15 PM5/30/06
to FCNG
Oui tiens .. j'avais oublié ce petit problème ;) La classe TextField
à mon avis est la pire que l'on puisse avoir pour modifier son
constructeur aussi "sauvagement" lol

Bon du coup utilise plutôt ma technique du for..in juste au dessus...
avec cette technique tu auras surement moins de problème ;)

J'avais jamais poussé mes tests sur le constructeur de TextField et
c'est vraiment un gros noeud d'embrouille... je regarderai un peu plus
tard si il serait pas possible en utilisant ASSetPropFlags de
reconstituer complètement une copy de la classe ? A voir :)

En attendant je continue à penser que tu devrais créer des outils
pour ton graphiste style un composant TextArea et TextInput pour qu'il
se pose moins de question là dessus ;)

EKA+ :)

zwetan

unread,
May 31, 2006, 8:09:01 AM5/31/06
to FCNG
> J'aimerai qu'à la création de chaque TextField, une fonction ou
> méthode que j'ai développé (membre de TextField) soit appelé.

sinon il y aussi la technique du remplacement de constructor dynamique


AS2
------------------------------------------------
class buRRRn.utils.Visual
{

static function mixin( visual, target, __ARG__ )
{
arguments.shift();
arguments.shift();

visual.__proto__ = target.prototype;
visual.constructor = target;
visual.constructor.apply( visual, arguments );
}

}
------------------------------------------------

AS1
------------------------------------------------
_global.VisualMixin = function( visual, target, __ARG__ )
{
arguments.shift();
arguments.shift();

visual.__proto__ = target.prototype;
visual.constructor = target;
visual.constructor.apply( visual, arguments );
}
------------------------------------------------


tu laisses les graphistes structurer tout avec des objets de base
MovieClip, Button, TextField etc.

et si en frame 5 tu as un textfield avec ce chemin la

mc_toto.txt_hello

tu rajoutes sur la frame 5 ce petit bout de code

VisualMixin( _root.mc_toto.txt_hello, NewTextField )


en faisanttu transforme ton instance de TextField
en instance de NewTextField


il faut bien surdefinir ta class NewTextField
pour que ca marche

class NewTextField extends TextField
{
function NewTextField()
{
super();

//ton code d initialization ici
}


}


zwetan

Ejoe

unread,
May 31, 2006, 11:38:33 AM5/31/06
to FCNG
Merci Zwetan!
C'est un peu ce type de solution que j'ai fini par adopter. Le but
était de ne pas avoir à mettre du code dans chaque MovieClip
contenant du texte (il y en a une trentaine par SWF), c'est pourquoi je
voulais qu 'une fonction soit appelé en même temps que le
constructeur de TextField. Si je dois ajouter du code, çà ne me fait
pas gagner autant de temps, mais c'est déjà pas mal.

Par ailleurs j'ai essayer de dumper le contenu de TextField dans un
objet, puis de réinjecter par la suite. Mais dès que l'on casse le
lien entre le constructeur de TextField et l'objet TextField,
apparemment plus trop possible d'utiliser ce dernier .
exemple:
// Déverouille l'Objet TextField
ASSetPropFlags(TextField.prototype, null, 6, true)
// Crée un champs de texte vide
_root.createTextField("txt_fld", 10000, 10, 10, 50, 50);
// Copie des propriété du champs de texte dans TextField2
_global.TextField2 = txt_fld;
// Hook sur le constructeur Textfield
_global.TextField = function () {
this.initialize();
TextField2.apply(this, arguments) ;
// Dump les props et function de
TextFields2 dans TextField
for (var z1 in TextField2){
trace(z1 + "::" + typeof(z1));
this[z1] = TextField2[z1];
}
trace("fin dump");
trace(typeof(this.getTextFormat)); //
retourne Function
trace(typeof(this.text)); // retourne
String
this.text = "blabla"; //ne marche pas.

}

_global.TextField.prototype.initialize = function(){
trace("appel de la fonction initialize");
}

je vais essayer de poster sur FlashCoders pour voir si quelqu'un
connais une manière de crocheter le constructeur de TextField, sans
pour autant détruire TextField.

Ejoe

m-e-

unread,
May 31, 2006, 1:02:31 PM5/31/06
to FCNG
Ejoe wrote:
> [...]

> TextField perd toutes ses propriété et fonctions.
>
> exemple:
> trace(typeof(TextField.prototype.getTextFormat)); // retourne Function
> var tmp:Function = TextField ;
> _global.TextField = function () {
> [...]
> }
> [...]

> trace(typeof(TextField.prototype.getTextFormat)); // retourne undefined
>
>
> Bizarre !?! Quelqu'un aurait il une idée ?

Pas bizarre : aucun lien entre ta fonction TextField et l'originale qui
permettrait à la première de posséder les mêmes propriétés que la
seconde.

Aurais-tu la même surprise devant ceci ? :

<code>
_global.MonTextField = function() {
}

trace(typeof(MonTextField.prototype.getTextFormat)); // retourne
undefined
</code>

C'est pourtant la même chose.

Ce qui te manque :

<code>

var originalTextField = TextField;
_global.TextField = function() {
}

TextField.prototype = originalTextField.prototype;
// + éventuellement recopie d'autres propriétés de originalTextField
dans TextField

</code>

ekameleon

unread,
May 31, 2006, 5:02:31 PM5/31/06
to FCNG
Oui le prototype est écrasé à la compilation lors de la création de
la nouvelle fonction.

Par contre j'ai fait quelques tests et même en faisant une "deep copy"
du prototype cela ne semble pas fonctionner... il faut aussi copier des
propriétés et méthode qui sont sur la fonction constructeur
directement et il y a un truc qui bloque sur les TextField ? Faudra que
je pousse un peu la recherche car j'ai pas eu le temps de tout tester
hier :)

En attendant la solution que redonne Zwetan au dessus ou faire un
simple for..in c'est tout de même le mieux à mon avis :)

EKA+ :)

m-e-

unread,
Jun 1, 2006, 4:43:00 AM6/1/06
to FCNG

ekameleon wrote:
> Oui le prototype est écrasé à la compilation lors de la création de
> la nouvelle fonction.

Au cas où ce serait utile, je vais être pointilleux : il n'est pas
écrasé, comme on crée une nouvelle fonction, elle a un prototype
vierge.

ekameleon

unread,
Jun 1, 2006, 5:25:30 AM6/1/06
to FCNG
c'est cela que j'appelle écraser ;)
EKA+ :)

Ejoe

unread,
May 31, 2006, 1:42:09 PM5/31/06
to FCNG
Mercie m-e!

Déjà essayé "TextField.prototype = originalTextField.prototype;"

Le problême c'est qu'une fois qu'on a détruit le constructeur de
TextField, rien ne permet de récupérer l'objet TextField en bon
état.
j'aurai beau remettre en place le prototypage de Textfield via
"TextField.prototype = originalTextField.prototype;", je ne pourrait
plus agir avec mes champs de texte.
Par exemple:
<FRAME1>


trace(typeof(TextField.prototype.getTextFormat)); // retourne Function
var tmp:Function = TextField ;
_global.TextField = function () {

tmp.apply(this, arguments) ;
// ici ton code perso
//this.initialize() ; // exemple
}
TextField.prototype.initialize = function () {
trace("my initialize in TextField constructor") ;
}
trace(typeof(TextField.prototype.getTextFormat)); // retourne undefined

TextField.prototype = tmp.prototype;
trace(typeof(TextField.prototype.getTextFormat)); // retourne Function
</FRAME1>
<FRAME2>
monTextField.text = "blabla"; // ne marche plus.
</FRAME2>
-----------------------------------------------------------------------------------

le code suivant ne marche pas plus(en frame 1 le code ci-dessous, en
frame 2 mon champs de texte):

trace(typeof(TextField.prototype.getTextFormat)); // retourne Function
var tmp:Function = TextField ;
_global.TextField = function () {

tmp.apply(this, arguments) ;
// ici ton code perso

this.initialize() ; // exemple
}
TextField.prototype.initialize = function () {
trace("my initialize in TextField constructor");
trace(typeof(TextField.prototype.getTextFormat));// retourne
undefined

TextField.prototype = tmp.prototype;
trace(typeof(TextField.prototype.getTextFormat)); // retourne
Function
this.text = "blabla"; // ne produit aucun effet sur mon champs de
texte

}
trace(typeof(TextField.prototype.getTextFormat)); // retourne undefined


---------------------------------------------------------------------

La fonction initialize est bien appelé et retourne:


my initialize in TextField constructor

undefined
function

Ejoe

Ejoe

unread,
May 31, 2006, 7:02:58 PM5/31/06
to FCNG
bizarre mon précédent post n'est pas passé...enfin, je reprenait le
même argument que ekameleon...avec le bout de code suivant:

ASSetPropFlags(TextField.prototype, null, 6, true)


_root.createTextField("txt_fld", 10000, 10, 10, 50, 50);

_global.TextField2 = txt_fld;
_global.TextField = function () {
TextField2.apply(this, arguments) ;


for (var z1 in TextField2){

this[z1] = TextField2[z1];
}

this.initialize();
}

_global.TextField.prototype.initialize = function(){
trace("appel de la fonction initialize");

_global.TextField.prototype = TextField2.prototype;
trace(typeof(this.text)); //retourne String
trace(typeof(this.prototype.getTextFormat)); //retourne Function

this.text = "blabla"; //marche pas...ni d'ailleurs rien d'autre sur mon
champs de texte
}

Ejoe

Ejoe

unread,
Jun 1, 2006, 5:26:26 AM6/1/06
to FCNG
Bon..troisieme fois que je post mon message, j'éspère qu'il va passer
cette fois....

Je vais pas réécrire le long message que j'ai posté et réécris 2
fois (sans qu'il ne soit pris en compte). Simplement je disait que j'ai
essayer dans tous les sens de réaffecter le prototypage de TextField
apres l'avoir affecté a un objet temporaire "TextField2", mais rien à
faire. Plus possible d'utiliser l'objet TextField comme avant.
Une fois qu'on a "créé" la fonction ou "écrasé" le prototype ;-p
<code>_global.TextField = function()</code>...plus rien ne semble
possible avec les champs de textes.

Ejoe

m-e-

unread,
Jun 1, 2006, 7:21:55 AM6/1/06
to FCNG
Après ça :

> Oui le prototype est écrasé à la compilation lors de la création de
> la nouvelle fonction.

ekameleon a écrit :


> c'est cela que j'appelle écraser ;)
> EKA+ :)

Et tu appelles exécution compilation ?

zwetan

unread,
Jun 1, 2006, 7:49:39 AM6/1/06
to FCNG
desole le group est en mode modere a cause de pleins de spam chinois
et j avais pas vu que je devais valider les nouveaux membres
pour qu il puissent poster sans etre modere

c'est corrigé :)

ekameleon

unread,
Jun 1, 2006, 8:40:15 AM6/1/06
to FCNG
m-e- Et tu appelles exécution compilation ?

héhé .. je vois que tu aimes vraiment chercher la petite bête ...
là dessus c'est une erreur c'est clair ;)

EKA+ :)

Ejoe

unread,
Jun 1, 2006, 2:36:16 PM6/1/06
to FCNG
Désolé pour mes 3 post successifs....:-)

Merci d'avoir réglé mon pb de post Zwetan.

Ejoe

funkC

unread,
Jun 2, 2006, 1:07:26 PM6/2/06
to FCNG
plop

je viens de me pencher sur votre souci qui est en train de devenir le
mien aussi :) :

[AS]
var t:Function = TextField;


_global.TextField = function()
{
trace("textfield construcotr");
}

TextField.prototype.__proto__ = t.prototype;
TextField.prototype.constructor = t;
trace(TextField.prototype.getTextFormat); // output [type Function]
[/AS]

sur la frame d'après je mets un TextField j'ai bien le trace TextField
constructor qui s'affiche et les méthodes du prototype sont bien la.

je pense qu'en mettant cette déclaration entre #initclip on
s'affranchit en outre de la première frame de déclaration.
ça sent bon ça non ?

François

ekameleon

unread,
Jun 2, 2006, 1:15:14 PM6/2/06
to FCNG
Euh .. je sais pas .. je pense qu'il y a toujours un problème :) Tu as
essayé d'utiliser des propriétés et des méthodes sur l'instance
ensuite ?

var t:Function = TextField ;

_global.TextField = function() {

t.apply(this) ;

this.id = setInterval(this, "initialize", 150) ;
trace("textfield constructor");

}

TextField.prototype.initialize = function () {
clearInterval(this.id) ;
this.textColor = 0xFF0000 ;
this.text = "test" ;
this.border = true ;
this.borderColor = 0xFF0000 ;
trace("initialize : " + this) ;
}

TextField.prototype.__proto__ = t.prototype;
TextField.prototype.constructor = t ;

J'ai pas l'impression que cela fonctionne :(

EKA+ :)

funkC

unread,
Jun 2, 2006, 1:29:40 PM6/2/06
to FCNG
bon j'avoue me suis un poil emporté :) (en effet même pas moyen
d'assigner du texte avec ça )

mais je reviens avec une soluce qui marche la :
thx to german_hits :
http://groups.google.fr/group/macromedia.flash.actionscript/browse_frm/thread/20bb160f50404ba0/6650a46c36859236?lnk=st&q=override+TextField+constructor+flash&rnum=1&hl=fr#6650a46c36859236

en gros la différence c'est qu'il assigne le prototype en créant une
instance de TextField


un bout de code à peine modifié pour illustrer le truc :
[AS]

// save old TextField():
_global.OldTextField = _global.TextField;

// set new TextField():
_global.TextField = function() {

super();
this.text = "overrided textfield";

// do your dirty tricks here ;-)
} // end TextField()

// set TextField's prototype member:
_global.TextField.prototype = new _global.OldTextField();

// make TextField.StyleSheet accessible again:
_global.TextField.StyleSheet = function() {
super();
} // end TextField.StyleSheet()

// re-set TextField.StyleSheet prototype
_global.TextField.StyleSheet.prototype = new
_global.OldTextField.StyleSheet();


[/AS]

ekameleon

unread,
Jun 2, 2006, 5:33:52 PM6/2/06
to FCNG
Ok ... donc en gros

1 - il faut copier la valeur du constructeur dans une variable (pas
obligatoire de la stocker en _global... il est même possible de la
supprimer aprés.

2 - il faut écraser sur le _global la fonction TextField en créant
une nouvelle fonction.

3 - il faut utiliser obligatoirement le super() dans la fonction
constructeur pour forcer l'initialisation de la fonction constructeur
du super constructeur.

4 - Il faut rétablir le prototype de la classe en utilisant la
technique d'héritage de Macromedia avec le "new". Il est pas possible
à première vue d'utiliser l'héritage avec le __proto__ sur le
prototype.

Donc pour résumer simplement le code que tu viens de mettre au dessus
:
[code]
var Field = _global.TextField ;

_global.TextField = function() {
super() ;
this.textColor = 0xFFFFFF ;
this.setNewTextFormat(new TextFormat("arial", 12)) ;


this.text = "test" ;
this.border = true ;
this.borderColor = 0xFF0000 ;
}

TextField.prototype = new Field() ;

delete Field ;
[/code]

Bon en tout cas c'est un peu "lourd" comme méthode je trouve mais on
peut dire que cela fonctionne :)

A force de pas vouloir utiliser le new dans mon héritage en AS1... et
bien c'est clair que j'aurai jamais trouvé cette solution !

Merci :)

funkC

unread,
Jun 2, 2006, 10:22:09 PM6/2/06
to FCNG
tant qu'à être dans le lourd jusqu'au bout :D


[AS]
class TextFieldInitializer
{
static var __inst:TextFieldInitializer;

private function TextFieldInitializer()
{
var Field = _global.TextField ;
_global.TextField = _ConstructorHandler;
TextField.prototype = new Field();
TextField.prototype._Init = _Init;
}

static function init():Boolean
{
if( __inst == null )__inst = new TextFieldInitializer();
return __inst != null;
}

/**
* @final do not override this method
*/
private function _ConstructorHandler():Void
{
super() ;
trace("constructor handler");
this._Init();
}

/**
* initialisation method
* @TODO:: implement your initialisation code here
*/
private function _Init():Void
{
with( this )
{
// implement your custom code here
textColor = 0x000000 ;
setNewTextFormat(new TextFormat("arial", 12)) ;
text = "test" ;
border = true ;
borderColor = 0xFF0000 ;
}
}
}
[/AS]

ainsi c'est plus joli à insérer dans une séquence d'initialisation
d'une application genre :

Application.Init {
if ( TextFieldInitializer.init() )
{
...
}
}

ou comment encapsuler le moche pour que ça fasse beau :D

Ejoe

unread,
Jun 3, 2006, 8:00:39 PM6/3/06
to FCNG
Merci du coup de main funkC!
Malheureusement, j'ai déjà essayé cette méthode mais lorsque tu
fais un teste en essayant de changer simplement la prorpiété "text"
de tes champs de texte, la modif n'est pas appliqué dans les champs de
textes.
exemple
<Frame 1>

var t:Function = TextField;
_global.TextField = function()
{
trace("textfield construcotr");
}
TextField.prototype.__proto__ = t.prototype;
TextField.prototype.constructor = t;
trace(TextField.prototype.getTextFormat); // output [type Function]
</Frame 1>
<Frame 2 : sur la scene un champs de texte nommé myTextField>
myTextField.text = "Hello World"; //ne fonctionne pas.
</Frame 2>

Bizarre, impossible de reconstruire correctement le constructeur de
TextField.

Ejoe

Ejoe

unread,
Jun 4, 2006, 9:26:30 AM6/4/06
to FCNG
ne pas faire attention à précédent post qui répondait au premier
post de funkC...désolé...

En tout cas bravo. Je crois qu'on a une solution!!!

Merci à tous.

Ejoe

Reply all
Reply to author
Forward
0 new messages