Kaczala 0 Denunciar post Postado Abril 20, 2011 Buenas galera! Seguinte, tô com um problema e não consigo achar uma solução lógica pra ele, não sei se alguém poderia me ajudar. Tenho que mostrar uma lista vinda de um XML na tela, e estou usando uma classe de scrollbar pronta pra isso. O conteúdo é carregado corretamente, porém a rolagem não funciona e aponta o seguinte erro: TypeError: Error #1009: Cannot access a property or method of a null object reference. at Scrollbar/startScroll() at Scrollbar/moveScroll() Código da Scrollbar: /** * Flashscaper Scrollbar Component * Customizable Scrollbar * @author Li Jiansheng * @version 1.0.0 * @private * @website http://www.flashscaper */ package { import caurina.transitions.*; import flash.display.*; import flash.events.*; import flash.geom.*; public class Scrollbar extends MovieClip { private var target:MovieClip; private var top:Number; private var bottom:Number; private var dragBot:Number; private var range:Number; private var ratio:Number; private var sPos:Number; private var sRect:Rectangle; private var ctrl:Number;//This is to adapt to the target's position private var trans:String; private var timing:Number; private var isUp:Boolean; private var isDown:Boolean; private var isArrow:Boolean; private var arrowMove:Number; private var upArrowHt:Number; private var downArrowHt:Number; private var sBuffer:Number; public function Scrollbar():void { scroller.addEventListener(MouseEvent.MOUSE_DOWN, dragScroll); stage.addEventListener(MouseEvent.MOUSE_UP, stopScroll); stage.addEventListener(MouseEvent.MOUSE_WHEEL,mouseWheelHandler); } // public function init(t:MovieClip, tr:String,tt:Number,sa:Boolean,b:Number):void { target = t; trans = tr; timing = tt; isArrow = sa; sBuffer = b; if (target.height <= track.height) { this.visible = false; } // upArrowHt = upArrow.height; downArrowHt = downArrow.height; if (isArrow) { top = scroller.y; dragBot = (scroller.y + track.height) - scroller.height; bottom = track.height - (scroller.height/sBuffer); } else { top = scroller.y; dragBot = (scroller.y + track.height) - scroller.height; bottom = track.height - (scroller.height/sBuffer); upArrowHt = 0; downArrowHt = 0; removeChild(upArrow); removeChild(downArrow); } range = bottom - top; sRect = new Rectangle(0,top,0,dragBot); ctrl = target.y; //set Mask isUp = false; isDown = false; arrowMove = 10; if (isArrow) { upArrow.addEventListener(Event.ENTER_FRAME, upArrowHandler); upArrow.addEventListener(MouseEvent.MOUSE_DOWN, upScroll); upArrow.addEventListener(MouseEvent.MOUSE_UP, stopScroll); // downArrow.addEventListener(Event.ENTER_FRAME, downArrowHandler); downArrow.addEventListener(MouseEvent.MOUSE_DOWN, downScroll); downArrow.addEventListener(MouseEvent.MOUSE_UP, stopScroll); } var square:Sprite = new Sprite(); square.graphics.beginFill(0xFF0000); square.graphics.drawRect(target.x, target.y, target.width+5, (track.height+upArrowHt+downArrowHt)); parent.addChild(square); target.mask = square; } public function upScroll(event:MouseEvent):void { isUp = true; } public function downScroll(event:MouseEvent):void { isDown = true; } public function upArrowHandler(event:Event):void { if (isUp) { if (scroller.y > top) { scroller.y-=arrowMove; if (scroller.y < top) { scroller.y = top; } startScroll(); } } } // public function downArrowHandler(event:Event):void { if (isDown) { if (scroller.y < dragBot) { scroller.y+=arrowMove; if (scroller.y > dragBot) { scroller.y = dragBot; } startScroll(); } } } // public function dragScroll(event:MouseEvent):void { scroller.startDrag(false, sRect); stage.addEventListener(MouseEvent.MOUSE_MOVE, moveScroll); } // public function mouseWheelHandler(event:MouseEvent):void { if (event.delta < 0) { if (scroller.y < dragBot) { scroller.y-=(event.delta*2); if (scroller.y > dragBot) { scroller.y = dragBot; } startScroll(); } } else { if (scroller.y > top) { scroller.y-=(event.delta*2); if (scroller.y < top) { scroller.y = top; } startScroll(); } } } // public function stopScroll(event:MouseEvent):void { isUp = false; isDown = false; scroller.stopDrag(); stage.removeEventListener(MouseEvent.MOUSE_MOVE, moveScroll); } // public function moveScroll(event:MouseEvent):void { startScroll(); } public function startScroll():void { ratio = (target.height - range)/range; sPos = (scroller.y * ratio)-ctrl; Tweener.addTween(target, {y:-sPos, time:timing, transition:trans}); } } } Código de carregamento do XML: package { import flash.display.MovieClip; import flash.text.TextField; import flash.net.URLRequest; import flash.net.URLLoader; import flash.events.Event; public class CarregaXml extends MovieClip { private var endTxt:URLRequest; private var loadTxt:URLLoader; private var meuXml:XML; public function CarregaXml():void { endTxt = new URLRequest("xml/agenda.xml") loadTxt = new URLLoader(endTxt); loadTxt.addEventListener(Event.COMPLETE, carregaTxt); } public function carregaTxt(e:Event):void{ meuXml = XML(loadTxt.data); txt_mc.campoTexto.text = meuXml; var saidaTexto:String = ""; var registros:uint = meuXml.id.length(); for (var cont:int = 0; cont < registros; cont++){ saidaTexto += meuXml.id[cont].dia+" "; saidaTexto += meuXml.id[cont].titulo+"\n\n"; } txt_mc.campoTexto.text = saidaTexto; loadTxt.addEventListener(Event.COMPLETE, mostraXml); } public function mostraXml(e:Event):void { txt_mc.campoTexto.text = e.target.data; txt_mc.campoTexto.autoSize = "left"; sb.init(txt_mc.campoTexto, "easeOutBack", 2, true, 1.5); } } } Certamente pelo erro eu estou chamando algo no tempo errado, mas pq o erro faz referência ao startScroll() e moveScroll()?? Agradeço respostas. Valews, Angelito Compartilhar este post Link para o post Compartilhar em outros sites
Elektra 102 Denunciar post Postado Abril 21, 2011 Tenho esse arquivo funcionando com um txt externo, vou dar uma olhada no uso com XML. Melhor que algum colega mais experiente possa dar um toque, estou aprendendo o uso de classes. EDITADO >> para teste do arquivo Usei sua classe para carregar o XML. Criei a pasta 'xml' e renomeei um dos meus arquivos como 'agenda.xml'. Fiz o Embedding (uso o CS5). Talvez meu XML não seja adequado, mas... Resultado: não carregou nada e ao clicar sobre o 'scroller' o movie clip é deslocado de forma inadequada, fora da área de rolagem, e exibe em output o mesmo erro que você mencionou. Então, testar sem carregar fica difícil. Vou dar uma conferida em outros exemplos que tenho de scroll com XML, mas não são com uso de classes. Abraços Compartilhar este post Link para o post Compartilhar em outros sites
Kaczala 0 Denunciar post Postado Abril 25, 2011 Pois é Elektra, também funciona corretamente pra mim se for puxado de TXTs, mas XML... Pra mim as informações do XML estão carregando sem problema, mas o erro, bem como a rolagem que sai da posição, também ocorrem. Valeu pelo esforço pra ajudar, mesmo assim! Abs.. Compartilhar este post Link para o post Compartilhar em outros sites
Elektra 102 Denunciar post Postado Abril 25, 2011 Estou aprendendo AS3 e tenho outros exemplos de scroll com XML, vamos ver se consigo converter para uma classe ou encontro algum template. Vou revirar o meu backup, isso também me interessa muito. Abraços Compartilhar este post Link para o post Compartilhar em outros sites
Irineu Antunes 2 Denunciar post Postado Maio 28, 2011 provavelmente umas das variaveis dentro do método startScroll() não foi inicializada (está como null) Compartilhar este post Link para o post Compartilhar em outros sites