2009-01-23 153 views
1

我無法從我的動作中控制滾動窗格的滾動(我使用ActionScript 3.0)滾動窗格設置滾動位置

這裏是我的定義:

var scrollPane:ScrollPane = new ScrollPane(); 
scrollPane.verticalScrollPolicy = "false"; 
scrollPane.move(374, 0); 
scrollPane.setSize(476, 370); 

當我嘗試設置它 - scrollPane.horizo​​ntalScrollPosition = 500;我收到以下錯誤

TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at fl.containers::ScrollPane/setScrollDrag() 
    at fl.containers::ScrollPane/draw() 
    at fl.core::UIComponent/drawNow() 
    at fl.containers::BaseScrollPane/set horizontalScrollPosition() 
    at Program() 
    at Preloader/main() 
    at Preloader/enterFrameHandler() 

即使scrollPane.horizo​​ntalScrollPosition = scrollPane.horizo​​ntalScrollPosition;拋出相同的錯誤。

但是trace(scrollPane.horizo​​ntalScrollPosition);工作得很好。

我也嘗試過hPosition,它根本不起作用。任何線索,我怎樣才能控制滾動位置將不勝感激。

下面是整個代碼

package { 
    import flash.display.*; 
    import flash.events.*; 
    import flash.filters.*; 
    import fl.transitions.Tween; 
    import fl.transitions.easing.*; 
    import fl.containers.ScrollPane; 


    public class Program extends Sprite { 
     public function Program() { 
      //define variable 
      var startX:Number; 
      var startY:Number; 
      var counter:Number = 0; 
      const LIMIT:Number = 100; 
      var intMessages:Number = 80; 
      var intBoardSize:Number = 476*(Math.round(intMessages/15)+1); 
      var intMessageMinX:Number = 35; 
      var intMessageMaxX:Number = intBoardSize-99; 
      var intMessageMinY:Number = 35; 
      var intMessageMaxY:Number = 310; 
      var activeGloveName:String = "" 
      var intDegreeHigh:Number = 45; 
      var intDegreeLow:Number = -45; 

      //create objects 
      var mcglove:mcGlove = new mcGlove(); 
      var mcglovetarget:mcGloveTarget = new mcGloveTarget(); 
      var myDropShadowFilterSmall = new DropShadowFilter (2,45,0x000000,0.65,3,3,2,3,false,false,false); 
      var myDropShadowFilterDown = new DropShadowFilter (3,45,0x000000,0.65,5,5,2,3,false,false,false); 
      var myDropShadowFilterUp = new DropShadowFilter (5,45,0x000000,0.65,7,7,2,3,false,false,false); 
      var topShadow = new DropShadowFilter (3,90,0x000000,0.35,8,8,2,3,false,false,false); 
      var holder:MovieClip = new MovieClip(); 
      var pinkline:Sprite = new Sprite(); 
      var searchBox:Sprite = new Sprite(); 
      var topShadowBox:Sprite = new Sprite(); 
      var aMessages:Array = new Array(); 


      //Create a glove for each message 
      for (var x = 0; x < intMessages; x++){ 
       aMessages[x] = new mcGlove(); 
       aMessages[x].scaleX = .28; 
       aMessages[x].scaleY = .28; 
       counter = 0; 
       position(aMessages[x]); 
       aMessages[x].rotation = (0, 0, 0, Math.round(Math.random() * (intDegreeHigh - intDegreeLow)) + intDegreeLow); 
       aMessages[x].filters = [myDropShadowFilterSmall]; 
       holder.addChild(aMessages[x]); 
       aMessages[x].name = "glove" + x; 
       aMessages[x].addEventListener(MouseEvent.MOUSE_DOWN, selectMessage); 
       aMessages[x].addEventListener(MouseEvent.MOUSE_UP, releaseMessage); 
       aMessages[x].buttonMode = true; 
      } 

      var scrollPane:ScrollPane = new ScrollPane(); 
      scrollPane.verticalScrollPolicy = "false"; 
      scrollPane.move(374, 0); 
      scrollPane.setSize(476, 370); 
      scrollPane.horizontalLineScrollSize = 120; 


      topShadowBox.graphics.beginFill(0x333333); 
      topShadowBox.graphics.drawRect(0,0,870,5); 
      topShadowBox.x = -10; 
      topShadowBox.y = -5; 
      topShadowBox.filters = [topShadow]; 

      pinkline.graphics.beginFill(0xDB9195); 
      pinkline.graphics.drawRect(0,0,476,2); 
      pinkline.x = 374; 
      pinkline.y = 353; 

      searchBox.graphics.beginFill(0xDB9195); 
      searchBox.graphics.drawRect(0,0,476,25); 
      searchBox.x = 374; 
      searchBox.y = 370; 

      //add to frame 
      sortObjects(); 

      scrollPane.source = holder; 

      scrollPane.horizontalScrollPosition = 5; 

      //create instance names for referancing/compairing objects 
      mcglove.name = "mcglove"; 
      mcglovetarget.name = "mcglovetarget"; 

      //position the glove and modify apperiance 
      mcglove.x = 163; 
      mcglove.y = 211; 
      mcglove.filters = [myDropShadowFilterDown]; 
      mcglovetarget.x = 615; 
      mcglovetarget.y = 211; 
      mcglovetarget.alpha = 0 

      //action listeners 
      mcglove.addEventListener(MouseEvent.MOUSE_DOWN, selectGlove); 
      mcglove.addEventListener(MouseEvent.MOUSE_UP, releaseGlove); 

      function position(target) { 
       target.x = Math.round(Math.random() * (intMessageMaxX - intMessageMinX)) + intMessageMinX; 
       target.y = Math.round(Math.random() * (intMessageMaxY - intMessageMinY)) + intMessageMinY; 
       for (var i:uint=0; i<aMessages.length -1 ; i++) { 
        if(target.hitTestObject(aMessages[i]) && counter < LIMIT){ 
         counter++; 
         position(target); 
         return false; 
        }; 
       } 
      } 

      function selectGlove(event:MouseEvent):void { 
       event.target.startDrag(true); 
       var myTargetName:String = event.target.name + "target"; 
       var myTarget:DisplayObject = getChildByName(myTargetName); 
       mcglove.filters = [myDropShadowFilterUp]; 
       addChild(myTarget); 
       event.target.parent.addChild(event.target); 
       addChild(topShadowBox); 
       myTarget.alpha = .5; 
       startX = event.target.x; 
       startY = event.target.y; 
      } 

      function releaseGlove(event:MouseEvent):void { 
       event.target.stopDrag(); 
       var myTargetName:String = event.target.name + "target"; 
       var myTarget:DisplayObject = getChildByName(myTargetName); 
       event.target.filters = [myDropShadowFilterDown]; 
       myTarget.alpha = 0; 

       if (event.target.dropTarget != null && event.target.dropTarget.parent == myTarget){ 
        event.target.removeEventListener(MouseEvent.MOUSE_DOWN, selectGlove); 
        event.target.removeEventListener(MouseEvent.MOUSE_UP, releaseGlove); 
        event.target.x = myTarget.x; 
        event.target.y = myTarget.y; 
        var myTween:Tween = new Tween(getChildByName(event.target.name), "scaleX",Strong.easeOut,getChildByName(event.target.name).scaleX,.28,2,true); 
        var myTween2:Tween = new Tween(getChildByName(event.target.name), "scaleY",Strong.easeOut,getChildByName(event.target.name).scaleY,.28,2,true); 
        holder.addChild(getChildByName(event.target.name)); 
        scrollPane.source = holder; 
        holder.getChildByName(event.target.name).x=Math.round(Math.random() * (470+Math.round(scrollPane.horizontalScrollPosition) - Math.round(scrollPane.horizontalScrollPosition))) + Math.round(scrollPane.horizontalScrollPosition); 
        holder.getChildByName(event.target.name).y=Math.round(Math.random() * (intMessageMaxY - intMessageMinY)) + intMessageMinY; 
        holder.getChildByName(event.target.name).addEventListener(MouseEvent.MOUSE_DOWN, selectMessage); 
        holder.getChildByName(event.target.name).addEventListener(MouseEvent.MOUSE_UP, releaseMessage); 
       } else { 
        event.target.x = startX; 
        event.target.y = startY; 
       } 

       //sortObjects(); 
       addChild(scrollPane); 
       addChild(pinkline); 
       addChild(topShadowBox); 
      } 

      function selectMessage(event:MouseEvent):void{ 
       if (activeGloveName != ""){ 
        var activeGlove:DisplayObject = holder.getChildByName(activeGloveName); 
        activeGlove.filters = [myDropShadowFilterSmall]; 
        activeGlove.scaleX = .28; 
        activeGlove.scaleY = .28; 


       holder.addChild(activeGlove); 
       } 
       activeGloveName = event.target.name; 
       //event.target.dragIt(); 
       holder.addChild(holder.getChildByName(event.target.name)); 
       event.target.filters = [new GlowFilter(0xABEEFC, .65, 15, 15, 1, 1, false, false)]; 
       event.target.scaleX = .35; 
       event.target.scaleY = .35; 
      } 

      function releaseMessage(event:MouseEvent):void{ 
       event.target.dropIt(); 
      } 

      function sortObjects():void{ 
       addChild(mcglovetarget); 
       addChild(scrollPane); 
       addChild(pinkline); 
       addChild(searchBox); 
       addChild(mcglove); 
       addChild(topShadowBox); 
      } 

      mcglove.buttonMode = true; 

     } 
    } 
} 

