0

I am trying to port my pure-Actionscript Flash project to Flex Builder.

I have created a new project and it opens with an mxml file like this :

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
        ]]>
    </fx:Script>
</s:Application>

Now, I am trying to copy over my Flash's document class inside this mxml file but to no avail.

If I add inside fx:Script the following code:

        addChild(new TradeShow());

I get this:

1180: Call to a possibly undefined method addChild.

OK, so there is no implicit DisplayObjectContainer for mxml. Let's try to define one (always inside fx:Script):

        public class TradeShow extends Sprite {}

Here is another contradicting error :

1131: Classes must not be nested.

I have already lost several hours and ashamed myself several times. Can someone please shade some light here?

4

5 に答える 5

2

新しいプロジェクトを作成し、このような mxml ファイルで開きます

Flash Builder で Flex プロジェクトを作成したようです。Flex Framework を使用するために Flash Pro ActionScript プロジェクトを移植する場合を除き、Flash Builder で ActionScript プロジェクトを作成することを強くお勧めします。

それがあなたの問題のほとんどを解決すると思います。


Flex とその仕組みに関する情報を追加するために編集中です。

fx:Script 内に次のコードを追加すると:

    addChild(new TradeShow());

私はこれを得る:

1180: Call to a possibly undefined method addChild.

なぜそのエラーが発生するのかよくわかりません。ただし、fx:Script ブロック内のコードは、メソッド、インポート ステートメント、または変数定義内にある必要があります。これは、作成する「通常の」クラスとそれほど違いはありません。MXML ファイルをクラスと考えてください。定義が違うだけ。MXML は、Flex コンパイラによって内部で ActionScript に生成されます。MXML は、ActionScript コード生成言語と見なす必要があります。

わかりました。mxml の暗黙的な DisplayObjectContainer はありません。

そうではありません。Applicationクラスは、すべての Flex ビジュアル クラスと同様に、UIComponent を拡張します。つまり、DisplayObjectContainer を拡張します。したがって、Application クラスは DisplayObjectContainer です。上記のエラーの理由は、コードの場所にあると思われます。

Let's try to define one (always inside fx:Script):

        public class TradeShow extends Sprite {}

Here is another contradicting error :

    1131: Classes must not be nested.

私の考えでは、これは矛盾していません。アプリケーションはクラスです。そして、その中に新しいものを定義しようとしています。これは ActionScript のみのクラスでは機能せず、MXML クラス内では機能しません。

本当に Flex を使用したい場合は、Flex コンポーネントのライフサイクルを読む必要があります。ここにMX コンポーネントのライフサイクルがあり、ここにSpark コンポーネントのライフサイクルに関する情報があります。

于 2012-06-05T17:09:40.293 に答える
2

Flash Builder 内で Flash Professional プロジェクトを作成し、Flash Builder インターフェイスを使用してコードをビルドし、Flash Builder と Flash Professional を介して swf をコンパイルすることもできます。

これは、アセットなどを含む FLA ファイルを含むプロジェクトを開発するための優れた方法です。

于 2012-06-05T18:39:31.623 に答える
1

ええ... Flexは少し違います。私はクラスファイルを台無しにしないので(そうすべきだと思っていたとしても)、それについてコメントすることはできませんが、addChildを機能させるには、次のようにします:

<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
           xmlns:s="library://ns.adobe.com/flex/spark" 
           xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="init()">
<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<fx:Script>
    <![CDATA[

    private function init():void
    {
        this.addChild(new TradeShow());
    }

    ]]>
</fx:Script>
</s:Application>

メイン アプリケーション タグと「init()」関数に「creationComple」ハンドラーを追加しました。

于 2012-06-05T17:09:23.710 に答える
0

純粋な actionscript プロジェクトをフレックス プロジェクトとして再作成しないでください。何らかの理由でフレックス コンポーネントが必要でない限り、AS3 プロジェクト オプションを使用する必要があります。flashbuilder への移植の背後にある意図は何ですか?

于 2012-06-05T19:24:43.723 に答える
0

これが私がそれを解決した方法です:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="1300" minHeight="700" applicationComplete="init()">
    <fx:Declarations>
        <!-- Place non-visual elements (e.g., services, value objects) here -->
    </fx:Declarations>

    <fx:Script>
        <![CDATA[
            private function init():void
            {   
                var show:TradeShowOrig = new TradeShowOrig();
                this.stage.addChild(show);
                show.init();
            }
        ]]>
    </fx:Script>

</s:Application>

Flex の「ドキュメント」クラス mxml は TradeShow.mxml と呼ばれていたことに注意してください。私のメイン クラスも同様にTradeShow.asと呼ばれていました。これは、明白なコンパイラエラーなしで物事が非常にひどく混乱したため、克服できない問題をもたらしました. ドキュメント クラスの名前を TradeShowOrig.as に変更する必要がありましたが、すべての問題が突然解消されました。

于 2012-06-07T19:15:19.357 に答える