![]() |
|
||||||||||
|
|||||
|
Регистрация: Mar 2008
Сообщений: 15
|
Здравствуйте, всем!
Есть задача, смысл её, мягко сказать, тупой, но нужно сделать. Есть компонент,если на таймлайне написать mc.onLoad, событие не должно срабатывать. Я знаю о существовании перезагрузки событий/методов, но пример не смог найти. Помогите, пожалуйста, решить эту проблему ![]() |
|
|||||
|
Регистрация: May 2008
Сообщений: 476
|
lazutkin! Просьба разъяснить более подробно задачу либо проблему, а то не ясно чего Вы хотите.
__________________
Случайность, господа, это знаете ли непознанная необходимость. |
|
|||||
|
Регистрация: Mar 2008
Сообщений: 15
|
Есть компонент, пользователь кидает его на сцену, называет его "mc".
Дальше пишет "mc.onLoad = fun...", и конечно же событие вызывается. Моя задача сделать так, что бы это событие не вызывалось, не срабатывало. Есть решение - переименовать это событие, например, в "onLoadMoment" ![]() Пожалуйста, подскажите, как я могу переименовать это стандартное событие? |
|
|||||
|
Регистрация: May 2008
Сообщений: 476
|
Цитата:
Цитата:
Наверно это, чтобы при событии onLoad никто не принял это событие, а на onLoadMoment приняли подписанные слушатели, но при этом событие onLoadMoment является точной копией onLoad. Если это так, то можно попробовать сделать так: 1. Создать экземпляр Object 2. Применить к нему класс ASBroadcaster; 3. Подписать этот экземпляр на прослушивание события onLoad объекта mc; 4. Подписать какой-либо объект на событие onLoadMoment объекта Object; 5. В обработчике события onLoad этого экземпляра Object, вызвать метод broadcastMessage() с событием onLoadMoment, ну естественно все слушатели, подписанные на данное событие будет его получать.
__________________
Случайность, господа, это знаете ли непознанная необходимость. |
|
|||||
|
Регистрация: Mar 2008
Сообщений: 15
|
Alex_beginner, спасибо за полезную информацию.
Я использовал ваш способ, работает, но то , что мне нужно. Мне необходимо , как бы, уничтожить событие "onLoad". Как вариант - переименовать его ("перезагрузка событий/методов" - мне советовали) Но мне подойдет любой способ, лишь бы "onLoad" не работал ![]() |
|
|||||
|
Регистрация: May 2008
Сообщений: 476
|
Само событие уничтожить нельзя, а вот обработчик переопределить (удалить) пустым обработчиком можно. Просто у события не будет слушателей и обработчиков.
Перегрузка событий/методов это немного другое...Перегрузка (не перезагрузка) событий/методов в базовых языках представляется как наличие множества методов с одинаковыми именами, но разлиной сигнатурой (параметры метода). Увы в АС2, насколько мне известно, отсутствует такая возможность в том виде в котором она представлена в базовых языках, но имеется альтернативный алгоритм с использованием объекта arguments. Кстати вопрос: о каком компоненте идет речь? Возможно, мне удастся переопределить (удалить - delete) его обработчик события пустым обработчиком, что визуально выразиться как отсутствие события.
__________________
Случайность, господа, это знаете ли непознанная необходимость. Последний раз редактировалось Alex_beginner; 31.07.2008 в 13:52. |
|
|||||
|
Modus ponens
|
/**
* ...
* @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!");
}
}
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: May 2008
Сообщений: 476
|
wvxvw! Приятный код. Но тем не менее событие не уничтожается, обработчик скрыто координирует действия, но вот с переопределением интересный финт.
__________________
Случайность, господа, это знаете ли непознанная необходимость. |
|
|||||
|
Регистрация: Mar 2008
Сообщений: 15
|
Эхх!!! Спасибо, вам!!!
Требуемый результат достигнут. Да, эта цель не имеет смысла, но, к сожалению, не всегда можно выбрать самому, чем заниматься ![]() |
|
|||||
|
Modus ponens
|
Просто, я так понимаю, в компоненте уже задан обработчик 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);
}
}
}
__________________
Hell is the possibility of sanity Последний раз редактировалось wvxvw; 31.07.2008 в 15:07. |
![]() |
![]() |
Часовой пояс GMT +4, время: 10:00. |
|
|
« Предыдущая тема | Следующая тема » |
|
|