Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как изменить параметр класса в обработчике событий (http://www.flasher.ru/forum/showthread.php?t=122094)

Abdilxamidov 02.03.2009 16:47

Как изменить параметр класса в обработчике событий
 
Здравствуйте, помогите, не могу сам разобраться, да и весь интернет облазил. Вот, например, есть такой код. Как сделать, чтобы значение переменной v , установленное в обработчике dataLoaderCompleteHandler было, например, передано в ф-цию myFunction? Сейчас trace(v) там выдает null


Код AS3:

public class LearningR4 {
                internal var v:String;
 
                public function LearningR4() {
 
                }
                public function myFunction(m_fPath, m_dataFile):void {
                        var myRequest:URLRequest = new URLRequest(m_fPath+m_dataFile);
                        var dataLoader:URLLoader = new URLLoader();
                        dataLoader.dataFormat = dataFormat;
                        dataLoader.addEventListener(Event.COMPLETE, dataLoaderCompleteHandler);
                        dataLoader.load(myRequest);
                        trace(v);
                }
 
                private function dataLoaderCompleteHandler(e:Event):void {
                        v="v in dataLoaderCompleteHandler";
                }
        }


Aldvin 02.03.2009 17:01

Дело в том, что событие Event.COMPLETE происходит не сразу, а через некоторое время. И как только загрузка завершается вызывается функция dataLoaderCompleteHandler.
Т.е. порядок выполнения таков:
Код AS3:

var myRequest:URLRequest = new URLRequest(m_fPath+m_dataFile);
var dataLoader:URLLoader = new URLLoader();
dataLoader.dataFormat = dataFormat;
 
// Здесь функция dataLoaderCompleteHandler не исполняется, а лишь будет исполнена после успешной загрузки(Event.COMPLETE)
dataLoader.addEventListener(Event.COMPLETE, dataLoaderCompleteHandler);
 
dataLoader.load(myRequest);
trace(v);
// И только через некоторое время исполнится код
v="v in dataLoaderCompleteHandler"; // Здесь Вы присваивайте переменной v значение "v in dataLoaderCompleteHandler" - т.е. сам текст
// Тут и надо трейсить v


iNils 02.03.2009 17:11

Вместо Event.COMPLETE, надо использовать Event.INIT

Abdilxamidov 02.03.2009 18:05

а вроде такого события Event.INIT в URLLoader-е нету.
И - да, в самом обработчике переменная живет, но при выходе из него - пропадает, хотя вроде она должна быть доступна всем внутри класса, как ее получить другой функцией этого класса (хотя мне, вообще-то нужно это значение использовать совсем другим классом, входящим в этот пакет)?

iNils 02.03.2009 18:23

Не внимательно прочитал. Aldvin все верно написал.

Abdilxamidov 02.03.2009 18:30

последовательность выполнения я понял, ну а как-же использовать значение переменной, присваиваемое именно в этом обработчике, в другом классе пакета?

Добавлено через 4 часа 58 минут
Народ, неужели решения не существует?, вроде это должно быть просто: одна функция класса при выполнении (какая разница как она вызывается) изменяет параметр своего класса. Или, может, я чего-то не догоняю? Я уже 3 дня этим парюсь!

Добавлено через 28 часов 58 минут
Люди, а-у! Есть кто живой?

Aldvin 04.03.2009 09:57

Ответа Вы не получаете из-за плохо поставленого вопроса.
Попробуем предположить:
Если доступ к переменной v нужен из любой функции этого класса, то с этим проблем быть не может.
Если же Вам нужен доступ из другого класса, то опять же всё должно работать... например, в неком третьем классе создаем экземпляр первого класса(LearningR4) и экземпляр второго класса(OtherClass, из которого будем обращатся к переменной v)
Код AS3:

var a:LearningR4=LearningR4();
var b:OtherClass=new OtherClass(a);

т.е. в класс OtherClass мы передали ссылку на экземпляр класса LearningR4(т.е. на a)
Класс OtherClass должен иметь следующий вид:
Код AS3:

public class OtherClass {
        public function OtherClass(instanceOfLearningR4:LearningR4) {
                trace(instanceOfLearningR4.v);
        }
}

Это на мой взгляд самый простой способ и многочисленных

Abdilxamidov 04.03.2009 12:55

прошу прощения за плохо поставленный вопрос. Я пытался

Добавлено через 34 минуты
Спасибо Aldvin за ответ! Попробую еще уточнить:
Да, мне нужен доступ к переменной v из другого класса, причем, чтобы она имела значение измененное в теле обработчика dataLoaderCompleteHandler(). А обязательно создавать некий 3-й класс?
Вот я во втором классе пишу так:
Код AS3:

public class OtherClass {
        public function OtherClass() {
                var a = new LearningR4;//создаю экземпляр класса LearningR4()
 
a.myFunction(m_fPath, m_dataFile)//выполняю ф-цию, загружающую данные из файла
trace(a.v);//
        }
}

так вот я не получаю в trace(a.v) значение v, установленное в dataLoaderCompleteHandler, а именно ""v in dataLoaderCompleteHandler"

Добавлено через 36 минут
В этом и заключается проблема

Добавлено через 4 часа 22 минуты
Ура! Разобрался, всем огромное спасибо!


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

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