Форум 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=103411)

Mnilionic 05.11.2007 00:25

видимость переменных в классе
 
при выполнении метода не видны переменные:
Код:

class my extends MovieClip{
        var b = "done";
        var btn:Button;
       
        function my(){
                trace("конструктор: " + b)
                btn.onPress = func;
        }
       
        function func(){
                trace("метод: " + b);
                trace(btn._x)
        }
}


udaaff 05.11.2007 00:28

Delegate используйте

Mnilionic 05.11.2007 01:07

используя хелп и метод подбора получилось "увидеть" переменые.
только eventObj не передаётся
Код:

import mx.utils.Delegate;
class my extends MovieClip{
        var b = "done";
        var btn:Button;
        //var dat;
       
        function my(){
                trace("конструктор: " + b)
                btn.onPress = Delegate.create(this, func);
        }
       
        function func(eventObj:Object){
                trace(eventObj.target + ": " + eventObj.type);
                trace("метод: " + b);
                trace(btn._x)
        }
}


udaaff 05.11.2007 01:16

Если дописать пару строчек в Delegate, то можно параметры передавать
Код:

class MyDelegate
{
        static function create(obj:Object, func:Function):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.arg = arguments.slice(2);
                f.target = obj;
                f.func = func;
                return f;
        }
}

Код:

class my extends MovieClip{
        var b = "done";
        var btn:Button;
        //var dat;
       
        function my(){
                trace("конструктор: " + b)
                btn.onPress = MyDelegate.create(this, func, {type:"Lyayaya", target: this});
        }
       
        function func(eventObj:Object){
                trace(eventObj.target + ": " + eventObj.type);
                trace("метод: " + b);
                trace(btn._x)
        }
}


Mnilionic 05.11.2007 02:31

какие полезные штуки оказывается .callee и .apply
Спасибо, суть делегэйта я понял.
Единственное место, которое я не могу понять это
Код:

f.arg = arguments.slice(2);
f.target = obj;
f.func = func;

по отношению к функции.


попробовал сделать так:
Код:

class My_Delegate {
        static function create(target:Object, func:Function):Function {
                return function(){ func.apply(target, arguments.slice(2)) };
        }
}

делегейт работает, но 3 параметр не передаётся.

up

Разобрался... функция статичная, надо было сохранить параметры просто
сделал так и вроде работает:
Код:

class My_Delegate {
        static function create(target:Object, func:Function):Function {
                var t = target;
                var f = func;
                var a = arguments.slice(2);
                var back = function(){ f.apply(t, a) };
                return back;
        }
}

class my extends MovieClip{
        var b = "done";
        var btn:Button;
       
        function my(){
                trace("конструктор: " + b)
                btn.onPress = My_Delegate.create(this, func, btn);
        }
       
        function func(caller){
                trace(caller);
                trace("метод: " + b);
                caller._x+=10;
        }
}

udaaff, спасибо!

udaaff 05.11.2007 12:36

Цитата:

попробовал сделать так:
Код:
class My_Delegate {
static function create(target:Object, func:Function):Function {
return function(){ func.apply(target, arguments.slice(2)) };
}
}
делегейт работает, но 3 параметр не передаётся.
Потому что нужно было ссылку на массив записать в локальную переменную, так как функция которая была определена в нутри другой функции может использовать локальные переменные и параметры той функции в которой она была определана, даже после ее отработки. Т.е. сохраняется объект активации create и функция, которую мы вернули может продолжать дальше использовать ее локальные переменные.

имхо более правильно было бы значения локальных переменных и ссылку на массив параметров переписать в функцию, которую будет возвращать create.

Mnilionic 05.11.2007 13:33

а почему если на параметр обращаться по имени, а не через массив аргументов, тоне работает?
Код:

class My_Delegate {
        static function create(target:Object, func:Function, evtobj:MovieClip):Function {
                var f = function () {
                        var target = arguments.callee.target;
                        var func = arguments.callee.func;
                        var arg = arguments.callee.arg;
                                trace("видна ведь: " + arg);
                        return func.apply(target, arg);
                };
                f.target = target;
                f.func = func;
                f.arg = evtobj;
                return f;
        }
}


udaaff 05.11.2007 13:53

Потому что вторым параметром в apply идет массив
Код:

return func.apply(target, [arg]);

CrazyFlasher 05.11.2007 13:56

Код:

import mx.utils.Delegate;

class Anton{
    private var target:MovieClip;

    public function Anton(target:MovieClip){
          this.target = target;
          this.target.onEnterFrame = Delegate.create(this, function(){
                myFunc(target.param1, target.param2, target.param3);
          });
    }

    private function myFunc(p1:Number, p2:Number, p3:Number){
            trace(arguments);
    }
}

всё идеально передаётся

Mnilionic 05.11.2007 14:01

сглупил... стыдно.
спасибо.

etc 05.11.2007 14:17

CrazyFlasher, плохой пример.

CrazyFlasher 05.11.2007 14:25

__etc, а мне так удобней...читабельней (имхо)...а как по твоему лучше будет?

etc 05.11.2007 14:31

Это не читабельней ни разу, плюс имеет проблемы с областями видимости.
Нужно использовать Delegate с параметрами.

CrazyFlasher 05.11.2007 14:33

Цитата:

плюс имеет проблемы с областями видимости
хм...никогда их не было :)

etc 05.11.2007 14:43

Будут.


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

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