ひがやすを技術ブログ

電通国際情報サービスのプログラマ

Lesson1

そもそもどうやってmxmlの中でクラスを呼び出すのか?実体化するのか?コンストラクタへ引数をわたすのか?このあたりが不明。

MXMLからActionScriptのクラスを利用する方法ですね。それでは、早速Lesson1。
まず、ActionScriptのクラスを作成しましょう。クラスは、WEB-INF/flex/user_classes以下に作成します。user_classesでなくても、MXMLからの相対位置に置いてもいいのですが、クラスは、複数のMXMLやクラスから利用されることを考えて、相手の位置に依存いないuser_classesに作成することをお勧めします。
今回は、パッケージlesson1にクラスを作成するので、user_classes/lesson1にHello.asを作成します。


import mx.controls.*;

class lesson1.Hello {
var message:String;

function Hello(message:String) {
this.message = message;
}

function greet():Void {
Alert.show(message);
}
}

mx.controls.Alertクラスを利用するためにmx.constrols.*をインポートしています。
AS2(ActionScript2)には、Javaのようなpackage文がなくクラス名の前にパッケージ名を書きます。
classの宣言時にpublicなのかprivateなのか宣言していませんね。AS2ではデフォルトpublicです。classの宣言では、Javaのようにpublic宣言をすることも出来ません。
変数は、varで宣言します。変数名の後に:で型名を指定します。型名を指定しない場合は、Objectになります。コンパイル時に型チェックをしてくれるので、できるだけ型を指定した方がいいでしょう。
クラス名と同じfunctionは、コンストラクタになります。引数を渡すことも出来ます。
次は、このクラスを利用するMXML(HelloApp.mxml)です。Application用のMXMLは直ぐにそれとわかるようにAppをつけることをお勧めします。





ボタンが押されたときにgreet()を呼び出しています。greet()はどこに定義されているのでしょうか。Hello_script.asの中です。functionをMXMLに定義することも出来ますが、ロジックはView(MXML)の定義からは分離したほうがいいでしょう。スクリプトを記述するASは、MXML名_script.asとするのがお勧めです。このスクリプト用のASはMXMLと同じディレクトリにおきます。
それでは、Hello_script.asを見てみましょう。

import lesson1.*;

function greet() {
var hello:Hello = new Hello("こんにちは");
hello.greet();
}

ほとんど、Javaと一緒ですね。コンストラクタへ引数を渡すのも簡単です。
同じASファイルでもクラス用(Hello.as)とスクリプト用(HelloApp._script.as)があるので、間違えないようにしてください。
このままだと、greet()が呼ばれるたびにhelloオブジェクトが作成されています。helloオブジェクトの内容は変わらないので、無駄な処理です。helloオブジェクトの作成は一度しかやらないように次のように書き換えてみましょう。Javaを知っている方なら、このように記述するのではないでしょうか。

import lesson1.*;

var hello:Hello = new Hello("こんにちは");

function greet() {
hello.greet();
}

残念ながらこのコードは、コンパイルが通りません。スクリプトのファイルでは、function外で直接newできないようです。なんでじゃー。
そのため、次のように書き換えます。

import lesson1.*;

var hello:Hello;

function initApp() {
hello = new Hello("こんにちは");
}

function greet() {
hello.greet();
}

initApp()は誰が呼び出すのでしょうか。Applicationの初期化時に呼び出されるようにApplicationのinitializeイベントで次のように呼び出します。

<mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"
initialize="initApp()">
...


質問がある方は、自分のblogに質問を書いて、コメントに質問書いたよって書いていただければ、出来るだけ答えようと思います。