なぜかFlex2

動かしかたが分かったらサーバからデータを読みたくなるのが人情ってものだ。

XMLをオブジェクトにマップしたかったけど、うまくいきません。
resultFormat="object"だと型エラー(たぶん)
結局resultFormat="e4x"でとることにした。
e4xいいな。。。
どっかの記事で読んだときはこんなもんいるのか?と思ったけど、使うとすごく便利。
C#にも欲しいな。

それと

var xxx = function(){...}

な書きかたは

var xxx:Function = function():xxx

でいいらしい。けどこれだと長すぎてなんかやだな。

prg1.mxml

<?xml version="1.0"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml">
   <mx:Script source="prg1.as" />
<!--          <mx:HTTPService id="svc" url="svc.aspx" resultFormat="text" result="gotResult(event)" method="POST" /> -->

   <mx:HTTPService id="svc" url="svc.aspx" resultFormat="e4x" result="gotResult(event)" method="POST" />
   <mx:Label width="50" color="Black" text="count"/>
   <mx:TextInput id="txtcount" />
   <mx:Label width="50" color="Black" text="prefix"/>
   <mx:TextInput id="txtprefix" />

   <mx:Panel id="pan" title="DataGrid コントロールの例" height="100%" width="100%" paddingTop="10" paddingLeft="10" paddingRight="10">
        <mx:Label width="100%" color="Black" text="サーバからのデータ取得"/>
        <mx:DataGrid id="dg" width="100%" height="100%" rowCount="7">
            <mx:columns>
                <mx:DataGridColumn dataField="index" headerText="インデックス"/>
                <mx:DataGridColumn dataField="value" headerText="データ" />
            </mx:columns>
        </mx:DataGrid>
    <mx:Button id="btn" label="load" click="load()" />
    </mx:Panel>

</mx:Application>

prg1-comfig.xml

<flex-config>
  <output>bin/prg1.swf</output>
  <default-size>
    <width>800</width>
    <height>600</height>
  </default-size>
  <default-frame-rate>60</default-frame-rate>
  <default-background-color>0x000000</default-background-color>
</flex-config>

prg1.as

import mx.controls.DataGrid;
import mx.rpc.http.mxml.HTTPService;
import mx.rpc.events.ResultEvent;
import mx.controls.Alert;
//import flash.xml.XMLNode;

public var load:Function = function():void
{
    var fdata:Object=new Object();
    fdata.count = txtcount.text;
    fdata.prefix = txtprefix.text;
    svc.send(fdata);
}

public var gotResult:Function = function(event:ResultEvent):void
{
    try
    {
        var datas:XML = XML(event.result);
        var array:Array = new Array();
        
        for each(var data:XML in datas.data){
            array.push({index:String(data.index),value:data.value});
        }
        dg.dataProvider = array;

//         for(var i:Number;i<datas.data.length;i++)
//         {
//             Alert.show(datas.data[i]);
//         }
//         dg.dataProvider=event.result.datas.data;
    }
    catch(err:Error)
    {
        Alert.show(err.message);
    }
}

サーバ側はCommonLispで書きたかったんだけど、準備不足で断念。
C#という情けない選択肢になった。(一番書きなれてるからさ。。。)

using System;
using System.IO; 
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

public partial class _Default : System.Web.UI.Page 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        int count = Convert.ToInt32(Request.Form["count"]);
        string prefix = (string)Request.Form["prefix"];
        Response.ContentType = "text/html";
        string s = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\r\n";
        s += "<datas>";
        for (int i = 0; i < count; i++)
        {
            //s += "<data index=\"" + Convert.ToString(i) + "\" value=\"" + prefix + ".data." + Convert.ToString(i) + "\" />";
            s += "<data>";
            s += "<index>" + Convert.ToString(i) + "</index>";
            s += "<value>" + prefix + ".data." + Convert.ToString(i) + "</value>";
            s += "</data>";
        }
        s += "</datas>";
        Response.Write(s);
        Response.End();
    }

    private void P(string s)
    {
        
    }
}