Форум 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? (http://www.flasher.ru/forum/showthread.php?t=87156)

etc 30.10.2006 21:48

Класс XML не посылает событий, он только вызывает свой метод onLoad…
И мы его перенаправляем в наш класс. В AS3 это не требуется.

enepx 30.10.2006 22:11

Я пишу на AS2. А как сделать, чтобы я мог после обработки моего xml вызывать метод getName(), как в моем 10-м сообщении?
Конечно можно сделать цикл, который будет бесконечно крутиться, пока loaded не станет true или сделать задержку по таймеру (на то время примерно как загрузится xml), но тут один вариант глупее второго.

wvxvw 30.10.2006 22:59

ну дык варианты уже написали выше... То, что напмсал __etc пожалуй что более корректно, но нужно знать, как работает Delegate (очевидно =)
Вобщем, суть работы заключается в том, что он делает функцию одного класса так же функцией другого класса.
Но в общем виде можно просто задать классу функцию и никак ее не определять в самом классе. А определить уже в ходе работы с элементом класса.
Пример:
Код:

class Xloader extends XML{
        var onLoad = function () {
        };
        var load = function () {
        };
        function Xloader() {
        }
}

Теперь можно переопределить все нужные функции вот так:
Код:

var _xl:Xloader = new Xloader();
_xl.onLoad = XML.prototype.onLoad;
_xl.load = XML.prototype.load;
_xl.onLoad = function(ok:Boolean){
        if(ok){
        trace(this);
        }
}
_xl.load("xmldata/description.xml");

Если поведение метода не планирутся изменять на протяжении работы флешки, то можно его задать и в самом классе:
Код:

class Xloader extends XML{
        var onLoad = function () {
        };
        var load = function () {
        };
        var xTrace = function(){
                trace("!!!");
        }
        function Xloader() {
                this.onLoad = XML.prototype.onLoad;
                this.load = XML.prototype.load;
        }
}

Использование:
Код:

var _xl:Xloader = new Xloader();
_xl.onLoad = function(ok:Boolean){
        if(ok){
        this.xTrace();
        trace(this);
        }
}
_xl.load("xmldata/description.xml");


etc 31.10.2006 00:26

enepx, то, что тебе нужно, не получиться, ввиду асинхронности.
Нужно использовал событийную модель.
Например, у меня есть класс AbstractXML и я работаю с ним так:
Код:


var my_xml:AbstractXML = new AbstractXML('menu.xml');
my_xml.addEventListener('onXMLLoad',this);
my_xml.addEventListener('onXMLLoadError',this);

}
private function onXMLLoad(event:Object):Void {
…дальнейшие действия…
}
private function onXMLLoadError(event:Object):Void {
…действия при ошибке загрузки…
}


Sneg 31.10.2006 01:07

Лучше грузить данные в специальном классе который, для этого предназначен. Т.е. существует класс к примеру XMLLoader который может загружать в себя пачку XML из конфигурационного XML такого вида:
Код:

<settings>
<messages src="c:/messages.xml"/>
<figures src="d:/games/figures.xml">
</settings>

Забивает их в массив и после загрузки получать их можно методом
Код:

getXMLByName(name:String):XML;
Тогда гораздо проще будет отслеживать загрузки и правильнее будет инициализировать твои девайсы, таким образом:
Код:

var mobilePhone:Device = new Device(_xmlLoader.getXMLByName("device1"));
var deviceName:String = mobilePhone.getName();

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

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

p.s.2 _etc меня опередил :)

etc 31.10.2006 01:32

Sneg, а твой getXMLByName что, сразу выдаст весь контент? А загружать его он когда будет?

з.Ы. Ты на полчаса опоздал :D

Sneg 31.10.2006 01:47

Нет, это такой класс который на вход принимает:
Код:

init(url:String):Void;
// Или
init(xml:XML):Void;

Где url это путь к файлу вида:
Код:

<settings>
<xml1 src="c:/xml1.xml"/>
<xml2 src="c:/xml2.xml"/>
...............................
<!--  сколько угодно -->
</settings>

Или xml это сам это файл. Всем кто подписался на события (слушатели должны имплементировать IXMLLoaderListener) рассылает события"
Код:


onXMLLoaderStartLoad(event:EventObject):Void;
onXMLLoaderProgressLoad(event:EventObject,current:Number,total:Number):Void;
onXMLLoaderLoad(event:EventObject):Void;

Правда, приходится всегда слушателем имплементировать этот интерфейс, да и вообще вместо
Код:

addListener(eventListener:IXMLLoaderListener):Boolean;
лучше бы делал как ты
Код:

addEventListener(listener:Object):Boolean;
Хотя, в принципе уже так привык все делать.

etc 31.10.2006 02:00

И нафига всем слушателям реализововать методы интерфейса, который к этим слушателям вообще толком не относится? А если тебе понадобиться реализовать в объекте другой интерфейс? А он у тебя уже реализует интерфейс XMLLoader… В общем, не суть важно, но твое решение, на мой взгляд, кривовато…

Sneg 31.10.2006 02:11

Объект может имплементировать несколько интерфейсов, через запятую: так что в этом не вижу проблемы. И как понять "вообще толком" не относится? Если он подписывается на события - он обязан слушать, вот пусть и слушает :)

Sneg 31.10.2006 02:15

Другое дело что, в основном слушателям в принципе плевать на всякие там onXMLLoaderProgress() им важно событие onXMLLoaderLoad(). В этом случае конечно приходится создавать пустые методы...


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

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