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

DrugON 13.08.2008 02:37

Как в классе переменную одной функции загрузить в другую?
 
Цитата:

Kuruki
Ну к примеру так
Код:

public function function1():String {
var str:String = 'hello';
return str;
}
public function function2(par:String):Void {
trace(par);
}
public function function3():Void {
function2(function1());
}


Спасибо, что ответил .

Можешь помочь в моем примере? На скорую руку накропал, несуди плиз строго.
Как сделать чтобы мое условие if ... else if работало в функции init?
Код:

class my {
        private var frames:MovieClip;
        public function my(str:String) {
                this.frames = frames;
                var str:String = "hello";
                getDaten(str);
        }
        private function getDaten(str:String) {
                var obj:Object = this;
                for (var i = 0; i <= str.length; i++) {
                        var tex = str[i];
                        if (tex[10] == "up") {
                                var m_Frame:MovieClip = frame_Up;
                        } else if (tex[0] == "down") {
                                var m_Frame:MovieClip = frame_Down;
                        }
                }
                obj.init();
        }
        private function init() {
                var frame_Up:MovieClip = this.createEmptyMovieClip("frame", this.getNextHighestDepth());
                var frame_Down:MovieClip = this.createEmptyMovieClip("frame", this.getNextHighestDepth());
                frames = m_Frame.attachMovie("fr", "fr" + i, m_Frame.getNextHighestDepth());
        }

}


Kuruki 13.08.2008 13:22

Ой-ё! Я даже не могу понять, что ты хочешь сделать... Ты хочешь передавать в конструктор имя клипа, а потом аттачить его что-ли? Вообщем распиши все по-подробнее на словах.

DrugON 13.08.2008 19:52

извини намудрил конечно...
вот оригинал моей функции
Код:

        private function getXMLDaten(xml_weg:String):Void {
                var punkt:Object = this;
                var menu_db:Array = new Array();
                this.xml.onLoad = function(success:Boolean) {
                        if (success) {
                                for (var i = 0; i < this.firstChild.childNodes.length; i++) {
                                        var shortcut = this.firstChild.childNodes[i];
                                        var submenu_db:Array = new Array();
                                        if (shortcut.attributes.ur == "up") {
                                                var m_frame = frame_Up;
                                        } else if (shortcut.attributes.ur == "down") {
                                                var m_frame = frame_Mitte;
                                        }
                                        for (var j = 0; j < shortcut.childNodes.length; j++) {
                                                submenu_db.push({ur:shortcut.childNodes[j].attributes.ur, caption:shortcut.childNodes[j].attributes.name, link:shortcut.childNodes[j].attributes.link});
                                        }
                                        menu_db.push({ur:shortcut.childNodes[j].attributes.ur, caption:shortcut.attributes.name, link:shortcut.attributes.link, subnav_db:submenu_db});
                                }
                                punkt.initMenu(menu_db);
                        }
                };
                xml.load(xml_weg);
        }

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

        private function initMenu():Void {
var frames:MovieClip = m_Frame.attachMovie("fr", "fr" + i, m_Frame.getNextHighestDepth());
}

как это сделать?

wvxvw 13.08.2008 20:36

Создавать функции внутри функций - плохо, на то есть много причин.
Есть для этих целей класс mx.utils.Delegate он специально предназначен для делегирования (передачи) объекта в области видимости которого будет выполнена функция этой функции.
Кроме того, переделывать ХМЛ в другую структуру, будь то массив или объект - в 99% случаев абсурдное занятие, которое только занимает время и ресурсы. В общем случае, либо используйте так, как есть, либо если очень сложная структура - есть XPath, есть и в mx пакете, и есть альтернативный вариант.
Ну и вот это - ну, как бы вообще не серьезно:
Код:

menu_db.push({        ur:shortcut.childNodes[j].attributes.ur,
                        caption:shortcut.attributes.name,
                        link:shortcut.attributes.link,
                        subnav_db:submenu_db});

Почему нельзя было так?
Код:

