Нулевая ссылка на объект в ScrollPane/endDrag(), когда scrollDrag=true

В моем приложении 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 ответа

Решение

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

HTH, Джордж

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

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

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

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

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

var scrollPane:ScrollPane = new ScrollPane(); 

сказать:

var scrollPane:ScrollPain = new ScrollPain (); 

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

import fl.components.ScrollPane;

сказать:

import com.mysite.ScrollPain;

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

Другие вопросы по тегам