Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.02.2013, 23:38
fduch вне форума Посмотреть профиль Отправить личное сообщение для fduch Найти все сообщения от fduch
  № 1  
Ответить с цитированием
fduch

Регистрация: Jun 2012
Сообщений: 142
По умолчанию public var / var

Столкнулся с проблемой, когда могу работать с переменной типа URLVariables только в той функция где она получает данные.
обьявляю ее глобальной... не пашет.
Код AS3:
package {
 
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.geom.Rectangle;
	import flash.media.Sound;
	import flash.events.IEventDispatcher;
	import flash.net.URLLoader;
    import flash.text.*;
    import flash.net.URLRequest;
    import flash.net.URLVariables;
   	import flash.net.sendToURL;
	import flash.net.*;
 
    public class Main extends Sprite {
 
        public var load_unit:URLVariables;
	    public var loader:URLLoader;
 
        public function Main() {
 
            load_save();
            // load_unit.k_y Будет неинициализирована тут
            // потому, что загрузка происходит асинхронно.
            // Конструктор отработает гораздо раньше, чем
            // закончиться загрузка.
            trace(load_unit.k_y);
        }
 
	    function load_save() {
 
			var url:String = "http://bjiactb.60ru.com/unit.php";
			var request:URLRequest = new URLRequest(url);
			request.method = URLRequestMethod.POST;
 
			var save:URLVariables = new URLVariables();
			save.id = 2;
 
			request.data = save;
			var loader:URLLoader = new URLLoader();
			loader.dataFormat = URLLoaderDataFormat.VARIABLES
 
			configureListeners(loader);
			try {
				loader.load(request);
			} catch (error:Error) { trace("Unable to load requested document."); }
 
            // Локальные функции плохо реализованы в AS3, и их лучше не использовать
            // особенно в виду того, что тут они ни к чему.
			function configureListeners(dispatcher:IEventDispatcher):void {
				dispatcher.addEventListener(Event.COMPLETE, completeHandler);
			}
			function completeHandler(event:Event):void {
 
			    //var loader:URLLoader = URLLoader(event.target);
 
				loader = URLLoader(event.target);
 
			    //var load:URLVariables = new URLVariables(loader.data);
 
				load_unit = loader.data;
 
                trace(load_unit.k_y);
            }
        }
    }
}
переменная load_unit доступна толька в функции load_save.
Хотя обявлена публик.
В чем косяк?


Последний раз редактировалось wvxvw; 24.02.2013 в 23:48.
Старый 24.02.2013, 23:47
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 2  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Простите, что я ваш код отформатировал, и сразу же там и комментарии оставил. Но я думаю, что так удобнее, и чтобы не повторять код лишний раз.
__________________
Hell is the possibility of sanity

Старый 24.02.2013, 23:59
fduch вне форума Посмотреть профиль Отправить личное сообщение для fduch Найти все сообщения от fduch
  № 3  
Ответить с цитированием
fduch

Регистрация: Jun 2012
Сообщений: 142
Цитата:
Сообщение от wvxvw Посмотреть сообщение
Простите, что я ваш код отформатировал, и сразу же там и комментарии оставил. Но я думаю, что так удобнее, и чтобы не повторять код лишний раз.
Косяк понятен, а лечить то как?

Добавлено через 42 секунды
Цитата:
Сообщение от KumoKairo Посмотреть сообщение
Решение - сделать асинхронное выполнение функций, когда код 100% ждет пока в переменной что-то есть
Как? Если можно с примером

Старый 24.02.2013, 23:49
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 4  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Параметры видимости private, public и protected не влияют на видимость переменной внутри класса, в любом случае всегда будет все доступно.

Ошибка скорее всего в том, что вы пытаетесь обращаться к этой переменной (из других функций) до того, как она получит ссылку на loader.data;, то есть когда она null
И скорее всего у вас функции работают синхронно, без возможности ожидания момента, когда эта load_unit получит таки значение.

Решение - сделать асинхронное выполнение функций, когда код 100% ждет пока в переменной что-то есть

