![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
[+1 18.03.08]
Регистрация: Nov 2006
Сообщений: 223
|
Цитата:
Kikasso У вас this получается Button. |
|
|||||
|
[+1 18.03.08]
Регистрация: Nov 2006
Сообщений: 223
|
Нет, мой велосипед выглядит вот так:
static function delegate(obj: Object, func: Function):Function {
var f = function() {
var target = arguments.callee.target;
var func = arguments.callee.func;
return func.apply(target, arguments.concat(arguments.callee.args));
};
f.target = obj;
f.func = func;
f.args = arguments.slice(2);
return f;
}
А класс Call - это чистая магия ![]() |
|
|||||
|
Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
|
Зачем нам колдовать с областью видимости? Мы можем передать ее параметром, а уж что за функция будет "на приеме", другое дело:
function onMenuReleased(){
var arr = arguments;
return ( function(){ trace("hello from " + this._name); trace( "arguments: " + arr); } );
}
btnMenu1.onRelease = onMenuReleased(1);
btnMenu2.onRelease = onMenuReleased(2);
btnMenu3.onRelease = onMenuReleased(this, 3, 4);
function onMenuReleased(){
trace("hello from " + this);
trace( arguments.length ? ("arguments: " + arguments.join(", ") ) : "no arguments" );
}
btnMenu1.onRelease = onMenuReleased;
btnMenu2.onRelease = function(){ onMenuReleased(2); }
btnMenu3.onRelease = function(){ onMenuReleased(this, 3, 4); }
btnMenu4.onRelease = function(){ onMenuReleased(); }
|
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Область видимости не должна меняться.
|
|
|||||
|
[+1 18.03.08]
Регистрация: Nov 2006
Сообщений: 223
|
Цитата:
Сделал я 4 кнопочки, поместил этот код в кадр. Затем запустил и поочередно щёлкнул по каждой кнопке. И вот что я получил: hello from _level0.btnMenu1 no arguments hello from _level0 arguments: 2 hello from _level0 arguments: _level0.btnMenu3, 3, 4 hello from _level0 no arguments В первом случае onMenuReleased вызвалось от имени кнопки. Во всех остальных случаях неявно подставился _root. Затем я объединил все кнопки в один мувик и привязал к этому мувику вот такой вот класс: class Menu extends MovieClip {
var btnMenu1:Button;
var btnMenu2:Button;
var btnMenu3:Button;
var btnMenu4:Button;
function onMenuReleased(){
trace("hello from " + this);
trace( arguments.length ? ("arguments: " + arguments.join(", ") ) : "no arguments" );
}
function Menu() {
btnMenu1.onRelease = onMenuReleased;
btnMenu2.onRelease = function(){ onMenuReleased(2); }
btnMenu3.onRelease = function(){ onMenuReleased(this, 3, 4); }
btnMenu4.onRelease = function(){ onMenuReleased(); }
}
}
Однако теперь работает только первая кнопка (и опять же this будет кнопка, а не наш класс). Во всех остальных случаях он не может найти onMenuReleased. Вот как раз из-за таких проблем с областью видимости и придумали класс mx.utils.Delegate, который каждый переделывает на свой лад. |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Не надо объявлять методов в методах, от этого только проблемы возникнут. А в Delegate лучше не смотреть, работает и работает. Это костыль в AS2, без него никуда, увы.
|
|
|||||
|
Регистрация: Oct 2006
Адрес: spb.ru
Сообщений: 3,221
|
Цитата:
Если объявлять эту btnOnrelease в конструкторе, это сработает, но без ссылки на самого себя не обойтись. Только такой изврат извратович: class Menu extends MovieClip {
var btnMenu1:Button;
var btnMenu2:Button;
var btnMenu3:Button;
var btnMenu4:Button;
function onMenuReleased():Void{
trace("hello from " + this);
trace( arguments.length ? ("arguments: " + arguments.join(", ") ) : "no arguments" );
}
function Menu() {
var viz:Menu = this;
btnMenu1.onRelease = onMenuReleased;
btnMenu2.onRelease = function(){ viz.onMenuReleased(2); }
btnMenu3.onRelease = function(){ viz.onMenuReleased(this, 3, 4); }
btnMenu4.onRelease = function(){ viz.onMenuReleased(); }
}
}
__etc прав, не надо мудрить. А если без классов, в кадре - проблем нет. |
![]() |
![]() |
Часовой пояс GMT +4, время: 07:29. |
|
|
« Предыдущая тема | Следующая тема » |
|
|