Просмотр полной версии : передача параметра функции, при нажатии на мувик
Dorin123
28.11.2006, 18:33
Здравствуйте!
Как правильно передать параметр из onpress=function(){} в другую функцию?
пишу:
for (var i=0; i<=30; i++){//цикл
for (var j=0; j<=30; j++){//цикл
_root._setka["b" + i + "y" +j].onPress=Presscode(this._name);
}//цикл
}//цикл
дальше:
public function Presscode(perem){
_root.jora.text=perem;
}
оно почему то не ждет пока я нажму на кнопку, а сразу выводит значение perem;
а вообще как можно
-//-.onPress=function(){
zed=this._name;
};
значение переменной zed передать в другую функцию?
помогите плизз.
KidsKilla
28.11.2006, 18:36
for (var i=0; i<=30; i++){//цикл
for (var j=0; j<=30; j++){//цикл
_root._setka["b" + i + "y" +j].onPress=function(){Presscode(this._name);}
}//цикл
}//цикл
Dorin123
28.11.2006, 18:50
не хочет оно вызывать вообще никакие функции изнутри
onPress=function(){ отсюда ничего не вызывает :( }
artcraft
28.11.2006, 19:07
надо копать в сторону mx.utils.Delegate
Dorin123
28.11.2006, 19:12
спасибо :) буду копать =)
надо копать в сторону mx.utils.DelegateТолько он не передает параметры. Вчера кстати под один проект подправил
class ru.inils.Delegate extends Object {
static function create (obj:Object, func:Function, arg:Array):Function {
var f = function () {
var target = arguments.callee.target;
var func = arguments.callee.func;
var arg = arguments.callee.arg;
return func.apply (target, arg);
};
f.target = obj;
f.func = func;
f.arg = arg;
return f;
}
}
artcraft
28.11.2006, 19:40
класс, шикарно
Ага, вот Proxy:
class ascb.util.Proxy {
public static function create(oTarget:Object, fFunction:Function):Function {
var aParameters:Array = new Array();
for(var i:Number = 2; i < arguments.length; i++) {
aParameters[i - 2] = arguments[i];
}
var fProxy:Function = function():Void {
var aActualParameters:Array = arguments.concat(aParameters);
fFunction.apply(oTarget, aActualParameters);
};
return fProxy;
}
}
Суть та же, после первых двух аргументов передаются остальные :)
artcraft
28.11.2006, 19:43
всего 2 строки дописал, а сколько пользы :~)
artcraft
28.11.2006, 19:47
__etc, тоже куул
Dorin123
28.11.2006, 20:00
спасибо :) попробую применить..
Dorin123
28.11.2006, 20:15
как можно поюзать класс Proxy в моем случае?
Точно также, как и Delegate — по функциональности они одинаковы.
artcraft
28.11.2006, 21:49
так же, за исключением способа передачи аргументов:
Класс от iNils-а:
import ru.inils.Delegate;
var mc:MovieClip = this.createEmptyMovieClip('mc', 1);
with(mc){beginFill(0xFF3366); lineTo(100,0); lineTo(100,100); lineTo(0, 100); lineTo(0,0); endFill();}
var doItOnPress:Function = function(myMc:MovieClip, pram2:Number){
trace(this+' myMc:'+myMc+' pram2:'+pram2);
}
mc.onPress = Delegate.create(this, doItOnPress, [mc, 123]);
Класс от __etc:
import ascb.util.Proxy;
var mc:MovieClip = this.createEmptyMovieClip('mc', 1);
with(mc){beginFill(0xFF3366); lineTo(100,0); lineTo(100,100); lineTo(0, 100); lineTo(0,0); endFill();}
var doItOnPress:Function = function(myMc:MovieClip, pram2:Number){
trace(this+' myMc:'+myMc+' pram2:'+pram2);
}
mc.onPress = Proxy.create(this, doItOnPress, mc, 123);
и там и там в оутпуте будет: _level0 myMc:_level0.mc pram2:123
разница только в наличии квадратных скобок
мне больше нравится без :~)
artcraft
28.11.2006, 22:14
точно такого результат можно добиться не импортируя никаких классов,
однако, не смотря на то что кода не стало больше, а от импорта удалось избавиться,
этот способ считается менее правильным:
var mc:MovieClip = this.createEmptyMovieClip('mc', 1);
with(mc){beginFill(0xFF3366); lineTo(100,0); lineTo(100,100); lineTo(0, 100); lineTo(0,0); endFill();}
var doItOnPress:Function = function(myMc:MovieClip, pram2:Number){
trace(this+' myMc:'+myMc+' pram2:'+pram2);
}
var self:Object=this;
mc.onPress = function(){self.doItOnPress(this, 123);}
artcraft, это костылки в виде дополнительной ссылки, которая, тем не менее, не решает проблем с областью видимостью.
з.Ы. Proxy не мой, автор неизвестен, тем не менее, ему большое спасибо.
artcraft
29.11.2006, 00:37
автора зовут Joey Lott
вот его сайт http://www.person13.com/
а тут вся ascb библиотека http://www.person13.com/ascblibrary/
artcraft
29.11.2006, 01:25
не решает проблем с областью видимостьи.
можно немного подробнее,
мне казалось, что в результате и так и так функция doItOnPress вызывается таким образом что this указывает на _level0 ...
в чём конкретно проблема области видимостьи? можно пример?
artcraft, ммм, я про твой неправильный способ говорил :)
artcraft
29.11.2006, 02:02
И я про него - он точно так функцию вызывает
artcraft
29.11.2006, 02:03
и потом, это не мой метод... это не я изобрёл так делать... :~)
Ну раз про него, то опять же, переместить назначение onPress в другое место нельзя, ссылку убить нельзя и т.п. В общем — не вариант.
artcraft
29.11.2006, 02:16
почему нельзя?
delete(mc.onPress);
mc.onPress=otherFunction;
точно такого результат можно добиться не импортируя никаких классов...
function createDelegate (obj:Object, func:Function, arg:Array):Function {
var f = function () {
var target = arguments.callee.target;
var func = arguments.callee.func;
var arg = arguments.callee.arg;
return func.apply (target, arg);
};
f.target = obj;
f.func = func;
f.arg = arg;
return f;
}
function func () {
trace (arguments);
}
var mc:MovieClip = this.createEmptyMovieClip ('mc', 1);
with (mc) {
beginFill (0xFF3366);
lineTo (100, 0);
lineTo (100, 100);
lineTo (0, 100);
lineTo (0, 0);
endFill ();
}
var self:Object = this;
mc.onPress = createDelegate (this, func, [mc,2])
artcraft, я имел ввиду, что нельзя убивать вспомгательную ссылку, а вместе с этим и перенести всю функцию куда-нибудь ещё…
artcraft
29.11.2006, 02:28
:~)
ну это и коню понятно что можно всё в один столбик написать без всяких импортов....
не в этом вопрос - вопрос:
в чём конкретно проблема области видимости, "кривого" cпособа?
до меня не доходит - чем он хуже?
artcraft
29.11.2006, 02:29
нельзя убивать вспомгательную ссылку, а вместе с этим и перенести всю функцию куда-нибудь ещё… это как?
что такое вспомогательная ссылка?
как это сделать правильным способом?
artcraft
29.11.2006, 02:39
а... дошло (плохо башка варит к ночи) вспомогательня ссылка это:
var self:Object = this;
так а зачем её удалять - она что много памяти съедает? кому они мешает?
Да никак — юзать Delegate/Proxy и не мучаться.
Проблема «кривого» способа в том, что внутри вспомгательной функции this ссылается вовсе не на то, что нам нужно, поэтому и создается лишний мусор, вроде self.
artcraft
29.11.2006, 03:09
и куда её еще переносить?
для привязывания функции любым из методов нужна ссылка на функцию и ссылка на то что будет для неё this-ом
var target:Object = this;
mc.onPress = function(){target.func(params);}
function createDelegate (obj:Object, func:Function, arg:Array):Function {
var f = function () {
var target = arguments.callee.target;
var func = arguments.callee.func;
var arg = arguments.callee.arg;
return func.apply (target, arg);
};
f.target = obj;
f.func = func;
f.arg = arg;
return f;
}
mc.onPress = createDelegate (this, func, params);
----
при "плохом" методе мы имеем болше символов и 2-е строки
да согласен "правилный" метод нагляднее, но реально кода больше см. коммент#24 (хотя, безусловно нас это не волнует т.к. это менее важно чем читаемость кода)
то что находится внутри вспомогательной функции не важно - туда ничего добавлять и не надо... потому она и вспомогательная.
"правильный" способ - это ведь тоже вспомогательная функция, там ведь никто не стремится ничего менять...
пока не вижу критических различий :umnik2:
только чистоплюйство...
artcraft
29.11.2006, 03:13
согласитесь, "неправильный" метод в итоге компактнее
artcraft
29.11.2006, 03:46
function createDelegate (obj:Object, func:Function, arg:Array):Function {
var f = function () {
var target:Object = arguments.callee.target;
var func:Function = arguments.callee.func;
var arg:Array = arguments.callee.arg;
return func.apply (target, arg);
};
f.target = obj;
f.func = func;
f.arg = arg;
return f;
}
mc.onPress = createDelegate (this, func, arg);
var target:Object = this;
mc.onPress = function () {func.apply(target, arg);}
вспомогательная ссылка на this
вспомогатеьная функция
вызов прикрепляемой функции
Эхх... жаль кое-чего в AS 3 нету
artcraft
29.11.2006, 06:11
почему жаль?
нет там c этим гемора и хорошо - радоваться надо :~)
почему жаль?
нет там c этим гемора и хорошо - радоваться надо :~)Ну всё-таки бывает нужно просмотреть стэк вызова. А то убрали свойство calle
artcraft, в Proxy нету ничего вспомогательного. Дело не в краткости кода.
Дело в инкапсуляции — ты написал одну строку и всё, не забивая себе голову лишними рассуждениями на тему области видимости и как её не потерять. Более того, это более правильно с точки зрения ООП — метод должен обрабатываться в конкретном экземпляре класса, а не обрабатываться где-то в его потомках.
Попробуй написать такую конструкцию в FDT — повергнешь его в шок.
Dorin123
29.11.2006, 12:23
огромное всем спасибо :) проблема решена.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.