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

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

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

Регистрация: Mar 2008
Сообщений: 15
Attention Заставить onLoad быть onLoadMoment

Здравствуйте, всем!

Есть задача, смысл её, мягко сказать, тупой, но нужно сделать.

Есть компонент,если на таймлайне написать mc.onLoad, событие не должно срабатывать. Я знаю о существовании перезагрузки событий/методов, но пример не смог найти.

Помогите, пожалуйста, решить эту проблему

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

Регистрация: May 2008
Сообщений: 476
lazutkin! Просьба разъяснить более подробно задачу либо проблему, а то не ясно чего Вы хотите.
__________________
Случайность, господа, это знаете ли непознанная необходимость.

Старый 31.07.2008, 12:07
lazutkin вне форума Посмотреть профиль Отправить личное сообщение для lazutkin Найти все сообщения от lazutkin
  № 3  
Ответить с цитированием
lazutkin

Регистрация: Mar 2008
Сообщений: 15
Есть компонент, пользователь кидает его на сцену, называет его "mc".
Дальше пишет "mc.onLoad = fun...", и конечно же событие вызывается.

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

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

Регистрация: May 2008
Сообщений: 476
Цитата:
Есть компонент, пользователь кидает его на сцену, называет его "mc".
Дальше пишет "mc.onLoad = fun...", и конечно же событие вызывается.

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

Цитата:
Есть решение - переименовать это событие, например, в "onLoadMoment"
Пожалуйста, подскажите, как я могу переименовать это стандартное событие?
Не совсем понимаю, что значит переименовать событие?!
Наверно это, чтобы при событии onLoad никто не принял это событие, а на onLoadMoment приняли подписанные слушатели, но при этом событие onLoadMoment является точной копией onLoad. Если это так, то можно попробовать сделать так:

1. Создать экземпляр Object
2. Применить к нему класс ASBroadcaster;
3. Подписать этот экземпляр на прослушивание события onLoad объекта mc;
4. Подписать какой-либо объект на событие onLoadMoment объекта Object;
5. В обработчике события onLoad этого экземпляра Object, вызвать метод broadcastMessage() с событием onLoadMoment, ну естественно все слушатели, подписанные на данное событие будет его получать.
__________________
Случайность, господа, это знаете ли непознанная необходимость.

Старый 31.07.2008, 13:36
lazutkin вне форума Посмотреть профиль Отправить личное сообщение для lazutkin Найти все сообщения от lazutkin
  № 5  
Ответить с цитированием
lazutkin

Регистрация: Mar 2008
Сообщений: 15
Alex_beginner, спасибо за полезную информацию.
Я использовал ваш способ, работает, но то , что мне нужно.

Мне необходимо , как бы, уничтожить событие "onLoad".
Как вариант - переименовать его ("перезагрузка событий/методов" - мне советовали)
Но мне подойдет любой способ, лишь бы "onLoad" не работал

Старый 31.07.2008, 13:48
Alex_beginner вне форума Посмотреть профиль Отправить личное сообщение для Alex_beginner Найти все сообщения от Alex_beginner
  № 6  
Ответить с цитированием
Alex_beginner
 
Аватар для Alex_beginner

Регистрация: May 2008
Сообщений: 476
Само событие уничтожить нельзя, а вот обработчик переопределить (удалить) пустым обработчиком можно. Просто у события не будет слушателей и обработчиков.

Перегрузка событий/методов это немного другое...Перегрузка (не перезагрузка) событий/методов в базовых языках представляется как наличие множества методов с одинаковыми именами, но разлиной сигнатурой (параметры метода). Увы в АС2, насколько мне известно, отсутствует такая возможность в том виде в котором она представлена в базовых языках, но имеется альтернативный алгоритм с использованием объекта arguments.

Кстати вопрос: о каком компоненте идет речь? Возможно, мне удастся переопределить (удалить - delete) его обработчик события пустым обработчиком, что визуально выразиться как отсутствие события.
__________________
Случайность, господа, это знаете ли непознанная необходимость.


Последний раз редактировалось Alex_beginner; 31.07.2008 в 13:52.
Старый 31.07.2008, 13:49
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 7  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Код:
/**
* ...
* @author wvxvw
*/

class NoOnLoad extends MovieClip
{
	public function NoOnLoad() 
	{
		super();
		this.watch("onLoad", onLoadWatcher);
	}
	private function onLoadWatcher(prop:String, nVal:Function, oVal:Function):Function
	{
		return onLoadOverride;
	}
	private function onLoadOverride():Void
	{
		trace("Do not override!");
	}
}
Компонент в любом случае наследуется от MovieClip, так что удалить это событие невозможно, но можно его "вотчить" и не давать переопределить. Как вариант в "смотящей" функции можно выкинуть ошибку, или тихо "забить" на пользовательский инпут.
__________________
Hell is the possibility of sanity

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

Регистрация: May 2008
Сообщений: 476
wvxvw! Приятный код. Но тем не менее событие не уничтожается, обработчик скрыто координирует действия, но вот с переопределением интересный финт.
__________________
Случайность, господа, это знаете ли непознанная необходимость.

Старый 31.07.2008, 14:58
lazutkin вне форума Посмотреть профиль Отправить личное сообщение для lazutkin Найти все сообщения от lazutkin
  № 9  
Ответить с цитированием
lazutkin

Регистрация: Mar 2008
Сообщений: 15
Эхх!!! Спасибо, вам!!!
Требуемый результат достигнут.

Да, эта цель не имеет смысла, но, к сожалению, не всегда можно выбрать самому, чем заниматься

Старый 31.07.2008, 15:04
wvxvw вне форума Посмотреть профиль Отправить личное сообщение для wvxvw Найти все сообщения от wvxvw
  № 10  
Ответить с цитированием
wvxvw
Modus ponens
 
Аватар для wvxvw

модератор форума
Регистрация: Jul 2006
Адрес: #1=(list #1#)
Сообщений: 8,049
Записей в блоге: 38
Просто, я так понимаю, в компоненте уже задан обработчик onLoad, а если пользователь случайно его переопределит, то компонент не будет работать. Если чесно, я бы скорее отказался от использования onLoad для инициализации, чем делать такие непонятные пользователю вещи =) ну, или уж как-нибудь добавлял вызов пользовательской функции после "родной" инициализации. Т.е. при попытке пользователем переопределить onLoad записывал бы ссылку на пользовательскую функцию в переменную класса, и вызывал бы ее в конце "родного" онлоад:
Код:
/**
* ...
* @author wvxvw
*/
import mx.utils.Delegate;

class NoOnLoad extends MovieClip
{
	private var onLoadDelegate:Function;
	
	public function NoOnLoad() 
	{
		super();
		this.onLoad = Delegate.create(this, realOnLoad);
		this.watch("onLoad", onLoadWatcher);
	}
	private function onLoadWatcher(prop:String, oVal:Function, nVal:Function):Function
	{
		onLoadDelegate = nVal;
		return Delegate.create(this, realOnLoad);
	}
	private function realOnLoad():Void
	{
		// doing our predefined stuff:
		trace("Do not override!");
		// calling custom function:
		if (onLoadDelegate)
		{
			onLoadDelegate.apply(this, arguments);
		}
	}
}
Код:
import mx.utils.Delegate;

var thisScopeVar:String = "thisScopeVar";
function onLoadOverride():Void
{
	trace("Test Delegate "+this.thisScopeVar);
}
test.onLoad = Delegate.create(this, onLoadOverride);
/*
test.onLoad = function():Void
{
	trace("custom action");
}
*/
__________________
Hell is the possibility of sanity


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

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

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


 


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


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