Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   передача параметра функции, при нажатии на мувик (http://www.flasher.ru/forum/showthread.php?t=88689)

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

Цитата:

Сообщение от artcraft
надо копать в сторону 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

Цитата:

Сообщение от __etc
не решает проблем с областью видимостьи.

можно немного подробнее,
мне казалось, что в результате и так и так функция 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

Цитата:

Сообщение от artcraft
точно такого результат можно добиться не импортируя никаких классов...

Код:

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

Цитата:

Сообщение от __etc
нельзя убивать вспомгательную ссылку, а вместе с этим и перенести всю функцию куда-нибудь ещё…

это как?
что такое вспомогательная ссылка?
как это сделать правильным способом?

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

Цитата:

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

Ну всё-таки бывает нужно просмотреть стэк вызова. А то убрали свойство calle

etc 29.11.2006 12:22

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

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

Dorin123 29.11.2006 12:23

огромное всем спасибо :) проблема решена.


Часовой пояс GMT +4, время: 18:47.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.