はじめに
このチュートリアルでは、Macromedia Flexを利用して簡単な電卓アプリケーションを開発します。ここで作成する電卓アプリケーションは、足し算、引き算、掛け算、割り算だけの機能を搭載する簡単なものですが、このアプリケーションを作成することで、Flexアプリケーションを開発するための主要パーツの使い方が習得できます。
なお、このチュートリアルはMacromediaカスタマートレーニンググループに所属する、Robert Crooksが執筆した4部構成のチュートリアルのパート2です。
本チュートリアルの内容
Application
タグの使い方Panel
コンテナの使い方Label
コントロールの使い方Button
コントロールの使い方Grid
コンテナの使い方- MXMLファイルとともに使用する
ActionScript
コントローラークラスの作り方 ActionScript
クラスの作り方ActionScript
クラスにプロパティやメソッドを追加する方法- MXMLアプリケーションから
ActionScript
クラスをインスタンス化する方法と、メソッドの呼び出し方
この記事に必要なもの
このチュートリアルをフォローするには、つぎに挙げるソフトウェアやファイルをインストールする必要があります。
Macromedia Flex
Flexのトライアル版に関する詳細については、Flex FAQを参照してください。また、トライアル版の入手方法については、こちらを参照してください。
テキストエディタ
Flex Builder、もしくはDreamweaver MX 2004、あるいはXMLとActionScriptのコードが記述できるコードエディタ(Notepadのような簡単なテキストエディタでも可)が必要です。なおFlex BuilderはFlexサーバーとともにダウンロードできます。また、Dreamweaver MX 2004のトライアル版の入手方法については、こちらを参照してください。
このチュートリアルのためのソリューションファイル
calculator.zip(ZIPファイル)には、このチュートリアルで作成するcalculator.mxmlとCalculatorHandlers.asの完成版のソースコードが収録されています。
この記事のために必要な予備知識
- 「Flexの概要の紹介」を読み終えていること
- Flexアプリケーションのブラウズ方法を把握していること
- 「Flex基礎講座(パート1):はじめてのFlexアプリケーション開発」を読み終えているか、Flexアプリケーションの仕組みに関する基礎知識があること
電卓アプリケーションの作成
このアプリケーションには2つのパーツがあり、MXMLで作成するビューと、ActionScriptのクラスとして作成するイベントハンドラの集合から構成されています。ビューには、電卓のディスプレイ部分やボタンといった視覚的な要素が含まれ、一方のハンドラのクラスには、ユーザーの操作を管理するために必要な変数を保持するためのデータが含まれています。またハンドラクラスには、ユーザーによるボタンクリックなどのイベントを処理するためのメソッドも含まれています。
電卓アプリケーションを構築することによって、つぎに挙げるパーツの使用法が習得できます。
Application
クラスPanel
コンテナLabel
要素Grid
コンテナButton
要素- 次の項目を含む
ActionScript
クラス- クラスの定義
- プロパティ
- メソッド
if-else
とswitch-case
を利用した制御構造
Applicationオブジェクトの作成
Flexアプリケーションのコードは、XMLの宣言とApplication
ブロックから始まります。Application
タグの中には、つぎに示すMX
クラスライブラリの名前空間宣言を記述します。
xmlns:mx="http://www.macromedia.com/2003/mxml"
なお接頭辞のmx
はこのライブラリのすべてのタグに対して使用します。
- 新規ファイルを作成し、ファイルを「flex_tutorials」ディレクトリに「calculator.mxml」として保存します。
- ファイルの最初に、つぎのXML宣言を追加します。
- XML宣言のつぎに、MXML名前空間の指定の入った
Application
タグを追加します。
<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml"> </mx:Application>
電卓の表示要素を配置するためのPanelの追加
Flexアプリケーションの中で表示するテキストやコントロール、画像、各種メディアなどといった視覚要素は、通常、これらの入れ物となる「コンテナ」の中に配置します。ここでは、Panel
という種類のコンテナを使用することにします。Panel
コンテナは、多くのアプリケーションの視覚要素全体を囲む場面で利用されます。また、ここではPanel
コンテナのtitle
属性も指定します。title
属性に設定した値は、パネル上部に自動的に含まれるタイトルバーに表示されます。
Application
ブロックの中にPanel
ブロックを追加し、title
属性の値を「Calculator」とします。
<mx:Panel title="Calculator"> </mx:Panel>
電卓の数値表示部分の追加
単行のテキストを表示する際には、Label
要素を使用します。Label
要素には数々のプロパティがありますが、ここではつぎに挙げるプロパティだけを使用します。
id
:イベントハンドラがこのインスタンスを参照するための固有の識別子width
:label
の幅をピクセル値で指定text
:表示するテキストtextAlign
:テキストの横方向の位置指定:「left
」/「right
」/「center
」
Panel
ブロックの中にLabel
要素を追加し、属性をつぎのように設定します。
<mx:Label id="calcDisplay" width="150" textAlign="right" />
text
属性が含まれていませんが、これはcontroller
クラスのハンドラメソッドを利用して数値表示部分を制御するからです。この機能は後ほど作成します。ボタンをレイアウトするためのGridの追加
電卓のボタンをレイアウトするには、レイアウト用コンテナのGrid
を使用します。Grid
コンテナはHTMLのテーブルに似て、GridRow
とGridItem
の2つのコンテナをネストすることによって情報を縦、横方向に配置します。またGridItem
コンテナには、colSpan
とrowSpan
プロパティがあり、これらはHTMLの<td>
のプロパティ同様に機能します。ではGrid
を利用して電卓のボタンをレイアウトしてみましょう。図1のスクリーンショットにあるように、ボタンは縦5段に配置し、一番上と下の段には3つのボタン、それ以外の段には4つのボタンをそれぞれ配置します。
Panel
の中のLabel
要素の後にGrid
コンテナのブロックを追加します。Grid
コンテナのブロックの中にGridRow
コンテナのブロックを5つ挿入します。- 1つ目の
GridRow
コンテナの中にGridItem
コンテナを3つ追加し、1つ目のGridItem
コンテナのcolSpan
を「2」に設定します。 - 2つ目、3つ目、4つ目の
GridRow
コンテナの中に、それぞれ4つずつGridItem
コンテナを追加します。 - 5つ目の
GridRow
コンテナの中にGridItem
コンテナを3つ追加し、3つ目のGridItem
コンテナのcolSpan
を「2」に設定します。
<mx:Grid> </mx:Grid>
<mx:GridRow></mx:GridRow> <mx:GridRow></mx:GridRow> <mx:GridRow></mx:GridRow> <mx:GridRow></mx:GridRow> <mx:GridRow></mx:GridRow>
<mx:GridItem colSpan="2"></mx:GridItem> <mx:GridItem></mx:GridItem> <mx:GridItem></mx:GridItem>
<mx:GridItem></mx:GridItem> <mx:GridItem></mx:GridItem> <mx:GridItem></mx:GridItem> <mx:GridItem></mx:GridItem>
<mx:GridItem></mx:GridItem> <mx:GridItem></mx:GridItem> <mx:GridItem colSpan="2"></mx:GridItem>
電卓のボタンの追加
FlexのButton
コントロールはHTMLやその他の言語のものと同じように使用できます。ここでは、つぎに挙げる3つのプロパティを各ボタンに設定します。
label
:ボタン上に表示するテキストの指定width
:ボタンの幅をピクセル値で指定click
:ユーザーがボタンをクリックした際に実行するハンドラ名の指定
電卓アプリケーションの各ボタンは、つぎの構文で記述します。
<mx:Button label="[ラベル名]" width="[数値]"
click="[ハンドラメソッド名]"/>
CalculatorHandlers
クラスの一部として作成します。- 先程作成した18個の
GridItem
コンテナの中に、それぞれButton
要素を1つずつ追加します。なお、各ボタンにはGridItem
コンテナの配置順に、つぎに示すプロパティをそれぞれ設定します。- 1段目
- 2段目
- 3段目
- 4段目
- 5段目
width="70" label="Clear" click="calcHandlers.clearAll()" width="30" label="C/E" click="calcHandlers.clearEntry()" width="30" label="+" click="calcHandlers.setOperation('add')"
width="30" label="1" click="calcHandlers.addNumber('1')" width="30" label="2" click="calcHandlers.addNumber('2')" width="30" label="3" click="calcHandlers.addNumber('3')" width="30" label="-" click="calcHandlers.setOperation('subtract')"
width="30" label="4" click="calcHandlers.addNumber('4')" width="30" label="5" click="calcHandlers.addNumber('5')" width="30" label="6" click="calcHandlers.addNumber('6')" width="30" label="*" click="calcHandlers.setOperation('multiply')"
width="30" label="7" click="calcHandlers.addNumber('7')" width="30" label="8" click="calcHandlers.addNumber('8')" width="30" label="9" click="calcHandlers.addNumber('9')" width="30" label="/" click="calcHandlers.setOperation('divide')"
width="30" label="0" click="calcHandlers.addNumber('0')" width="30" label="." click="calcHandlers.addNumber('.')" width="70" label="=" click="calcHandlers.doOperation()"
- ここで一度ファイルを保存しておきます。
CalculatorHandlersクラスの作成
ここでは、電卓アプリケーションの処理を制御する、コントローラーのActionScript
クラスを作成します。なお、このアプリケーションは比較的にシンプルなので、ここではデータモデルを別に用意せずに、コントローラーの中に持つことにします。
ActionScriptのクラスは、他のオブジェクト指向言語同様の方法で簡単に作成できます。つぎに基本的な構文を示します。
class ClassName
{
[プロパティやメソッド]
}
なお、作成したクラスは「.as」ファイルとして保存し、ファイル名はクラス名と同じものにしておきます。
仮にクラス定義の中にコンストラクタ関数が明示的に宣言されていない場合、ActionScriptコンパイラは自動的に空のコンストラクタ関数を生成します。しかし、コンストラクタ関数は、たとえ明らかな機能性がない場合でも、明示的に記述するようにしてください。なお、ActionScriptのコンストラクタ関数は、必ずしも引数や戻り値を発する必要はありません。また、コンストラクタ関数の多重定義はサポートされていません。他のメソッド同様に、コンストラクタ関数はfunction
キーワードを利用して作成します。
[public|private] function ClassName(){}
メソッド(およびプロパティ)は、デフォルトでpublic
になっています。したがって、デフォルトの状態ではクラス外からでもこれらにアクセスすることができます。常にpublic
である必要のない場面に注意を払い、public
とprivate
の区別を明示的に行うことをお勧めします。
- 新規ファイルを作成し、ファイルを「calculator.mxml」ファイルと同じディレクトリに「CalculatorHandlers.as」として保存します。
CalculatorHandlers
クラスのクラス定義を追加します。- クラスのブロックの中に空のコンストラクタ関数を追加します。
class CalculatorHandlers
{}
public function CalculatorHandlers(){}
コントローラークラスのプロパティの追加
ここまでに記述した「calculator.mxml」ファイルのコードを見ると分かるように、このコードはコントローラーのクラスのプロパティに直接アクセスしていません。なお、コントローラーのクラスのプロパティは、1つを除き、すべてprivate
に設定します。のちほどMXMLアプリケーションからコントローラークラスをインスタンス化しますが、この際に、電卓オブジェクト全体への参照を保持するプロパティを設定します。電卓オブジェクト全体を参照すれば、コントローラーのメソッドを呼び出す際に、そのつど参照情報を渡すことなく電卓の画面表示部分のLabel
などのオブジェクトにアクセスできます。したがってここでは、オブジェクト全体への参照を維持するプロパティをpublic
で作成し、電卓の各種イベントを処理する残りのプロパティをprivate
に設定して作成します。
プロパティを設定するための基本構文は次のとおりです。
[public|private] var propertyName:dataType[=initialValue];
次にプロパティの設定例を示します。
private var name:String;
電卓オブジェクトへのpublic
参照以外には、次に挙げるプロパティを利用します。
- 演算待ちの値を一時的に記憶する2つのレジスタ
- 上記の2つのレジスタのうち、どちらのレジスタが現在使用中であるかを追跡するための
currentRegister
プロパティ - 処理待ちの演算形態を追跡するための
currentOperation
プロパティ
以上のプロパティだけを設定すれば電卓アプリケーションは機能しますが、ここではレジスタの値を数値に変換したもの(レジスタの値が文字列でなければ、ユーザーは数値ボタンをクリックしても新たな数字を付加できません)を維持するためのいくつかのプロパティや、演算の結果を維持するためのresult
プロパティも設定することにします。これらのプロパティを追加することで、コードが簡素化されるうえにロジックが明快になります。
CalculatorHandlers
クラスのブロックのはじめに、次のプロパティを設定します。
タイプ | プロパティ名 | データタイプ | 初期値 |
public | calcView | Object | |
private | reg1 | String | ""(空ストリング) |
private | reg2 | String | "" |
private | result | Number | |
private | currentRegister | String "reg1" | |
private | operation | String "none" | |
private | r1 | Number | |
private | r2 | Number |
CalculatorHandlersクラスのメソッドの追加
電卓のボタンに設定したclick
イベントの値を見れば分かるように、コントローラーには次に挙げる一連のpublic
メソッドが必要です。
doOperation
addNumber
clearEntry
clearAll
setOperation
また、コントローラーが内部処理のために使用する、次の3つのprivate
メソッドを作成する必要もあります。
setDisplay
setCurrentRegister
resetAfterOp
次に、メソッドの一般的な構文を示します。
[public|private] function
methodName(parameter1:dataType...):returnDataType
{
[ActionScriptのステートメント]
}
電卓アプリケーションのコントローラーで使用するメソッドは戻り値を必要としません。したがって、メソッドの戻り値のデータタイプにはVoid
を設定しておきます。