なぜか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) { } }