2012-06-18 3 views
1

Когда я пытаюсь запустить следующий MXML файл, используя FlexBuilder, я получаю сообщение об ошибкеПочему мой класс не признан?

1046: Тип не найден или не является константой времени компиляции: AlertDataObject.

Этот код из файла main.mxml

<?xml version="1.0" encoding="utf-8"?> 
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" 
layout="vertical" 
horizontalAlign="center" 
verticalAlign="middle" 
xmlns:components="components.*" 
xmlns:ConferenceRequestForm="components.core.ConferenceRequestForm.*" 
xmlns:ConferenceHomeScreen="components.core.ConferenceHomeScreen.*" 
xmlns:ConferenceLoginForm="components.core.ConferenceLoginForm.*" 
xmlns:debug="components.debug.*" 
xmlns:RandomUserMaker="components.debug.RandomUserMaker.*" 
xmlns:RandomConferenceMaker="components.debug.RandomConferenceMaker.*" 
initialize="initializeApplication();" 
creationComplete="openConferenceHomeScreen();"> 

<mx:Script> 
    <![CDATA[ 

     import flash.events.MouseEvent; 

     public function debugButtonHandler(event:MouseEvent):void{ 

     userCredentials.logIn('admin', 'admin', "John", "Admin", 7, 99,0) 

     openReportsForm(); 

     } 

    ]]> 
</mx:Script> 


<mx:Button label="Debug Button" id="debugButton_btn" click="debugButtonHandler(event);" enabled="true" visible="false"/> 

<RandomConferenceMaker:RandomConferenceMaker id="rcm" visible="false"/> 
<RandomUserMaker:RandomUserMaker id="rum" visible="false"/> 

<mx:Script source="../classes/ConferenceApp_action.as"/> 

</mx:Application> 

Это вершина ConferenceApp_action.as файл, который содержит большую часть логики приложения, в том числе по импорту к классу, который определение класса, который не работает AlertDataObject.

//Built-In Classes 
import mx.managers.PopUpManager; 

//events 
import mx.events.CloseEvent; 

//custom events 
import classes.AlertDataObject; 

Это линия в ConferenceApp_action.as файл, который создает ошибку.

private function showChoiceWindow(data:AlertDataObject):void{ 
    . 
    . 
    . 
} 

Это класс AlertDataObject.

package classes 
{ 

public class AlertDataObject 
{ 

    /**************** 
    Constants 
    ****************/ 
    static public var TITLE_ALERT:String = "Alert"; 
    static public var TITLE_CONFIRM:String = "Please Confirm"; 
    static public var TITLE_DEBUG:String = "Debug"; 

    static public var TITLE_SUCCESS:String = "Success"; 
    static public var TITLE_FAILURE:String = "Failure"; 
    static public var TITLE_ERROR:String = "Error"; 

    /**************** 
    Properties 
    ****************/ 
    private var __title:String; 
    private var __text:String; 

      . 
      . 

    /**************** 
    Getters/Setters 
    ****************/ 
    public function get title():String{ 

     return __title; 

    } 

      . 
      . 
      . 

    /**************** 
    Constructor 
    ****************/ 
    public function AlertDataObject($text:String, $title:String="Alert", $yesFunction:Function=null, $yesFunctionArguments:Object=null, $noFunction:Function=null, $noFunctionArguments:Object=null, $dataProvider:Object=null, $icon:Class=null){ 

     //store basic props 
     __title = $title; 
     __text = $text; 

     //store confirm props 
     __yesFunction = $yesFunction; 
     __yesFunctionArguments = $yesFunctionArguments; 
     __noFunction = $noFunction; 
     __noFunctionArguments = $noFunctionArguments; 

     //store dataProvider object 
     __dataProvider = $dataProvider; 

     //store misc. props 
     __icon = $icon; 

    } 

} 

}

Почему Flex не видит класс AlertDataObject правильно?

ответ

1

Я предполагаю, что вы импортируете файл ConferenceApp_action.as, что каталог классов, который содержит класс AlertDataObject, хранится в корневой директории вашего проекта. Если это так, попробуйте переместить папку классов в каталог src, в котором был создан файл main.mxml. По умолчанию это основная исходная папка для настройки проектов с помощью Flex Builder и место, где компилятор ищет пользовательские классы.

Обратите внимание, что вы можете изменить исходную папку по умолчанию или указать дополнительную исходную папку в параметрах пути построения flex в диалоговом окне свойств проекта, но в вашем случае я не думаю, что вам нужно сделать что-либо из этого.

+0

Браво, вот и все. Спасибо за этот указатель. – jamesTheProgrammer

+0

Отлично! Рад, что это помогло. –

-1

Нигде в коде, который вы предоставили, вы фактически создаете экземпляр класса AlertDataObject. Из-за этого компилятор не компилирует его, и вы не видите его во время выполнения. Еще одна вещь, которая может вызвать проблемы, - это использование правил кодирования PHP при работе с actionscript. Я не думаю, что я когда-либо пытался запускать свои имена переменных с помощью «$», но, по крайней мере, это противоречит всем хорошим практикам действий, и в лучшем случае это может привести к возникновению странных проблем времени выполнения, которые вы испытываете ,

+1

Неправильное использование. Возможно, он не создал экземпляр объекта этого класса, но этот класс является частью сигнатуры метода. Таким образом, класс будет включен в его приложение swf. Обратите внимание, что ошибка, которую он получает, является ошибкой времени компиляции, а не во время выполнения, как он, кажется, намекает. Наконец, я согласен с вашим комментарием о $, но я могу проверить, что это не проблема. У меня были коллеги, делающие то же самое :) –

1

Я бы охотно поспорил, что у вас есть синтаксическая ошибка в файле ConferenceApp_Action.as или в файле main.mxml, который не позволяет полностью компилировать файлы. По сути, вы делаете «включить», а не используете правильный класс, и при этом вы не получите очень хорошие сообщения об ошибках. Возможно, потому, что команда Flex забыла, что они оставили дверь открытой для людей, чтобы сделать это (что не является большой практикой).

IMO, вам повезло, что у вас есть какие-либо ошибки компиляции. Я однажды унаследовал проект, который использовал эти типы включений, где разработчик забыл добавить некоторые из файлов в управление версиями. Я не получил сообщение об ошибке - он просто не смог скомпилировать.

Мой совет - использовать по крайней мере достойный ООП типа, который имел в виду команда Flex (другими словами, соответствующие файлы класса), и получить полный вес компилятора, который поможет вам. В противном случае попробуйте переместить свой тег скрипта, который указывает на ваш.как файл над другим тегом скрипта. Или даже убедитесь, что все ваши операторы импорта находятся в одном блоке сценария.

FWIW Я считаю, что в недрах Flex Framework есть несколько переменных, начиная с «$», а смысл этого префикса - «это оригинальные переменные/методы, определенные Flash Player, которые мы нажимаем на фон и перезапись с помощью нашей собственной версии ». Я не думаю, что это ваше намерение, глядя на ваш код, но если нет ничего плохого в том, чтобы оставить ваши переменные названными таким образом.

Смежные вопросы