Quando o "gatilho", um evento de um contexto de objeto, que é o objeto pai que representa o escopo de todas as variáveis, torna-se o próprio objeto. Este aspecto, característica da programação orientada a objeto, pode ser desorientador causando erros e bugs no código. Além disso, em determinadas situações, pode impedir o acesso a algumas variáveis "antes" disponível.
Primeiro de tudo, vemos uma característica do ActionScript relacionados ao gerenciamento de contexto que, se for incluída, vai nos salvar algumas horas de testes desnecessários. Quando temos a ver com gráficos ou simplesmente MovieClips aninhados uns dentro dos outros, a propriedade _parent , resolução de problemas de contexto. Por exemplo, se o MovieClip padre_mc contiente figlio_mc outro MovieClip e usar o seguinte código:
1 2 3 4 5 | / / Código dentro padre_mc ( ) { figlio_mc. onRelease = function () { this ) ; // figlio_mc trace (this); / / figlio_mc this . _parent ) ; // padre_mc trace (this. _parent); / / padre_mc } |
Risalisre o "pai", então, é claro e imediato.
Com classes puras, o código-somente, extensão ou da propriedade MovieClip _parent não está disponível e pode complicar as coisas! Immaginiiamo ter uma classe MyClass :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | MovieClip { Classe MyClass estende MovieClip { MyClass function () { / / Construtor } / / myMethod function () { this ) ; // myClass trace (this); / myClass / ; var num = 5; ; var cp = this; .... [ un oggetto ] ; var myObject = new [objeto]; ( ) { myObject onLoad. = function () { this ) ; // myObject trace (this); / / myObject cp ) ; // myClass trace (cp); / myClass / } } |
, ovvero il puntatore alla classe MyClass . O contexto de MyMethod() é, evidentemente, this , que é o ponteiro para a classe MyClass . . A variável num , por exemplo, tem um ciclo de vida fechado dentro do método MyMethod() . É, portanto, apenas visíveis dentro do método e será destruído na saída. . Mesma coisa para a variável myObject que inicializa um evento, no entanto, neste caso onLoad . lasciandoci, apparentemente, senza il puntatore alla classe madre myClass . Quando acionado onLoad() contexto vai se tornar myObject deixando, aparentemente, sem o ponteiro para a classe pai myClass . , ha lo stesso contesto della variabile myObject ! Um olhar mais atento ao código podemos ver que a variável cp , definido no método myMethod() , tem o mesmo contexto da variável myObject ! dell'oggetto myObject in quanto condivide con esso lo stesso contesto. Na verdade, a variável cp (ponteiro de classe) será visível dentro do método onLoad objeto myObject como ele compartilha o mesmo contexto. 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”). Na verdade o método myMethod() não apenas porque o objeto é desalocada myObject tem a necessidade de "viver" em cima da. mais que o esperado porque tem "atribuído" um evento (tudo isso está lidando com o Flash no nosso "desconhecido")
Conselho
Para os eventos associados com botões ou MovieClips um bom hábito seria usar o formulário:
1 2 3 4 5 | my_mc onRelease = myOnRelease.; myOnRelease função () { this ) ; // _root trace (this); / / _root "Click me" ) ; trace ("Clique em mim"); } |
No lugar do mais rápida e imediata:
1 2 3 4 | ( ) { my_mc. onRelease = function () { this ) ; // my_mc trace (this); / / my_mc "Click me" ) ; trace ("Clique em mim"); } |
A vantagem de utilizar uma função externa é ter um contexto neutro ea possibilidade de alcançar a função independente da MovieClip que controla. No segundo caso, por exemplo, se você quiser forçar a execução do código vinculado ao "click" do MovieClip que eu deveria usar um código deste tipo:
1 | ; . my_mc onRelease (); |
Na prática, eu chamo o evento como se fosse um método. No entanto, tenho - de fato - para que a MovieClip my_mc . De qualquer maneira, no entanto, pode executar o código diretamente chamando myOnRelease() . Obviamente, como mostrado nos exemplos, olho para contextos. . No primeiro caso, o contexto de myOnRelease() é a mãe do objeto onde está escrito, por exemplo, _root . No segundo caso, em vez disso, o contexto é sempre o MovieClip my_mc !
Forçando um contexto diferente
Concluímos com alguns truques úteis em muitas circunstâncias. in grado di forzare un contesto di un metodo o funzione. O Flash oferece uma biblioteca, mx.utils com um objeto Delegate pode forçar um contexto de um método ou função. Seu uso é muito simples:
1 2 3 4 5 6 7 8 | utils . Delegate ; .. importação mx utils Delegado; / / // puntatore ad un MovieClip my_mc var, / / ponteiro para um MovieClip // un bottone my_btn var, / / um botão myFunction function () { this ) ; trace (this); } create ( my_mc , myFunction ) ; my_btn onPress = Delegado criado (my_mc, myFunction)..; |
O evento onPress my_btn os botão aponta para uma função de "novo" criado precisamente com o my_mc contexto. Quando você clicar no botão my_btn, o código executado em myFunction() terá como my_mc contexto!






Últimos Comentários
simone : bom e claro! Parabéns e obrigado, um cumprimento
Giovambattista Fazioli : @ Vik: validação é sempre uma questão difícil de gerir, como deveria ...
vik : Usuários campos personalizados parece interessante, deve ser adicionada a capacidade de validar o campo com base em ...
kOoLiNuS : @ Giovambattista Fazioli: obrigado! mais do que dispostos!
Giovambattista Fazioli : @ kOoLiNuS: Calmo, provavelmente você pode antecipar que WPX Cleanfix será livre, e ...