Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   проблема с добавлением TextField (http://www.flasher.ru/forum/showthread.php?t=141591)

metsys 29.06.2010 16:01

проблема с добавлением TextField
 
Имеется у меня такая проблем : есть какой нибуть *.xml в нём юрл к картинкам и описания к каждой картинке, с отображением картинок проблем нету, а вот с текстом есть. Делаю я следующим образом - после загрузки *.xml
Код AS3:

for (var i:int=0; i<xmlData.children().length(); i++)
                        {
                                photoURL_Array[i]=xmlList[i].attribute("photoURL");
 
                                captionURL_1_Array[i]=xmlList[i].attribute("captionURL_1");
 
                                var t1:TextField=new TextField();
                                t1.htmlText=xmlList[i].attribute("captionText_1");
                                captionText_1_Array[i]=t1;
........
private function showPic(e:Event):void
{
.....
addChild(captionText_1_Array[someVar]);
.....
}

в итоге ругается такой вот фразой при компиляции :
TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать []@e98f741 в flash.display.DisplayObject.
at Gira_Gallery/showPic()

Добавлено через 59 секунд
если не пробовать добавлять текстовое поле - всё работает хорошо и не ругается

leofit 29.06.2010 16:06

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

metsys 29.06.2010 16:17

нет данный индекс массива не пуст - а вот попробовал создавать текстовое поле не в цикле а уже в ф-ции showPic и заносить то текстовое поле в массив - и всё вышло), спасибо

leofit 29.06.2010 16:21

Ёмае, так у Вас функция-листенер вложенная? Переписывайте, у Вас могут серьезные проблемы появиться в коде

metsys 29.06.2010 16:28

а можно для чайника подробнее?

пишу недавно и спросить кроме как в нете больше не у кого, сам код у меня такой, навернякак там много косяков :
Код AS3:

package {
        import caurina.transitions.Tweener;
 
        import flash.display.Loader;
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.ProgressEvent;
        import flash.events.TimerEvent;
        import flash.net.URLLoader;
        import flash.net.URLRequest;
        import flash.text.TextField;
        import flash.utils.Timer;
 
        [SWF(width="794", height="340", frameRate="30", backgroundColor="0xAAAAAA", quality="high")]
        public class Gira_Gallery extends Sprite
        {
                //--XML--
                private var xmlLoader:URLLoader=new URLLoader();
                private var xmlList:XMLList;
                private var xmlData:XML;
 
                //--BOOLEAN--
                private var xmlLoaded_Bool:Boolean=false;
                private var picLoaded_Bool:Boolean=true;
                private var fullCircleTimer_Bool:Boolean=false;
 
                //--ARRAYS--
                private var photoURL_Array:Array=new Array();                                                        //массив содержащий ссылки к фотографиям
                private var photoURLCopy_Array:Array=new Array();
 
                private var captionURL_1_Array:Array=new Array();
                private var captionText_1_Array:Array=new Array();
                private var captionURL_2_Array:Array=new Array();
                private var captionText_2_Array:Array=new Array();
 
                private var captionURLCopy_1_Array:Array=new Array();
                private var captionTextCopy_1_Array:Array=new Array();
                private var captionURLCopy_2_Array:Array=new Array();
                private var captionTextCopy_2_Array:Array=new Array();
 
                private var photoHolder_Array:Array=new Array();
                private var photoLoadedBool_Array:Array=new Array();
 
                private var textField_1_Array:Array=new Array();
                private var textField_2_Array:Array=new Array();
 
                //--TIMER--
                private var timer:Timer=new Timer(10000, 1);
 
                //--OTHER--
                private var picLoader:Loader=new Loader();
                private var someVar:int=0;
                private var num:int=1;
                private var loopCounter:int=0;
 
                //--CHANGING VARIABLES--
                private var alphaDelay:int=5;                        //время выполнения эффекта
                private var caption1_X:int=15;                        //положение текстового поля_1 по оси X
                private var caption1_Y:int=314;                        //положение текстового поля_1 по оси Y
                private var caption2_X:int=479;                        //положение текстового поля_2 по оси X
                private var caption2_Y:int=314;                        //положение текстового поля_2 по оси Y
                private var caption1_Size:int=18;                //рамер шрифта в текстовом поле_1
                private var caption2_Size:int=18;                //рамер шрифта в текстовом поле_2
 
                //--TEXT--
                private var loading_TF:TextField=new TextField();
 
                //загружаем *.xml
                public function Gira_Gallery()
                {
                        xmlLoader.addEventListener(Event.COMPLETE, xmlLoadedFunc);                //когда *.xml загружен вызываем ф-цию xmlLoadedFunc
                        xmlLoader.load(new URLRequest("gallery.xml"));                                        //загружаем *.xml по ссылке которая находится в ""
 
                        loading_TF.x=800;
                        addChild(loading_TF);
                }
 
 
                //когда *.xml загружен - заносим данные из него в соответствующие массивы
                private function xmlLoadedFunc(e:Event):void
                {
                        e.target.removeEventListener(Event.COMPLETE, xmlLoadedFunc);
                        xmlData=new XML(e.target.data);
                        xmlList=xmlData.children();
                        trace("gallery.xml loaded");
 
                        for (var i:int=0; i<xmlData.children().length(); i++)                        //заносим в массивы ссылки из загруженного *.xml
                        {
                                photoURLCopy_Array[i]=xmlList[i].attribute("photoURL");
 
                                captionURLCopy_1_Array[i]=xmlList[i].attribute("captionURL_1");
                                captionTextCopy_1_Array[i]=xmlList[i].attribute("captionText_1");
                                captionURLCopy_2_Array[i]=xmlList[i].attribute("captionURL_2");
                                captionTextCopy_2_Array[i]=xmlList[i].attribute("captionText_2");
                        }
 
                        randomSorting(photoURLCopy_Array, captionURLCopy_1_Array, captionTextCopy_1_Array, captionURLCopy_2_Array, captionTextCopy_2_Array);
                }
 
 
                //рандомно сортируем массив
                private function randomSorting(arr:Array, arr2:Array, arr3:Array, arr4:Array, arr5:Array):void
                {
                        var oldArray:Array;
                        var oldArray2:Array;
                        var oldArray3:Array;
                        var oldArray4:Array;
                        var oldArray5:Array;
                        var i:int;
 
                        oldArray = arr;
                        oldArray2 = arr2;
                        oldArray3 = arr3;
                        oldArray4 = arr4;
                        oldArray5 = arr5;
 
                        while (oldArray.length)
                        {
                                i = int(Math.random() * oldArray.length);
                                photoURL_Array.push(oldArray.splice(i, 1));
                                captionURL_1_Array.push(oldArray2.splice(i, 1));
                                captionText_1_Array.push(oldArray3.splice(i, 1));
                                captionURL_2_Array.push(oldArray4.splice(i, 1));
                                captionText_2_Array.push(oldArray5.splice(i, 1));
                        }
                        photoURLCopy_Array=null;
                        captionURLCopy_1_Array=null;
                        captionTextCopy_1_Array=null;
                        captionURLCopy_2_Array=null;
                        captionTextCopy_2_Array=null;
 
                        loadingGallery();
                }
 
 
                //подгружаем картинки
                private function loadingGallery():void
                {
                        picLoader.load(new URLRequest(photoURL_Array[someVar]));
                        picLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, showPic);
 
                        if (someVar == 0)
                        {
                                picLoader.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, onLoadingProgress);
                        }
                }
 
 
                private function onLoadingProgress(e:ProgressEvent):void
                {
                        var percentage:Number=(e.bytesLoaded/e.bytesTotal)*100;
            loading_TF.text=String(int(percentage))+"%";
                }
 
                //когда картинка загружена - выводим её на экран и запускаем на загрузку следующую
                private function showPic(e:Event):void
                {
                        e.target.removeEventListener(Event.COMPLETE, loadingGallery);                        //убиваем слушатель
                        photoLoadedBool_Array[someVar]=true;
                        photoHolder_Array[someVar]=e.target.content;
                        photoHolder_Array[someVar].alpha=0;
 
                        //показываем первую картинку как только она загрузилась
                        if (someVar==0)
                        {
                                addChild(photoHolder_Array[someVar]);
                                Tweener.addTween(photoHolder_Array[someVar], {alpha:1, time:alphaDelay});
 
                                timer.start();
                                timer.addEventListener(TimerEvent.TIMER_COMPLETE, timerFunc);
                        }
 
                        //удаляем текстовое поле как только первая фотография загужена
                        if (someVar==0 && !photoLoadedBool_Array[photoURL_Array.length-1])
                        {
                                e.target.removeEventListener(ProgressEvent.PROGRESS, onLoadingProgress);
                                removeChild(loading_TF);
                        }
 
                        if(someVar < photoURL_Array.length-1)
            {
                someVar++;
                loadingGallery();
            }
                }
 
 
                private function timerFunc(e:TimerEvent):void
                {
                        e.target.removeEventListener(TimerEvent.TIMER_COMPLETE, timerFunc);
                        if (photoLoadedBool_Array[num])
                        {
                                Tweener.addTween(photoHolder_Array[num-1], {alpha:0, time:alphaDelay, onComplete:function():void {
                                                                                                                                                                                                                                  removeChild(photoHolder_Array[num-1]);
                                                                                                                                                                                                                                      } });
                                addChild(photoHolder_Array[num]);
                                Tweener.addTween(photoHolder_Array[num], {alpha:1, time:alphaDelay, onComplete:function():void {
                                                                                                                                                                                                                              num++;
                                                                                                                                                                                                                              if (num==photoURL_Array.length)
                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                        timer.start();
                                                                                                                                                                                                                                        timer.addEventListener(TimerEvent.TIMER_COMPLETE, runArrayLoop);
                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                if (num!=photoURL_Array.length)
                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                        timer.start();
                                                                                                                                                                                                                                        timer.addEventListener(TimerEvent.TIMER_COMPLETE, timerFunc);
                                                                                                                                                                                                                                }
                                                                                                                                                                                                                          } });
                        }
                        else
                        {
                                timer.start();
                                timer.addEventListener(TimerEvent.TIMER_COMPLETE, timerFunc);
                        }
                }
 
 
                private function runArrayLoop(e:TimerEvent):void
                {
                        e.target.removeEventListener(TimerEvent.TIMER_COMPLETE, runArrayLoop);
                        Tweener.addTween(photoHolder_Array[num-1], {alpha:0, time:alphaDelay, onComplete:function():void {
                                                                                                                                                                                                                          removeChild(photoHolder_Array[num-1]);
                                                                                                                                                                                                                            }  });
                        arrayLoop();
                }
 
                //когда массив из фотографий загружен запускаем проигрыватся его по кругу
                private function arrayLoop():void
                {
                        addChild(photoHolder_Array[loopCounter]);
                        Tweener.addTween(photoHolder_Array[loopCounter], {alpha:1, time:alphaDelay});
 
                        timer.start();
                        timer.addEventListener(TimerEvent.TIMER_COMPLETE, loopTimer);
                }
 
 
                private function loopTimer(e:TimerEvent):void
                {
                        if (loopCounter!=photoURL_Array.length-1)
                        {
                                Tweener.addTween(photoHolder_Array[loopCounter], {alpha:0, time:alphaDelay, onComplete:function():void {
                                                                                                                                                                                                                                                removeChild(photoHolder_Array[loopCounter-1]);
                                                                                                                                                                                                                                          } });
                                loopCounter++;
                                arrayLoop();
                        }
                        else
                        {
                                Tweener.addTween(photoHolder_Array[loopCounter], {alpha:0, time:alphaDelay, onComplete:function():void {
                                                                                                                                                                                                                                                removeChild(photoHolder_Array[photoHolder_Array.length-1]);
                                                                                                                                                                                                                                          } });
                                loopCounter=0;
                                arrayLoop();
                        }
                }
        }
}


leofit 29.06.2010 16:43

Нет, не вложеннная, это Вы так в примере сократили просто, так вроде норм, а вообще можно вместо 10 array сделать 1 object

metsys 29.06.2010 16:51

вот до этого недорос, но если подскажете как - обязательно попробую)

-De- 29.06.2010 17:06

Код AS3:

captionText_1_Array.push(oldArray3.splice(i, 1));

splice возвращает массив. Попробуйте (везде)
Код AS3:

captionText_1_Array.push(oldArray3.splice(i, 1)[0]);



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

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