Articles avec le tag '_parent "

ActionScript: _parent et le contrôle des contextes

Lorsque "clics" un événement d'un objet dans le contexte, à savoir l'objet de la mère qui représente la zone de validité de toutes les variables, il devient l'objet lui-même. Cette fonctionnalité, caractéristique de la programmation orientée objet, peut être source de confusion provoquant des erreurs et bugs dans le code. En outre, dans certaines situations, il peut empêcher l'accès à certaines variables «avant» disponible.

Tout d'abord nous voyons une fonction d'ActionScript liées à la gestion de contexte qui, si inclus, va nous sauver quelques heures de tests inutiles premier. Lorsque nous avons affaire à des objets graphiques ou tout simplement MovieClip imbriqués l'un dans l'autre, la propriété _parent résoudre tous les problèmes dans leur contexte. Par exemple, si le MovieClip padre_mc contiente autre MovieClip figlio_mc et utilisez le code suivant:

1
2
3
4
5
/ / Le code à l'intérieur padre_mc
( ) { figlio_mc. onRelease = function () {
this ) ; // figlio_mc trace (this); / / figlio_mc
this . _parent ) ; // padre_mc trace (this. _parent) / / padre_mc
}

Risalisre le «père», est donc claire et immédiate.

Avec les classes pures, code seul, ou des extensions de MovieClip, la propriété _parent n'est pas disponible et pourrait compliquer les choses! Immaginiiamo d'avoir une classe MyClass :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
MovieClip { Class MyClass étend MovieClip {
fonction MyClass () {
/ / Constructeur
}
/ /
myMethod fonction () {
this ) ; // myClass trace (this); / / myClass
; var num = 5;
; var cp = this;
....
[ un oggetto ] ; var = new myObject [un objet];
( ) { myObject. onLoad = function () {
this ) ; // myObject trace (this); / / myObject
cp ) ; // myClass trace (cp) / / myClass
}
}

, ovvero il puntatore alla classe MyClass . Le contexte de MyMethod() est, bien sûr, this , ou le pointeur vers la classe MyClass . . La variable num , par exemple, a un cycle de vie enfermé dans la méthode MyMethod() . Il est donc visible que dans la méthode et sera détruit à la sortie. . Même chose pour la variable myObject cependant qui initialise un événement, dans ce cas onLoad . lasciandoci, apparentemente, senza il puntatore alla classe madre myClass . Une fois déclenché onLoad() le contexte deviendra myObject quitter, apparemment, sans le pointeur vers la classe parent myClass . , ha lo stesso contesto della variabile myObject ! En analysant attentivement le code, nous voyons que la variable cp , défini dans la méthode myMethod() , a le même contexte de la variable myObject ! dell'oggetto myObject in quanto condivide con esso lo stesso contesto. En fait, la variable cp (pointeur de classe) sera visible à l'intérieur de la méthode onLoad objet myObject car elle partage avec elle le même contexte. ha necessità di “vivere” più al lungo del previsto visto che ha “allocato” un evento (di tutto questo se ne occupa Flash a nostra “insaputa”). En fait, la méthode myMethod() n'est pas désalloués juste parce que l'objet myObject a la nécessité de «vivre» plus à la tant attendue, car il a "affecté" un événement (tout cela a affaire avec Flash dans notre «connaissance»).

Conseils

Pour les événements liés à des boutons ou d'un clip une bonne habitude serait d'utiliser le formulaire:

1
2
3
4
5
my_mc onRelease = myOnRelease.;
myOnRelease fonction () {
this ) ; // _root trace (this); / / _root
"Click me" ) ; trace ("Click me");
}

Au lieu de la plus rapide et immédiate:

1
2
3
4
( ) { my_mc. onRelease = function () {
this ) ; // my_mc trace (this); / / my_mc
"Click me" ) ; trace ("Click me");
}

L'avantage d'utiliser une fonction externe est d'avoir un cadre neutre et la possibilité d'accéder à la fonction quel que soit le MovieClip qui le contrôle. Dans le second cas, par exemple, si je veux forcer l'exécution du code lié au «clic» du MovieClip devrais-je utiliser un code de ce type:

1
; . my_mc onRelease ();

Dans la pratique, que j'appelle l'événement comme s'il s'agissait d'une méthode. Cependant, je dois - en fait - d'avoir le MovieClip my_mc . Dans l'autre sens, cependant, je peux exécuter le code en appelant myOnRelease() . Évidemment, comme le montrent les exemples, les contextes d'oeil. . Dans le premier cas, le contexte de myOnRelease() est le parent de l'objet où il est écrit, par exemple _root . Dans le second cas, cependant, le contexte est toujours le MovieClip my_mc !

Forcer un contexte différent

Nous concluons avec un trucs utiles dans de nombreuses circonstances. in grado di forzare un contesto di un metodo o funzione. Flash propose une bibliothèque, mx.utils , avec un objet Delegate en mesure de forcer le contexte d'une méthode ou une fonction. Son utilisation est très simple:

1
2
3
4
5
6
7
8
utils . Delegate ; . importation mx utils des délégués.;
/ /
// puntatore ad un MovieClip my_mc var, / / pointeur vers un clip
// un bottone my_btn var, / / un bouton
fonction myFunction () {
this ) ; trace (this);
}
create ( my_mc , myFunction ) ; . my_btn onPress = délégués créés (my_mc, maFunction).;

L'événement onPress my_btn Les points de touche pour une fonction «nouvelle» créée spécifiquement avec le my_mc contextuel. Lorsque vous cliquez sur le bouton my_btn, le code exécuté dans myFunction() aura pour my_mc de contexte!

Suite ...