当scrollDrag = true时,ScrollPane / endDrag()中的null对象引用

时间:2010-03-09 23:15:16

标签: flash actionscript-3 scrollpane flash-v3-components

在我的Flash应用程序中,我有多个使用Scrollpanes的窗口。 scrollDrag属性在这些上设置为true,因为我想要该功能。如果我关闭(在我的应用程序中)其中一个'窗口'并打开另一个,我似乎在我的日志中显示了很多这个错误:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at fl.containers::ScrollPane/endDrag()

有时我会收到成千上万的这些,我猜这可能会减慢我的应用程序,但其他方面并没有造成问题。通过adobe代码查看scrollpane,endDrag非常简单:

protected function endDrag(event:MouseEvent):void {
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, doDrag);
    }

stage var是唯一可以为null的东西。

我唯一能想到的就是在我的应用程序中的窗口关闭之前设置scrollDrag = false,以便没有任何东西正在侦听事件。还有其他建议吗?

4 个答案:

答案 0 :(得分:3)

我试图重新创建你的场景,所以我有一个由ScrollPane加载的虚拟剪辑,并且 ScrollPane包含带有链接的MovieClip(Export for Actionscript),因此我可以创建多个实例。同样在该剪辑中,ScrollPane组件上方的一个层我放置了一个关闭按钮。

我的第一个问题是调试fla并查看它首先失败的位置。我没有做任何事情,因为我不断得到这个:

Cannot display source code at this location.

然后我按照你的指示,找到了endDrag()函数。我改成了这个:

protected function endDrag(event:MouseEvent):void {
            if(stage) stage.removeEventListener(MouseEvent.MOUSE_MOVE, doDrag);
        }

试了一下。它没有第一次工作,好像它没有编译。我尝试在Flash IDE中编辑该类,我看到了这个小故障的全部内容。这就是我的意思:

ScrollPane edit

所以我将ScrollPane.as从Flash CS4文件夹复制到./fl/containers/ScrollPane(基本上相对于.fla)。此.as文件已编译,错误消失。

短版是:是的!你发现问题点:)添加一个if来检查null对象作为quickfix并且不要忘记在再次编译之前相对于.fla文件或类路径保存ScrollPane.as。

HTH, 乔治

答案 1 :(得分:3)

万一有人还在寻找解决方案,对我来说有用的是继承ScollPane类并覆盖endDrag函数

package {
import fl.containers.*;
import flash.events.*;
public class ScrollPain extends ScrollPane {
    protected override function endDrag(event:MouseEvent):void {
        if (stage) {
            stage.removeEventListener(MouseEvent.MOUSE_MOVE, doDrag);
        }
    }
}

}

在FlashKit论坛上完全归功于 dawsonk FlashKit thread link.

答案 2 :(得分:2)

使用scrollpane和scrollDrag = true时遇到同样的问题。 我的问题的解决方案是设置scrollDrag = false,每次我从显示中删除滚动窗格(更改框架等时)。

希望它有所帮助...

答案 3 :(得分:0)

localhost的解决方案对我有用,谢谢。然而,我把头撞到墙上几个小时,直到我意识到我忘记将我对ScrollPane类的所有代码引用更改为引用ScrollPain类。

这是一个例子:即使在我的库中更改了ScrollPane组件的类之后,我仍然收到错误。然后我意识到,在实例化ScrollPane的类中,我需要从

更改实例化
var scrollPane:ScrollPane = new ScrollPane(); 

说:

var scrollPane:ScrollPain = new ScrollPain (); 

另外,我需要从

更改我的import语句
import fl.components.ScrollPane;

说:

import com.mysite.ScrollPain;

我意识到这是一个初学者的错误。 :)