Aide - Recherche - Membres - Calendrier
Version complète : Problème de champs de texte
Centre de Formation Flash - Forums Adobe Flash > Rich media et intégration > Flex
Combo
Salut.

Je cherche à développer une classe me permettant de faire défiler du texte de droite à gauche dans un champs de texte.

Mon problème est que j'ai une erreur à l'exécution que je ne comprend pas :
CITATION
TypeError: Error #1034: Echec de la contrainte de type : conversion de affichage.texte::ScrollText@63fc281 en mx.core.IUIComponent impossible.
at mx.core::Container/http://www.adobe.com/2006/flex/mx/internal::addingChild()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\Container.as:3301]
at mx.core::Container/addChildAt()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\Container.as:2270]
at mx.core::Container/addChild()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\Container.as:2214]
at TestTextDefilant/TestTextDefilant::init()[S:\=ECOLE&TAF=\Flex\TestTextDefilant\TestTextDefilant.mxml:11]
at TestTextDefilant/___Application1_applicationComplete()[S:\=ECOLE&TAF=\Flex\TestTextDefilant\TestTextDefilant.mxml:2]
at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\UIComponent.as:8323]
at mx.managers::SystemManager/mx.managers:SystemManager::preloader_preloaderDoneHandler()[C:\dev\flex_201_gmc\sdk\frameworks\mx\managers\SystemManager.as:2178]
at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.preloaders::Preloader/mx.preloaders:Preloader::displayClassCompleteHandler()[C:\dev\flex_201_gmc\sdk\frameworks\mx\preloaders\Preloader.as:414]
at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.preloaders::DownloadProgressBar/mx.preloaders:DownloadProgressBar::timerHandler()[C:\dev\flex_201_gmc\sdk\frameworks\mx\preloaders\DownloadProgressBar.as:1446]
at mx.preloaders::DownloadProgressBar/mx.preloaders:DownloadProgressBar::initCompleteHandler()[C:\dev\flex_201_gmc\sdk\frameworks\mx\preloaders\DownloadProgressBar.as:1498]
at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.preloaders::Preloader/mx.preloaders:Preloader::dispatchAppEndEvent()[C:\dev\flex_201_gmc\sdk\frameworks\mx\preloaders\Preloader.as:298]
at mx.preloaders::Preloader/mx.preloaders:Preloader::appCreationCompleteHandler()[C:\dev\flex_201_gmc\sdk\frameworks\mx\preloaders\Preloader.as:422]
at flash.events::EventDispatcher/flash.events:EventDispatcher::dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\UIComponent.as:8323]
at mx.core::UIComponent/set initialized()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\UIComponent.as:1095]
at mx.managers::LayoutManager/mx.managers:LayoutManager::doPhasedInstantiation()[C:\dev\flex_201_gmc\sdk\frameworks\mx\managers\LayoutManager.as:696]
at Function/http://adobe.com/AS3/2006/builtin::apply()
at mx.core::UIComponent/mx.core:UIComponent::callLaterDispatcher2()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\UIComponent.as:7909]
at mx.core::UIComponent/mx.core:UIComponent::callLaterDispatcher()[C:\dev\flex_201_gmc\sdk\frameworks\mx\core\UIComponent.as:7852]


J'ai simplement une classe ScrollText qui étend la classe TextField actuellement et j'ai une fonction dans ma classe principale qui utilise ScrollText en lui affectant du texte et qui cherche à l'afficher à l'écran.

Merci de votre aide.
Tonic
Salut,

sans voir ton code mxml et la classe ScrollText (même simplifiée au maximum), ca va être difficile de t'aider...
Combo
Ok!

classe ScrollText :
CODE
package affichage.texte{
    
    import flash.text.TextField;
    
    public class ScrollText extends TextField{
        
        private var _largeurMax:int = 100;
                
        public function ScrollText(){
            super();
        }
        
        public function set largeurMax(valeur:Number):void{
            _largeurMax = valeur;
        }
    }
}


MXML principal :
CODE
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="init()">
    <mx:Script>
        <![CDATA[
            import flash.display.Sprite;
            import affichage.texte.ScrollText;
            import flash.text.TextField;
            
            private var _scrollText:ScrollText = new ScrollText();
            
            private function init():void{
                addChild(_scrollText);
                _scrollText.text = "ceci est du texte.";
            }
        ]]>
    </mx:Script>
