нулевая ссылка на объект в ScrollPane / endDrag (), когда scrollDrag = true - PullRequest
2 голосов
/ 10 марта 2010

В моем приложении 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);
    }

Этап var - единственное, что может быть здесь нулевым.

Единственное, что я могу думать, это установить scrollDrag = false до того, как окно в моем приложении закроется, чтобы ничто не прослушивало событие. Любые другие предложения?

Ответы [ 4 ]

3 голосов
/ 15 января 2013

На тот случай, если кто-то все еще ищет решение, для меня сработало подкласс класса 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);
        }
    }
}

}

Полный кредит на dawsonk более на форумах FlashKit для этого. Ссылка на тему FlashKit.

3 голосов
/ 20 марта 2010

Я попытался воссоздать ваш сценарий, поэтому у меня был фиктивный клип для загрузки ScrollPane, и ScrollPane содержит MovieClip со связью (Экспорт для 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, чтобы проверить наличие нулевого объекта в качестве быстрого исправления, и не забудьте сохранить ScrollPane.as относительно файла .fla или в вашем classpath перед повторной компиляцией.

НТН, George

2 голосов
/ 10 сентября 2012

У меня та же проблема при использовании scrollpane с scrollDrag = true. Мое решение для моей проблемы состоит в том, чтобы установить scrollDrag = false, каждый раз, когда я удаляю область прокрутки из отображения (при смене кадра и т. Д.)

Надеюсь, это поможет ...

0 голосов
/ 17 августа 2014

Решение localhost работает для меня, так что спасибо. Однако я несколько часов бился головой о стену, пока не понял, что забыл изменить все ссылки на код на класс ScrollPane, чтобы вместо этого ссылаться на класс ScrollPain.

Вот пример: я все еще получал ошибку, даже после изменения класса моего компонента ScrollPane в моей библиотеке. Затем я понял, что в классах, которые создают экземпляр ScrollPane, мне нужно было изменить экземпляр с

var scrollPane:ScrollPane = new ScrollPane(); 

сказать:

var scrollPane:ScrollPain = new ScrollPain (); 

Кроме того, мне нужно было изменить мой оператор импорта с

import fl.components.ScrollPane;

сказать:

import com.mysite.ScrollPain;

Я понимаю, что это ошибка новичка. :)

...