Форум 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)

enepx 30.10.2006 15:16

Как создать событие onLoad?
 
У меня есть класс Device. В нем я гружу данные из xml (с пом. класса XML).
У меня есть поле loaded:Boolean, которое сожержит загружен ли xml документ. НО...
Я конечно могу постоянно проверять пока оно не станет true. Можно ли как-нибудь сделать событие наподобие XML.onLoad, которое бы вызывалось после того как мой xml обработан и загружен.
Может просто приравнять как-нибудь функции XML.onLoad и мою Device.onLoad. Я пока не совсем знаю что говорю и как это сделать.
Спасибо... :confused:

MyXus 30.10.2006 15:29

Код:

...
var o:Device = this;
XML.onLoad = function() {
    o.loaded = true;
    o.onLoad();
};
...
public function onLoad() {
...
}


etc 30.10.2006 15:30

this.xml.onLoad = mx.utils.Delegate.create(this,this.onLoad);

MyXus, внешняя ссылка — это неправильно.

MyXus 30.10.2006 15:46

хочется пофлеймить чуток..
1. а почему так уж неправильно?
2. Тогда уже можно просто XML.onLoad = this.onLoad;

etc 30.10.2006 15:56

1. Потому что объявлять функции внутри метода вредно плюс лишние ссылки. Так делали в AS1.
2. Область видимости будет другой.

MyXus 30.10.2006 16:24

Цитата:

Сообщение от __etc
2. Область видимости будет другой.

Что-то я не догоняю. И так и так область видимости функции Device.onLoad будет в рамках конкретного экземпляра класса. Разве нет?

etc 30.10.2006 16:27

А ты проверь.

enepx 30.10.2006 19:58

Конечно респект, но я не понял как в итоге надо кодить-то? Можно 1-й и 2-й ответы объединить?! Спасибо..
PS. Как вообще работает класс Delegate? Где почитать? В книге по MX-версии такого еще не было.

etc 30.10.2006 19:59

Выбирай :D
Я бы использовал Delegate.

enepx 30.10.2006 21:44

не могу понять
 
Помнишь, ты мне вчера помогал уже. Смотреть тут http://flasher.ru/forum/showthread.php?t=87123
У меня все это же. Так мне теперь писать
this.xml.onLoad = mx.utils.Delegate.create(this,this.onXMLLoad); ???
И у меня в голове не укладыватся, как это будет работать?
Мне вообще нужно как в визуальных средах программирования сделать событие. Объясню подробнее...
У меня мой класс Device обрабатывает xml и забивает поля значениями из этого файла. Также есть методы, напр. getName(), кот. возващает имя девайса.
Например, делаю следущее:
Код:

var mobilePhone:Device = new Device("test.xml");
var deviceName:String = mobilePhone.getName();

Так вот ессно, что он не успевает обработать файл и сразу пишет undefined. Мне нужно, чтобы var deviceName:String = mobilePhone.getName(); вызывалась после зарузки. Типа как я делаю в классе XML (метод onLoad). Не знаю как еще объяснить, прости. Спасибо заранее...

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(). В этом случае конечно приходится создавать пустые методы...

etc 31.10.2006 13:22

Я не пойму, а зачем, собственно, юзать интерфейс, когда твой класс может просто подписаться на необходимые события класса, без реализации всех методов интерфейса? Это бессмысленное использование интерфейсов, которые вообще созданы для того, чтобы общаться с классом, а не для того, чтобы просто прописать необходимые методы.

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

Впрочем, я догадываюсь, почему ты так используешь интерфейс — твой XMLLoader получает ссылку на интерфейс IXMLLoaderListener? А почему нельзя использовать событийную модель и вообще не делать связи внутри класса с внешними?

Sneg 31.10.2006 19:41

Да безусловно может подписаться на событие, если в качестве ссылки на объект слушатель предеавать тип Object и заменить :
Код:

addListener(listener:XMLLoadListener):Boolean;
на
Код:

addEventListener(listener:Object,event:EventObject):Boolean;
Я использую его в больших проектах, где куча всяких слушателей и мне казалось принудительная реализация интерфейсов объектами слушателями, позволит быстрее найти ошибку или недопустить её при проверки компилятором. В последнее время, в относительно небольших проектах становится неудобно тащить за собой такую событийную модель: много классов и интерфейсов. И думаю, что нужно переписать все это с наименьшей привязаностью к другим классам - т.е. так как ты предлагаешь.

enepx 08.11.2006 22:44

Господа, я просто сделал так (влоб, причем давно): каждые 0,1sec проверяю чему равно isLoaded и все! Я думаю, что принцип работы всяких слушателей такой же - они слушают с какой-то частотой и все. Может я и не прав, но у меня все сейчас в норме. Спасибо...


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

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