menu_db.push(shortcut.childNodes[j].attributes);
Кроме всего прочего, перебирать в цикле ХМЛ таким вот образом:
Код:

while(xml.childNodes[i].childNodes[i].childNodes[i].childNodes[i]...)
Во-первых нечитаемо, а во вторых создает лишнюю нагрузку, т.е. логично в таком случае поступить так:
Код:

var xn:XMLNode = xml.childNodes[i].childNodes[i].childNodes[i].childNodes[i];
while(xn.childNodes[i]...)


DrugON 13.08.2008 22:22

Спасибо за советы, но у меня пока нет цели оптимезировать.
Цитата:

Кроме того, переделывать ХМЛ в другую структуру, будь то массив или объект - в 99% случаев абсурдное занятие, которое только занимает время и ресурсы.
ну хорошо, переделывать не чего не будем.
вот так моя функция функционирует 100%
Код:

        private function getXMLDaten(xml_weg:String):Void {
                var punkt:Object = this;
                var menu_db:Array = new Array();
                var frame_Up:MovieClip;
                this.xml.onLoad = function(success:Boolean) {
                        if (success) {
                                for (var i = 0; i < this.firstChild.childNodes.length; i++) {
                                        var shortcut:Array = this.firstChild.childNodes[i];
                                       
                                        var submenu_db:Array = new Array();
                                        for (var j = 0; j < shortcut.childNodes.length; j++) {
                                                submenu_db.push({ur:shortcut.childNodes[j].attributes.ur, caption:shortcut.childNodes[j].attributes.name, link:shortcut.childNodes[j].attributes.link});

                                        }
                                        menu_db.push({ur:shortcut.attributes.ur, caption:shortcut.attributes.name, link:shortcut.attributes.link, subnav_db:submenu_db});
                                        this.initMenu.apply(this, shortcut);
                                }
                                punkt.initMenu(menu_db);
                        }
                };
                xml.load(xml_weg);
        }

попробывал переменную передать в функцию initMenu() методом apply
Код:

        private function initMenu(nav_db:Array, shortcut):Void {
                if (shortcut.attributes.ur == "up") {
                        var m_frame = frame_Up;
                        trace(shortcut.attributes.ur);
                } else if (shortcut.attributes.ur == "down") {
                        var m_frame = frame_Mitte;
                        trace(m_frame);
                }
var frames:MovieClip = m_Frame.attachMovie("fr", "fr" + i, m_Frame.getNextHighestDepth());
}

но приходит только один параметр undefined, а не массив. Так разве нельзя?
P.S. я только учусь и пытаюсь разобраться.

XBEEN 14.08.2008 02:34

Ты запутался в this'ах, а еще разберись в области видимости функции...
Внутри анонимной функции this'ом является экзепляр xml, а экзепляр объекта punkt внутри данной функции не будет виден.
И вообще ЗАЧЕМ ты экзепляру объекта punkt присваиваешь экзепляр класса?
В общем решение может быть таким:
Код:

private var menu_db:Array = new Array();
private var frame_Up:MovieClip;
private var xml:XML;
private function getXMLDaten(xml_weg:String):Void {
                xml.onLoad = Proxy.create(this, checkLoadingResult);
                xml.load(xml_weg);
}
private function checkLoadingResult():Void {
                if(xml.loaded) {
                        // твой код
                        initMenu(arr);
                }
}
private function initMenu(arr:Array):Void
{

}

Создаешь дополнительный класс Proxy, который расширяет область видимости
Код:

class Proxy
{
        public static function create(obj:Object, func:Function):Function
        {
                var arg:Array = arguments.slice(2);
                var new_func:Function = function()
                {
                        return func.apply(obj, arg);
                };
                return new_func;
        }
}

Proxy позволяет передавать параметры, но в нашем случае можно было использовать встроенный класс mx.utils.Delegate!
В любом случае это "гавнокод", лучше разберись в принципах ООП, а потом пиши код в классах.


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

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