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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 27.11.2008, 16:19
dashaaa вне форума Посмотреть профиль Отправить личное сообщение для dashaaa Найти все сообщения от dashaaa
  № 1  
Ответить с цитированием
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, 17:44
dashaaa вне форума Посмотреть профиль Отправить личное сообщение для dashaaa Найти все сообщения от dashaaa
  № 2  
Ответить с цитированием
dashaaa

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

Старый 27.11.2008, 16:26
iNils вне форума Посмотреть профиль Отправить личное сообщение для iNils Посетить домашнюю страницу iNils Найти все сообщения от iNils
  № 3  
Ответить с цитированием
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.
Старый 28.11.2008, 16:11
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 4  
Ответить с цитированием
chingachgoog
Banned
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
А что вообще делегат делает? Возвращает функцию оболочку с нужной функцией вызова apply:
Код:
class Room {
	public function Room() {
		xmlDoc = new XML();
		xmlDoc.onLoad = function (){                    
			return onLoadXML.apply(this, arguments);
		}
	}
	private function onLoadXML (success){}
}
По-любому генерится лишняя функция.

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

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от chingachgoog Посмотреть сообщение
Код:
			return onLoadXML.apply(this, arguments);
Ага, только в этом коде область видимости не изменится.

Цитата:
Сообщение от chingachgoog Посмотреть сообщение
По-любому генерится лишняя функция.
Так она генерится в обоих костылях.

Старый 28.11.2008, 17:29
chingachgoog вне форума Посмотреть профиль Найти все сообщения от chingachgoog
  № 6  
Ответить с цитированием
chingachgoog
Banned
 
Аватар для chingachgoog

блогер
Регистрация: Nov 2006
Адрес: Moscow
Сообщений: 2,145
Записей в блоге: 7
Цитата:
Сообщение от __etc Посмотреть сообщение
Ага, только в этом коде область видимости не изменится.
Да, это просто схема работы делегата. (код нерабочий, если кто не понял. Чтобы сделать его рабочим надо добавить ссылку на функцию onLoadXML. Например, так: xmlDoc.onLoadXML=onLoadXML)
Но суть в создании лишней функции-оболочки.


Последний раз редактировалось chingachgoog; 28.11.2008 в 17:31.
Старый 28.11.2008, 19:18
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 7  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Цитата:
Сообщение от chingachgoog Посмотреть сообщение
Чтобы сделать его рабочим надо добавить ссылку на функцию onLoadXML. Например, так: xmlDoc.onLoadXML=onLoadXML)
Опять же, this внутри onLoadXML будет ссылаться на xmlDoc, а не на экземпляр Room. Снова область видимости будет неправильной.

Старый 27.11.2008, 19:35
faust.d503 вне форума Посмотреть профиль Отправить личное сообщение для faust.d503 Найти все сообщения от faust.d503
  № 8  
Ответить с цитированием
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
  № 9  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

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

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

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

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

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

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

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


 


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


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