カスタムイベント

今更ながらだが、Flash Builderのカスタムイベントの使い方がわかってきた。

一般的にアプリケーションの構造が大きくなるとコンポーネント別に作っていき、ViewStack等を使って、機能別にコンポーネントを表示して動かすが、その場合、カスタムイベントを利用すると、子どものコンポーネント内の処理を他のコンポーネントや自身の次の処理へ繋げるなど、任意の処理のイベント終了を管理する事ができる。

例えば、Aと言うコンポーネントで、A1と言う処理(例えばデータベースのデータの更新)を行った後、Bと言うコンポーネントの別の処理、B1(例えばデータベースのリスト更新)を行いたいと言う場合に有効だ。

Aのコンポーネントのメタタグで
<fx:Metadata>
  [Event(name="A1_END", type="flash.events.Event")]
 </fx:Metadata>

と言うイベントを用意しておき、Aの中で必要な時に呼べば良い。

データベースの更新等場合、通常はCallResponderなどで戻りの処理を書くが、その場所で
protected function  A1_END_Handler(event:GridSelectionEvent):void
   {
    var eventObject:Event=new Event(“A1_END”);
    dispatchEvent(eventObject);
   }

とすれば、これでデータベス更新が終わったイベントを親へ伝える事が出来る。

親から見れば、Aのメタタグで、A1_ENDと言うカスタムイベントを作成すると

<local: A1 id=”Child_A1″ A1_END=”Child_A1_A1_END_Handler(event)”></local:driver_list> 

と言う感じでA1_ENDと言うイベントが参照出来るので、これに対して任意のハンドラを当てて、その中でBコンポーネントのB1と言う処理を行うメソッドを呼び出せば良い。

実際の処理はBコンポーネント内で書けば良い訳で、親は全体の管理をするだけで良い。

特にFlashBuilderの様に、イベントドリブンで非同期なアプリケーションの場合は何かの処理が終わる事を確実に把握しないと、値を読みに行った時まだ処理が終わってなくてエラーと言う場合が多々ある。
それも、テストの時は良かったけど、実機になると入っていた筈の値が入ってないと言う現象になったりする。

特に、データベス関連の処理をする場合は、一度の呼び出しで処理が終わら無い場合もあり、前の処理が終わって、次の処理をすると言う事が良くあるし、連続して他の処理を行いたい場合もある。

データを追加した後の、件数の更新などは一度で出来るが、リストの更新となるとその更新から戻ったタイミングでやる必要がある。

コンパイラ系のプログラムだと、その辺を気にしないでプログラム出来るのだが、この辺がFlash系のプログラムの面倒なところで、コンパイラ系から変わって少し複雑なプログラムを書く時に最初に戸惑う部分だ。

そう言う意味で、このカスタムイベントと言うのは、複数のコンポーネントに分けるような大きなプログラムを書く場合、非常に便利で、これを使うことで複雑な処理もスッキリ書ける。

カテゴリー: Flash Builder, 仕事   パーマリンク

コメントは受け付けていません。