回答

1

如果你看一下錯誤跟蹤,如果你看看here錯誤是發生的

 
fl.containers::ScrollPane/setScrollDrag(). 

裏面你會發現,scrollDrag ...

獲取或設置一個值,該值指示是否當用戶拖動滾動窗格中的內容時發生滾動。

你從來不把內容到滾動窗格

scrollPane.source = "...";

我相信這就是爲什麼錯誤的現象發生,儘量把一些內容放到滾動窗格您設置horizo​​ntalScrollPosition的面前。

+0

我發佈了上面的完整代碼。我確實有我剛纔沒有顯示的內容。你可能仍然是對的,雖然如果內容沒有在那個電話之前填充......我會更多地考慮,但我不認爲它是這個問題。謝謝! – Patcouch22 2009-01-23 17:35:42

1

horizo​​ntalScrollPosition的是滾動窗格的特性,所以你將通過

scrollPane.horizo​​ntalScrollPosition = 500設置它;

而不是方法調用。

+0

好了,好了範圍縮小...謝謝,我看看你現在是怎麼做到的。 – Patcouch22 2009-01-23 17:37:02

0

您應該首先將ScrollPane添加到stage。如果scrollPane.stage == null你會有這樣的錯誤。

2

我有同樣的問題,並找出造成它的原因。至少在我的情況下,問題在於這個scrollpane還不是舞臺上的一個孩子。

這會導致錯誤您所描述:

sp.verticalScrollPosition = 0;  
this.addChild(sp) 

雖然這工作得很好:

this.addChild(sp) 
sp.verticalScrollPosition = 0; 

希望它能幫助:)