Flash CS3とアクションプロジェクト向けベーシックのArrayBinderクラス

Flash CS3とFlex(ActionScript)のプロジェクトに、モデルからビューの部分を分けるようになればプロジェクト構成もわかりやすくて、メンテナンスもしやすくなります(MVC構成ですから、^^)。

※MVCモデルという言葉自体は、Smalltalkというオブジェクト指向言語でのGUI設計に用いられた概念です。MVCとは、 Model、View、Controllerの頭文字をとったものです。

次はfboyleが書かれたArrayBinderというAS3のソースコード、該当インスタンスを利用して各オブジェクトに参照されている属性の値を格納出来ます。

array2

下記はソースコード:


package com.fboyle.bind {
import flash.events.*;
public class ArrayBinder implements IEventDispatcher {
private var eventDispatcher:EventDispatcher;
private var arrChange:Event;
private var arrUpdate:Event;
private var receiverInstArr:Array = new Array();
private var receiverTypeArr:Array = new Array();
private var changeArr:Array;
private var indexUpdate:Number;
public function ArrayBinder(dataSource:Array) {
eventDispatcher = new EventDispatcher(this);
arrChange = new Event(“arrChange”);
arrUpdate = new Event(“arrUpdate”);
changeArr = dataSource;
this.addEventListener(“arrChange”, this.onArrChange);
this.addEventListener(“arrUpdate”, this.onArrUpdate);
}
public function addReceiverInstance(receiverInst:*, index:Number):void {
for each(var i:* in receiverTypeArr) {
if(receiverInst is i[0]){
receiverInst[i[1]] = changeArr[index];
}
}
receiverInstArr.push([receiverInst,index]);
this.dispatchEvent(arrChange);
}
public function addReceiverType( receiverType:*, addProperty:String ):void {
receiverTypeArr.push([receiverType,addProperty]);
}
public function set changeArray(chngdArr:Array):void {
changeArr = chngdArr;
this.dispatchEvent(arrChange);
}

public function updateArrayIndexOf(index:Number, value:*):void {
changeArr[index] = value;
indexUpdate = index;
this.dispatchEvent(arrUpdate);
}
private function onArrChange(ev:Event):void {
for each(var i:* in receiverInstArr) {
//compare i[0] to the listed types and then assign value at i[1] to the corresponding property k[1]
for each(var k:* in receiverTypeArr) {
if(i[0] is k[0]){
i[0][k[1]] = changeArr[i[1]];
}
}
}
}
private function onArrUpdate(ev:Event):void {
for each(var i:* in receiverInstArr) {
if (i[1] == indexUpdate) {
for each(var k:* in receiverTypeArr) {
if(i[0] is k[0]){
i[0][k[1]] = changeArr[i[1]];
}
}
}
}
}
public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void {
eventDispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
}
public function dispatchEvent(event:Event):Boolean {
return eventDispatcher.dispatchEvent(event);
}
public function hasEventListener(type:String):Boolean {
return eventDispatcher.hasEventListener(type);
}
public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void {
eventDispatcher.removeEventListener(type, listener, useCapture);
}
public function willTrigger(type:String):Boolean {
return eventDispatcher.willTrigger(type);
}

}
}

【使用例】

・簡単の配列を生成する例:


var dataArr:Array = new Array();
dataArr[0] = “Sample title for my Flash App”;
dataArr[1] = “Sample textfield value”;
datArr[2] = “This is a button label”;

・配列をArrayBinderインスタンスに設定する


var myArrBind:ArrayBinder = new ArrayBinder(myArr);

・クラスタイプとプロパティをレジスターする


myArrBind.addReceiverType(TextField, “text”);
myArrBind.addReceiverType(Button, “labelTxt”);

・ステージインスタンスとインデックス位置


myArrBind.addReceiverInstance(title_text,0);
myArrBind.addReceiverInstance(sample_txt,1);
myArrBind.addReceiverInstance(myButton,2);

次のリンクでソースコードをダウンロードできます。もっと詳しい情報はここに参照できます。

Leave a Reply

Your email address will not be published. Required fields are marked *