#topicpath
----
FlexではActionScriptの記述による配列の定義や、Arrayタグを用いた配列の定義を行うことができます。定義した配列は、プルダウンやデータグリッドにバインドすることができます。非常に強力です。

#contents



*** ActionScriptで定義する、Arrayタグで定義する。 [#l0ae580c]

//ここにコンテンツを記述します。
 <?xml version="1.0" encoding="utf-8"?>
  <mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml">
 
    <!-- Primitive型の配列の定義 -->
    <mx:Script>
    <![CDATA[
	 var myArray = [1,2,3,4,5,6,7,8,9];
	]]>
	</mx:Script>
    <!-- Primitive型の配列の定義 以上 -->
 
    <!-- Objectの配列の定義 -->
    <mx:Array id="myArrayOfObjects"><!-- 変数名をmyArrayOfObjectsとしたのと同義 -->
      <mx:Object label="Q1" volume="1600" revenue="10000"/>
      <mx:Object label="Q2" volume="1500" revenue="9000"/>
      <mx:Object label="Q3" volume="1900" revenue="12000"/>
      <mx:Object label="Q4" volume="2300" revenue="14000"/>
    </mx:Array>
    <!-- Objectの配列の定義 以上 -->
 
    <mx:HBox>
      <mx:Panel label="Array Samples" title="sample">
        <mx:Form>
          <mx:FormHeading label="My Form"></mx:FormHeading>
          <mx:FormItem label="Pick a Number">
            <mx:ComboBox id="myCombo" dataProvider="{myArray}"/>
            <!-- さっきの配列をBind -->
          </mx:FormItem>
        </mx:Form>
        <mx:ControlBar>
          <mx:Label text="You chose:{myCombo.selectedItem}"/>
        </mx:ControlBar>
      </mx:Panel>
      <mx:Panel title="DataGrid">
        <mx:DataGrid id="datagrid" dataProvider="{myArrayOfObjects}">
          <!-- さっきの配列をBind -->
          <mx:columns>
            <mx:Array>
              <mx:DataGridColumn headerText="Label" columnName="label" />
              <mx:DataGridColumn headerText="Volume" columnName="volume" />
              <mx:DataGridColumn headerText="Revenue" columnName="revenue" />
            </mx:Array>
          </mx:columns>
        </mx:DataGrid>
        <mx:ControlBar>
          <mx:Label text="You chose:{datagrid.selectedItem.label}"/>
        </mx:ControlBar>
      </mx:Panel>
    </mx:HBox>
  </mx:Application>

#ref(arraySample1.png)


***ファイルからデータを読み込んで定義する。 [#yd039520]
先ほどは配列をソースコード上で定義していましたが、次は配列をXMLを読み込んで作成してみます。同じディレクトリに、hogeData.xmlという配列の元データを配置しました。hogeData.xmlの内容は以下の通り:

 <data>
    <hogeModel>
      <label>Q1</label>
      <volume>1600</volume>
      <revenue>10000</revenue>
    </hogeModel>
    <hogeModel>
      <label>Q2</label>
      <volume>1500</volume>
      <revenue>9000</revenue>
    </hogeModel>
    <hogeModel>
      <label>Q3</label>
      <volume>1900</volume>
      <revenue>12000</revenue>
    </hogeModel>
    <hogeModel>
      <label>Q4</label>
      <volume>2300</volume>
      <revenue>14000</revenue>
    </hogeModel>
  </data>

このファイルは、
-hogeModelタグが、子要素(label,volume,revenue)をフィールドに持つデータモデル
-そのモデルの配列(要素数は4個)

である、ととらえることができそうです。

さてそのデータファイルから、配列(というかデータモデル)を生成するには、以下のModelタグを使用します。
 <mx:Model id="myArrayOfObjects" source="hogeData.xml"/>
で、hogeData.xmlからmyArrayOfObjectsというモデルを定義するよ、という意味になります。DataGridでの dataProvider の定義は myArrayOfObjects.hogeModel とすれば良いみたいです。ちなみに myArrayOfObjects.hogeModelの「hogeModel」はXMLファイルの要素名に該当します。

結局サンプルは以下の通り:

 <?xml version="1.0" encoding="utf-8"?>
  <mx:Application xmlns:mx="http://www.macromedia.com/2003/mxml">
    <!-- Objectの配列の定義 -->
    <mx:Model id="myArrayOfObjects" source="hogeData.xml"/>
    <!-- Objectの配列の定義 以上 -->
    <mx:HBox>
      <mx:Panel title="DataGrid">
        <mx:DataGrid id="datagrid" dataProvider="{myArrayOfObjects.hogeModel}">
          <!-- さっきの配列をBind -->
          <mx:columns>
            <mx:Array>
              <mx:DataGridColumn headerText="Label" columnName="label" />
              <mx:DataGridColumn headerText="Volume" columnName="volume" />
              <mx:DataGridColumn headerText="Revenue" columnName="revenue" />
            </mx:Array>
          </mx:columns>
        </mx:DataGrid>
        <mx:ControlBar>
          <mx:Label text="You chose:{datagrid.selectedItem.label}"/>
        </mx:ControlBar>
      </mx:Panel>
    </mx:HBox>
  </mx:Application>

#ref(arraySample2.png)

xmlのスキーマ定義はなくてもいいの??そのスキーマとオブジェクトとのマッピングは??とかいろいろ気になるところはありますが、なんだか軽いタッチで非常にわかりやすいですね。でもxmlファイルはmxmlファイルの場所に置いておくと、アクセスされてダウンロードできちゃうよなぁ。

***配列からモデルを定義して、DataGridに渡す。 [#z8397414]
ひがやすをさんの、[[Flexでさわっておぼえるリッチクライアント:http://www.amazon.co.jp/exec/obidos/redirect?tag=kinosite-22&creative=203&camp=23&link_code=st1&path=ASIN/4844321706]]に書いてあるのですが、配列をModelにラップしてそのモデルをDataGridに渡すことができます。つまり
 <mx:Model id="modelOfArray">
  {myArrayOfObjects}
 </mx:Model>
として、
 <mx:DataGrid id="datagrid" dataProvider="{myArrayOfObjects}">
を
 <mx:DataGrid id="datagrid" dataProvider="{modelOfArray}">
とするのもありみたいです。これをやる意味は、[[先の本:http://www.amazon.co.jp/exec/obidos/redirect?tag=kinosite-22&creative=203&camp=23&link_code=st1&path=ASIN/4844321706]]のチュートリアルでは''後に、データを外部から取得する形式に変更するから、その切替を簡単にするため、データを一端データモデルに格納する''とあります。とりあえずまだ読み進めないとわかんないなあ。




----
この記事は
#vote(おもしろかった[24],そうでもない[23])
#vote(おもしろかった[25],そうでもない[23])
-Array で作成される配列と、Modelで作成されるオブジェクトの違いがまだよくわかりませんねえ。 -- [[木野]] &new{2005-10-11 08:05:37 (火)};

#comment
#topicpath


SIZE(10){現在のアクセス:&counter;}

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS