Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Заставить onLoad быть onLoadMoment (http://www.flasher.ru/forum/showthread.php?t=114498)

lazutkin 30.07.2008 20:26

Заставить onLoad быть onLoadMoment
 
Здравствуйте, всем!

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

Есть компонент,если на таймлайне написать 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

Цитата:

Сообщение от lazutkin (Сообщение 755544)
Эхх!!! Спасибо, вам!!!
Требуемый результат достигнут.

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

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



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

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