</mx:Application>


De plus, l'utilisation de ma classe ScrollText dans Flash CS3 ne pose pas de problème.
Kakky
je crois que flex ne reconnait pas directement le "textField" sur lequel se base ta classe scrollText.
Il existe une classe UITextField, qui permet de pallier à ca je pense :
CITATION
The UITextField class extends the flash.text.TextField class to support additional functionality required by Flex


donc a mon avis
CODE
import mx.core.UITextField;
    
    public class ScrollText extends UITextField
{..}


ca devrait marcher...
iteratif
Pourquoi ne pas utiliser le composant TextArea en definissant la propriété wordWrap à false...
Combo
Salut Itératif!

Je n'ai pas utilisé le composant TextArea car mon but est de garder la plus grande flexibilité entre Flash et Flex et je souhaite pouvoir utiliser mes classes aussi bien avec ces 2 logiciels.

Malheureusement dans le cas de ma classe ScrollText, je ne peux pas utiliser directement la classe TextField dans Flex alors qu'elle ne pose aucun problème sous Flash.

Voici ma classe ScrollText fonctionnelle :
CODE
package affichage.texte{
    
    import flash.text.TextField;
    import mx.core.UITextField;
    import flash.events.Event;
    import flash.utils.Timer;
    import flash.events.TimerEvent;
    
    public class ScrollText extends UITextField{
        
        private var _largeurMax:int = 100;
        private var _scrollSpeed:int = 1;
        private var _scrollPause:int = 2000;
                
        public function ScrollText(){
            super();
            this.width = _largeurMax;
        }
        
        private function scroll(event:Event):void{
            var largeurText:int = this.textWidth;
            if(largeurText > this._largeurMax){
                this.scrollH += this._scrollSpeed;
                if(this.scrollH >= this.maxScrollH){                    
                    this.stop();
                    var timer:Timer = new Timer(_scrollPause, 1);
                    timer.start();
                    timer.addEventListener(TimerEvent.TIMER_COMPLETE, onScrollComplete);                    
                }
            }
        }
        
        private function onScrollComplete(event:Event):void{
            trace("onScrollComplete");
            this.scrollH = 0;
            this.start();
        }
        
        private function onScrollStart(event:Event):void{
            this.addEventListener(Event.ENTER_FRAME, scroll);
        }
        
        public function start():void{
            trace("start");
            var timer:Timer = new Timer(_scrollPause, 1);
            timer.start();
            timer.addEventListener(TimerEvent.TIMER_COMPLETE, onScrollStart);            
        }
        
        public function stop():void{
            this.removeEventListener(Event.ENTER_FRAME, scroll);
        }
        
        public function set largeurMax(valeur:int):void{
            this._largeurMax = valeur;
        }
        
        public function set scrollSpeed(valeur:int):void{
            this._scrollSpeed = valeur;
        }
        
        public function set scrollPause(valeur:int):void{
            this._scrollPause = valeur;
        }
    }
}


Voici le MXML :
CODE
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" applicationComplete="init()">
    <mx:Script>
        <![CDATA[
            import flash.display.Sprite;
            import affichage.texte.ScrollText;
            import flash.text.TextField;
            
            private var _scrollText:ScrollText = new ScrollText();
            
            private function init():void{
                addChild(_scrollText);
                _scrollText.text = "Ceci est du texte qui défile dans un long champs de texte qui contient beaucoup de caractères!";
                _scrollText.width = 100;
                _scrollText.start();
            }
            
            private function scrollStop():void{
                _scrollText.stop();
            }
            
        ]]>
    </mx:Script>
    <mx:Button x="49" y="109" label="Stopper le texte" click="scrollStop()"/>
</mx:Application>


Ce qui me gêne encore, c'est que je n'ai pas réussi à faire défiler le texte entièrement dans le champs de texte de façon à ce qu'il y ait une impression de dispatition par la gauche et une apparition par la droite.

Une idée pour réaliser cette opération? Merci de votre aide!
Ceci est une version "bas débit" de notre forum. Pour voir la version complète avec plus d'informations, la mise en page et les images, veuillez cliquer ici.
Invision Power Board © 2001-2009 Invision Power Services, Inc.