|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
[+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,784
|
Область видимости не должна меняться.
|
|
|||||
[+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,784
|
Не надо объявлять методов в методах, от этого только проблемы возникнут. А в 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, время: 18:14. |
|
« Предыдущая тема | Следующая тема » |
|
|