Старый 25.02.2013, 00:58
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 5  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Код AS3:
package {
 
	import flash.display.Bitmap;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.KeyboardEvent;
	import flash.events.MouseEvent;
	import flash.geom.Rectangle;
	import flash.media.Sound;
	import flash.events.IEventDispatcher;
	import flash.net.URLLoader;
    import flash.text.*;
    import flash.net.URLRequest;
    import flash.net.URLVariables;
   	import flash.net.sendToURL;
	import flash.net.*;
 
    public class Main extends Sprite {
 
        public var load_unit:URLVariables;
	    public var loader:URLLoader;
 
        public function Main() {
 
            load_save();
            // load_unit.k_y Будет неинициализирована тут
            // потому, что загрузка происходит асинхронно.
            // Конструктор отработает гораздо раньше, чем
            // закончиться загрузка.
            //Здесь трейс работать не будет по вышеизложенной причине
            trace(load_unit.k_y);
        }
 
	    function load_save() {
 
			var url:String = "http://bjiactb.60ru.com/unit.php";
			var request:URLRequest = new URLRequest(url);
			request.method = URLRequestMethod.POST;
 
			var save:URLVariables = new URLVariables();
			save.id = 2;
 
			request.data = save;
			var loader:URLLoader = new URLLoader();
			loader.dataFormat = URLLoaderDataFormat.VARIABLES
           //Убираем это, более простая замена ниже
	   //		configureListeners(loader);
			try {
				loader.load(request);
			} catch (error:Error) { trace("Unable to load requested document."); }
 
            //Скорее всего вы использовали пример из документации адоби.
            //Поскольку нам нужен только один слушатель, намного проще будет его объявить напрямую
		        loader.addEventListener(Event.COMPLETE, completeHandler);
	    //Так же вынесем обработчик в отдельный метод
        }
        private function completeHandler(event:Event):void {
 
			    //var loader:URLLoader = URLLoader(event.target);
 
				loader = URLLoader(event.target);
 
			    //var load:URLVariables = new URLVariables(loader.data);
 
				load_unit = loader.data;
                //А здесь трейс будет работать нормально.
                // Работу с вашим loader_unit следует начинать
                // именно с выполения этой функции
                trace(load_unit.k_y);
           }
    }
}

Старый 25.02.2013, 21:21
fduch вне форума Посмотреть профиль Отправить личное сообщение для fduch Найти все сообщения от fduch
  № 6  
Ответить с цитированием
fduch

Регистрация: Jun 2012
Сообщений: 142
Спс, я тоже решил проблему, задал переменную, которая меняет значение после загрузки данных и мониторим эту переменную в ентерфрейме.

Старый 25.02.2013, 21:51
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 7  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
которая меняет значение после загрузки данных и мониторим эту переменную в ентерфрейме.
Это костыль

Старый 25.02.2013, 23:33
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 8  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Это костыль
Согласен.
Выкидывайте лучше при получении переменной значения новое событие, и слушайте его где-нибудь в другом участке кода (включая объект, содержащий ваш объект загрузки)

Старый 25.02.2013, 23:36
fduch вне форума Посмотреть профиль Отправить личное сообщение для fduch Найти все сообщения от fduch
  № 9  
Ответить с цитированием
fduch

Регистрация: Jun 2012
Сообщений: 142
%-) Ну на самом деле мне нравиться самому придумывать варианты выхода из положения, даже если это дико и в корне неверно. Хотя я конечно запоминаю и копи пастю, то что мне предлогают)

Добавлено через 1 минуту
Цитата:
Сообщение от KumoKairo Посмотреть сообщение
Согласен.
Выкидывайте лучше при получении переменной значения новое событие, и слушайте его где-нибудь в другом участке кода (включая объект, содержащий ваш объект загрузки)
Ну по сути так и делается, при каком ли бо действие пользователя, которое вызывает перемещение чегонпибудь, опрашиваются данные с бд. и по их приходу перерисовывается карта. с полученными данными

Старый 26.02.2013, 00:39
KumoKairo вне форума Посмотреть профиль Отправить личное сообщение для KumoKairo Найти все сообщения от KumoKairo
  № 10  
Ответить с цитированием
KumoKairo
 
Аватар для KumoKairo

Регистрация: Jan 2013
Сообщений: 550
Записей в блоге: 1
Цитата:
Сообщение от fduch Посмотреть сообщение
Ну по сути так и делается, при каком ли бо действие пользователя, которое вызывает перемещение чегонпибудь, опрашиваются данные с бд. и по их приходу перерисовывается карта. с полученными данными
Нет делается совсем не по сути и совсем не так, как я имел в виду
Периодический опрос это не асинхронное выполнение, я говорил о выбросе события с помощью .dispatchEvent

Что вам нужно сделать - собственный класс, наследующий flash.Event
В конце функции инициализации переменной сделать выброс вашего события с помощью .dispatchEvent
Что-то вроде такого
Код AS3:
package
{
	import flash.events.Event;
 
	public class LoaderCompleted extends Event
	{
		public static const ALL_DONE:String="All done";
		public function LoaderCompleted(type:String, bubbles:Boolean=false, cancelable:Boolean=false)
		{
			super(type, bubbles, cancelable);
		}
	}
}
Код AS3:
...
public class Main extends Sprite {
...
private function completeHandler(event:Event):void {
 
			    //var loader:URLLoader = URLLoader(event.target);
 
				loader = URLLoader(event.target);
 
			    //var load:URLVariables = new URLVariables(loader.data);
 
				load_unit = loader.data;
                trace(load_unit.k_y);
                this.dispatchEvent(new LoaderCompleted(LoaderCompleted.ALL_DONE));
           }
...
}
И там, где мусолите в ентерфрейме переменную, вместо ентерфрейма добавьте слушатель события LoaderCompleted.ALL_DONE

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 21:36.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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