PDA

Просмотр полной версии : Заставить onLoad быть onLoadMoment


lazutkin
30.07.2008, 20:26
Здравствуйте, всем!

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

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

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

Alex_beginner
31.07.2008, 10:42
lazutkin! Просьба разъяснить более подробно задачу либо проблему, а то не ясно чего Вы хотите.

lazutkin
31.07.2008, 12:07
Есть компонент, пользователь кидает его на сцену, называет его "mc".
Дальше пишет "mc.onLoad = fun...", и конечно же событие вызывается.

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

Alex_beginner
31.07.2008, 12:58
Есть компонент, пользователь кидает его на сцену, называет его "mc".
Дальше пишет "mc.onLoad = fun...", и конечно же событие вызывается.

Моя задача сделать так, что бы это событие не вызывалось, не срабатывало.

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

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

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

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

lazutkin
31.07.2008, 13:36
Alex_beginner, спасибо за полезную информацию.
Я использовал ваш способ, работает, но то , что мне нужно.

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

Alex_beginner
31.07.2008, 13:48
Само событие уничтожить нельзя, а вот обработчик переопределить (удалить) пустым обработчиком можно. Просто у события не будет слушателей и обработчиков.

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

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

wvxvw
31.07.2008, 13:49
/**
* ...
* @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, так что удалить это событие невозможно, но можно его "вотчить" и не давать переопределить. Как вариант в "смотящей" функции можно выкинуть ошибку, или тихо "забить" на пользовательский инпут.

Alex_beginner
31.07.2008, 14:36
wvxvw! Приятный код. Но тем не менее событие не уничтожается, обработчик скрыто координирует действия, но вот с переопределением интересный финт.

lazutkin
31.07.2008, 14:58
Эхх!!! Спасибо, вам!!!
Требуемый результат достигнут.

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

wvxvw
31.07.2008, 15:04
Просто, я так понимаю, в компоненте уже задан обработчик 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");
}
*/

chingachgoog
31.07.2008, 16:03
Эхх!!! Спасибо, вам!!!
Требуемый результат достигнут.


Уверены?
А напишет пользователь код на компоненте (в стиле флеш-5)?

onClipEvent(load){
trace("over")
}