Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Загрузка данных из внешних файлов. (http://www.flasher.ru/forum/showthread.php?t=102000)

Torero 07.10.2007 03:15

Загрузка данных из внешних файлов.
 
Доброго времени суток.
Есть несколько классов, загружающих информацию(xml, текст, картинки, swf) из внешних файлов. Решил процесс загрузки описать отдельным классом - не получается. Подскажите пжл.как это правильно реализовать:
а)Верна-ли вообще сама идея реализовать загрузчик через отдельный класс?
б)Конструктор не может быть сеттером - как передать данные объекту, вызвавшему класс? через "this"?
в)Как реализовать ожидание окончания загрузки?

Вот мой вариант: (нерабочий)
Код:

package {
import flash.display.Sprite;
        public class SomeClass extends Sprite {
                public function SomeClass(){
                        var myXML:XML = new XML();
                        myXML=XML(new FileLoad("test.xml"));
                        trace("Загрузили:"+myXML); //Загрузили: [object FileLoad], а не "Загрузили: <xx>.....</xx>"
                }
        }

Код:

package {
import flash.display.Loader;
import flash.net.URLRequest;
        public class FileLoad extends Loader {
                public function FileLoad(filepath:String){
                        var urlReq:URLRequest = new URLRequest(filepath);
                        this.load(urlReq);
                }
        }


Nirth 07.10.2007 03:19

1) Да
1.1) Класс flash.display.Loader создан для загрузки визуальной информации(swf, jpg, png). тебе нужно юзать flash.net.URLLoader
2) Дело вкуса, я считаю это лишними 500 миллисекундами затрачеными на ненужный апендикс.
3) через события.

Torero 07.10.2007 03:42

2 Nirth:Спасибо за быстрый ответ.
А)
Цитата:

Сообщение от Nirth
1.1) Класс flash.display.Loader создан для загрузки визуальной информации(swf, jpg, png). тебе нужно юзать flash.net.URLLoader

То есть мне прийдется создать 2 класса: TextLoad и GraphLoad? или можно безболезненно это одним классом реализовать?

Цитата:

Сообщение от Nirth
2) Дело вкуса, я считаю это лишними 500 миллисекундами затрачеными на ненужный апендикс.

не в производительности дело.. объем кода минимизирую и писАть правильно учусь..
Б)
Цитата:

Сообщение от Nirth
3) через события.

Это понятно.. Вопрос в том как? События надо внутри класса-загрузчика прописывать или в том классе из которого этот загрузчик вызывается?

Исправил код загрузчика - все-равно не выдает нужный результат.

Код:

package {
import flash.display.Loader;
import flash.net.URLRequest;
        public class TextLoad extends URLLoader {
                public function TextLoad(filepath:String){
                        var urlReq:URLRequest = new URLRequest(filepath);
                        this.load(urlReq);
                }
        }
}

Код:

...
        myXML=XML(new TextLoad("test.xml"));
        trace("Загрузили: "+myXML);        //Загрузили: [object TextLoad]
...


etc 07.10.2007 10:44

а) Зачем?
б) Конструктор — это функция, которая может иметь параметры;
в) Событиями.

В целом, писать отдельный класс для этого не вижу нужды.

Nirth 07.10.2007 13:50

Цитата:

не в производительности дело.. объем кода минимизирую и писАть правильно учусь..
Я считаю не правильным тратить 500 миллисекунд на ненужный аппендикс.
Тоесть я считаю не правильным писать this
у __etc другое мнение.

Цитата:

Исправил код загрузчика - все-равно не выдает нужный результат.
Ну и что должен быть за результат?

Цитата:

То есть мне прийдется создать 2 класса: TextLoad и GraphLoad? или можно безболезненно это одним классом реализовать?
Зависит от объема кода, если ты собираешься парсить текст, валидировать, проверять че нить там, или выдерать отдельные куски. То писать стоит.

Если просто грузить файлы то URLLoader уже существует, он отлично грузит файлы.

Torero 07.10.2007 14:21

Цитата:

Сообщение от __etc
В целом, писать отдельный класс для этого не вижу нужды.

А разве многократный импорт не есть зло?

Цитата:

Сообщение от Nirth
Ну и что должен быть за результат?

В данном случае - XML из файла, а не [object TextLoad].

etc 07.10.2007 14:31

Многократный импорт? :)))
Директива import лишь указывает компилятору на то, какие области видимости классов нужно создать и все. Перед выполнением кода создается так называемый scope-стек, в котором хранятся все области видимости классов.
И, если уж рассуждать логически, то от отдельного класса станет меньше импортов? Нет, не станет, будет столько же + одна штука.
Выполнять непосредственную загрузку данных-то кто будет? Да все те же встроенные классы.
Идея одного интерфейса хороша, но её уже выполняет URLLoader, который может грузить данные в различных форматах, как в текстовых, так и бинарных. Что делать с полученными данными — решать программисту.

Nirth 07.10.2007 15:04

Цитата:

В данном случае - XML из файла, а не [object TextLoad].
для этого надо переопределить метод toString()...

screamge 07.10.2007 15:15

У меня лоудер вынесен в отдельный класс исключетельно из соображения использования одного прелоудера во всём проекте и грузит он при вызове статичного метода loadmc в который передаётся адрес мувика в который нужно грузить или имя клипа который нужно создать, меторасположение лоудера (_х, _у) или булево значение отвечающее за вывод клипа лоудера по центру созданного/указанного мувика. В принципе удобно.

