Я представляю, что происходит то, что как только основной класс вашего SWF здесь (выше) создается (прямо при инициализации), событие ENTER_FRAME связывает прослушиватель события с кнопкой, но кнопка технически не существует.Ваша методология инициализации здесь очень плохая практика, но позвольте мне объяснить, как все это работает.
Каждый раз, когда у вас есть класс, который расширяет тип DisplayObject, вы ВСЕГДА должны создавать модифицированный конструктор, предназначенный для обнаружения элемента "stage", и, если он не существует, прослушивать событие ADDED_TO_STAGE,а затем выполнить инициализацию на основе экранного объекта в обратном вызове.Это связано с тем, что классы, основанные на отображаемых объектах, создаются наполовину.Конструктор вызывается сразу же, когда класс создается / создается, но свойства и методы этого класса, включая дочерние элементы, которые являются экранными объектами (как в этом случае кнопки и т. Д.), Недоступны до тех пор, пока класс не будет добавлен в глобальную ".stage "object.
В случае AIR ваш объект NativeWindow содержит единственный экземпляр" stage ", который наследуют все дочерние элементы этого NativeWindow.Поэтому, когда вы добавляете MovieClip или Sprite и т. Д. На сцену, свойство «stage» этого экранного объекта заполняется ссылкой на глобальный объект stage, содержащийся в NativeWindow.Поэтому всегда помните, что когда дело доходит до флэш, практика работы с конструкторами / инициализацией экранных объектов заключается в том, чтобы отложить все функциональные возможности до обратного вызова, который обрабатывается только тогда, когда глобальная «сцена» становится доступной для ссылки.Ниже приведен пример использования вашего кода:
public class Main extends MovieClip {
public function Main():void
{
if(stage){
init();
}else{
this.addEventListener(Event.ADDED_TO_STAGE, init);
}
}
//Can be private or public, doesn't matter private is better practice
private function init(e:Event = null)
{
//Notice the function paramter has a default value assigned of null. This is required so we can call this function without args as in the constructor
//Also the flag variable is not necessary because this function is called once
btnDialogCreate.addEventListener(MouseEvent.CLICK,CreateProject);
}
//Also it is generally considered bad practice to put capitals on the start of your function/variable names. Generally only classes are named this way ie: Main.
public function createProject(e:MouseEvent){
//You do not need a try/catch statement for simply opening a file browser dialogue. This is a native method you're invoking with a native, predefined default directories inside the VM. Flash is already doing this for you
var directory:File=File.documentsDirectory;
directory.browseForDirectory("Directory of project");
}
}
И, наконец, я настоятельно рекомендую посмотреть некоторые бесплатные видеоуроки на этом сайте, так как здесь представлен широкий спектр предметов, которые многому научат вас во флеш-памяти.
http://gotoandlearn.com/