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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.11.2008, 16:19
dashaaa вне форума Посмотреть профиль Отправить личное сообщение для dashaaa Найти все сообщения от dashaaa
  № 31  
Ответить с цитированием
dashaaa

Регистрация: Sep 2008
Адрес: Moscow
Сообщений: 44
Отправить сообщение для dashaaa с помощью ICQ
По умолчанию старые песни о главном

Подскажите, как в такой ситуации правильно организовать функции, чтобы не было проблем с вложенными функциями и с областями видимости:
Код AS1/AS2:
class Room {
	static var xmlName:String = "1.xml";
	var xmlDoc:XML;
	var xml_rootNode:XMLNode;
 
	public function parsXML():Void {
		trace(xml_rootNode);
	}
	public function Init():Void {
		xmlDoc.load(xmlName);
           // ошибка - обработчик внутри функции.
           // хотя может и нет - обработчик нужен 1 раз и удаляется после использования
           // ?
		xmlDoc.onLoad = function():Void  {
			if (this.status == 0) {
				trace("Успешно");
				xml_rootNode = this.firstChild;
                                // !!!!! ошибка - эта функция "не видна" отсюда
				parsXML();
			} else {
				trace("Ошибка при чтении xml "+this.status);
			}
		};
	}
	public function Room() {
		xmlDoc = new XML();
	}
}

Старый 27.11.2008, 16:26
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 32  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
Код:
import mx.utils.Delegate;
class Room {
	static var xmlName:String = "1.xml";
	var xmlDoc:XML;
	var xml_rootNode:XMLNode;
 
	public function parsXML():Void {
		trace(xml_rootNode);
	}
	public function Init():Void {
		xmlDoc.load(xmlName);
           // ошибка - обработчик внутри функции.
           // хотя может и нет - обработчик нужен 1 раз и удаляется после использования
           // ?
	}
	public function Room() {
		xmlDoc = new XML();
		xmlDoc.onLoad = Delegate.create (this, onLoadXML);
	}
	
	private function onLoadXML (success:Boolean):Void
		//// this теперь ссылается на экземпляр класса Room
		if (success) {
			trace("Успешно");
			xml_rootNode = xmlDoc.firstChild;
							// !!!!! ошибка - эта функция "не видна" отсюда
			parsXML();
		} else {
			trace("Ошибка при чтении xml "+xmlDoc.status);
		}
	};

}
__________________
(и)Нильс.ru | Плагины для FlashDevelop


Последний раз редактировалось iNils; 27.11.2008 в 16:28.
Старый 27.11.2008, 17:44
dashaaa вне форума Посмотреть профиль Отправить личное сообщение для dashaaa Найти все сообщения от dashaaa
  № 33  
Ответить с цитированием
dashaaa

Регистрация: Sep 2008
Адрес: Moscow
Сообщений: 44
Отправить сообщение для dashaaa с помощью ICQ
Спасибо большое! Я до этого понятия не имела о Delegate.

Старый 27.11.2008, 19:35
faust.d503 вне форума Посмотреть профиль Отправить личное сообщение для faust.d503 Найти все сообщения от faust.d503
  № 34  
Ответить с цитированием
faust.d503
 
Аватар для faust.d503

Регистрация: Nov 2008
Адрес: Москва
Сообщений: 52
А зачем использовать Delegate, по-моему есть более простой и удобный способ:

Код AS1/AS2:
class Room {
 
	public function Room() {
		var self:Room = this
		xmlDoc = new XML();
		xmlDoc.onLoad = function(){
			self.onLoadXML();
		}
	}
 
	private function onLoadXML (success:Boolean):Void
 
	};
 
}

Старый 27.11.2008, 21:35
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 35  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
faust.d503, это кривой и неудобный способ.

Старый 28.11.2008, 13:18
faust.d503 вне форума Посмотреть профиль Отправить личное сообщение для faust.d503 Найти все сообщения от faust.d503
  № 36  
Ответить с цитированием
faust.d503
 
Аватар для faust.d503

Регистрация: Nov 2008
Адрес: Москва
Сообщений: 52
__etc
Расскажите, чем он кривой и неудобный и чем лучше Delegate. Нет конечно можно подключить дополнительный класс, чтобы повысить вес программы, но зачем.

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

Старый 28.11.2008, 13:22
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 37  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Такой обработчик нельзя удалить, он будет висеть в памяти до упора, плюс требует self-ссылки, которая тоже живет в памяти, потому что живет функция.

Старый 28.11.2008, 13:32
faust.d503 вне форума Посмотреть профиль Отправить личное сообщение для faust.d503 Найти все сообщения от faust.d503
  № 38  
Ответить с цитированием
faust.d503
 
Аватар для faust.d503

Регистрация: Nov 2008
Адрес: Москва
Сообщений: 52
Цитата:
Такой обработчик нельзя удалить
Почему?
Код AS1/AS2:
class Room {
 
	public function Room() {
		var self:Room = this;
		xmlDoc = new XML();
		xmlDoc.onLoad = function(){
			self.onLoadXML();
			//удаляем)
			delete this.onLoad;
		}
	}
 
	private function onLoadXML (success:Boolean):Void
 
	};
 
}

Старый 28.11.2008, 13:37
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 39  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Да, но тогда анонимная функция с большой вероятностью останется жить, потому что есть self-ссылка, используемая внутри.

Старый 28.11.2008, 13:46
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 40  
Ответить с цитированием
iNils
Негуру
 
Аватар для iNils

администратор
Регистрация: Jan 2000
Адрес: Кёнигсберг in Moscow
Сообщений: 21,883
Записей в блоге: 7
О, уже костыли пошли, а было "более простой и удобный способ".
__________________
(и)Нильс.ru | Плагины для FlashDevelop

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

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

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


 


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


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