etc 07.10.2007 15:24

Цитата:

Сообщение от screamge
У меня лоудер вынесен в отдельный класс исключетельно из соображения использования одного прелоудера во всём проекте и грузит он при вызове статичного метода loadmc в который передаётся адрес мувика в который нужно грузить или имя клипа который нужно создать, меторасположение лоудера (_х, _у) или булево значение отвечающее за вывод клипа лоудера по центру созданного/указанного мувика. В принципе удобно.

Дядь, мы в разделе AS3 =)

screamge 07.10.2007 15:30

Разделом ошибиться ладно но код из первого поста посчитать за АС2…:eek:
Извините.:rolleyes:

etc 07.10.2007 15:35

Цитата:

Сообщение от screamge
Разделом ошибиться ладно но код из первого поста посчитать за АС2…:eek:
Извините.:rolleyes:

Я про твой пост, _x, _y всякие.

screamge 07.10.2007 15:39

Код:

package src{
        import flash.display.Sprite;
        import flash.events.*;
        import flash.net.*;
       
        public class XmlFine extends EventDispatcher{
                private static var instance:XmlFine;
                private static var allowInstantiation:Boolean;
               
                private var xml:XML;
                private var loader:URLLoader;
               
                public static function getInstance():XmlFine {
        if (instance == null) {
            allowInstantiation = true;
            instance = new XmlFine();
            allowInstantiation = false;
          }
        return instance;
      }
     
      public function XmlFine ():void {
        if (!allowInstantiation) {
            throw new Error("Error: Instantiation failed: Use XmlFine.getInstance() instead of new.");
          }
      }
               
                public function load (lang:String):void {
                        loader = new URLLoader ();
                        loader.addEventListener (Event.COMPLETE, afterLoad);
                        loader.load (new URLRequest (lang + '_content.xml'));
                }
               
                public function get content ():XML {
                        return xml;
                }
               
                private function afterLoad (e:Event):void {
                        setXML ();
                        dispatcher ();
                }
               
                private function setXML ():void {
                        xml = new XML (loader.data);
                }
               
                private function dispatcher ():void {
                        dispatchEvent(new Event('onLoad'));
                }
               
        }
}

Ну вроде тогда так.

Цитата:

Я про твой пост, _x, _y всякие.
Я превьюс пост не дописал просто, редактировал.

Torero 07.10.2007 16:58

Цитата:

Сообщение от __etc
....URLLoader, который может грузить данные в различных форматах, как в текстовых, так и бинарных. Что делать с полученными данными — решать программисту.

Поясни пожалуйста: Как, используя класс URLLoader, загрузить изображение?

Реализовал сабж следующим образом:
Код:

package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.events.Event
        public class SomeClass extends Sprite {
                public function SomeClass(){
                        loadXML();
                }
                private function loadXML(){
                    var myXML:XML = new XML();
                        tL=new FileLoad("test.xml")
                        tL.addEventListener(Event.COMPLETE, xmlLoaded);
                        function xmlLoaded(e:Event){
                                myXML=XML(tL.data);
                                loadText()
                        }
                }
                private function loadText():void{
                        var tF:TextField=new TextField();
                        tL=new FileLoad("ru.txt")
                        tL.addEventListener(Event.COMPLETE, textLoaded);
                        addChild(tF);
                        function textLoaded(e:Event){
                                tF.htmlText=tL.data;
                                loadGraph();
                        }
                }
                private function loadGraph():void{
                        var pic:Sprite=new Sprite();
                        tL=new FileLoad("1.jpg")
                        tL.addEventListener(Event.COMPLETE, graphLoaded);
                        addChild(pic);
                        function graphLoaded(e:Event){
                                pic=tL.data;
                        }
                }
        }
}

Код:

package {
import flash.net.URLRequest;
import flash.net.URLLoader;
        public class FileLoad extends URLLoader {
                public function FileLoad(filepath:String){
                        var urlReq:URLRequest = new URLRequest(filepath);
                        this.load(urlReq);
                }
        }
}

1.XML и *.txt грузятся корректно. При попытке загрузить изображение, получаю: "Type Coercion failed: cannot convert "яШяа to flash.display.Sprite"
2.Нужно-ли использовать "removeEventListener", если листнер добавляется внутри private-функции?
3.
Цитата:

Сообщение от Nirth
для этого надо переопределить метод toString()...

А как мне это должно было помочь?

etc 07.10.2007 17:01

Загрузить в бинарном режиме, потом отдать на растерзание Loader-у.

з.Ы. Никогда не пиши функции в методах, просто никогда.

DarkLight 07.10.2007 17:02

Полученные бинарные данные изображения надо использовать через loadBytes

Torero 07.10.2007 17:05

Цитата:

Сообщение от __etc
Никогда не пиши функции в методах, просто никогда.

В сотый раз уже слышу.. Ответьте, наконец, кто-нибудь: что в этом такого ужасного?
----
В данном случае, например, не приходится заморачиваться с областью видимости.

DarkLight 07.10.2007 17:07

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

etc 07.10.2007 17:11

Цитата:

Сообщение от Torero
В данном случае, например, не приходится заморачиваться с областью видимости.

В данном случае ты вообще лишаешься области видимости.

BlooDHounD 08.10.2007 14:54

+ функции могут удалить из памяти мусорщиком.


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

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