PDA

Просмотр полной версии : передача параметра функции, при нажатии на мувик


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
спасибо :) буду копать =)

iNils
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
класс, шикарно

etc
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 в моем случае?

etc
28.11.2006, 20:22
Точно также, как и 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);}

etc
28.11.2006, 23:56
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 ...
в чём конкретно проблема области видимостьи? можно пример?

etc
29.11.2006, 01:59
artcraft, ммм, я про твой неправильный способ говорил :)

artcraft
29.11.2006, 02:02
И я про него - он точно так функцию вызывает

artcraft
29.11.2006, 02:03
и потом, это не мой метод... это не я изобрёл так делать... :~)

etc
29.11.2006, 02:12
Ну раз про него, то опять же, переместить назначение onPress в другое место нельзя, ссылку убить нельзя и т.п. В общем — не вариант.

artcraft
29.11.2006, 02:16
почему нельзя?
delete(mc.onPress);
mc.onPress=otherFunction;

iNils
29.11.2006, 02:16
точно такого результат можно добиться не импортируя никаких классов...
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])

etc
29.11.2006, 02:27
artcraft, я имел ввиду, что нельзя убивать вспомгательную ссылку, а вместе с этим и перенести всю функцию куда-нибудь ещё…

artcraft
29.11.2006, 02:28
:~)
ну это и коню понятно что можно всё в один столбик написать без всяких импортов....

не в этом вопрос - вопрос:
в чём конкретно проблема области видимости, "кривого" cпособа?
до меня не доходит - чем он хуже?

artcraft
29.11.2006, 02:29
нельзя убивать вспомгательную ссылку, а вместе с этим и перенести всю функцию куда-нибудь ещё… это как?
что такое вспомогательная ссылка?
как это сделать правильным способом?

artcraft
29.11.2006, 02:39
а... дошло (плохо башка варит к ночи) вспомогательня ссылка это:
var self:Object = this;
так а зачем её удалять - она что много памяти съедает? кому они мешает?

etc
29.11.2006, 02:42
Да никак — юзать 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
вспомогатеьная функция
вызов прикрепляемой функции

miramax
29.11.2006, 04:42
Эхх... жаль кое-чего в AS 3 нету

artcraft
29.11.2006, 06:11
почему жаль?
нет там c этим гемора и хорошо - радоваться надо :~)

miramax
29.11.2006, 06:59
почему жаль?
нет там c этим гемора и хорошо - радоваться надо :~)Ну всё-таки бывает нужно просмотреть стэк вызова. А то убрали свойство calle

etc
29.11.2006, 12:22
artcraft, в Proxy нету ничего вспомогательного. Дело не в краткости кода.
Дело в инкапсуляции — ты написал одну строку и всё, не забивая себе голову лишними рассуждениями на тему области видимости и как её не потерять. Более того, это более правильно с точки зрения ООП — метод должен обрабатываться в конкретном экземпляре класса, а не обрабатываться где-то в его потомках.

Попробуй написать такую конструкцию в FDT — повергнешь его в шок.

Dorin123
29.11.2006, 12:23
огромное всем спасибо :) проблема решена.