2011年12月7日水曜日

FLEXのdataGridの配列の値を+=する件。

DataGridなるものがFLEXにある。
こんなコードを書く。
datAr = new Array(
  {n:1,  type:0,  x:1.5,  y:2.5},
  {n:2,  type:1,  x:1.5,  y:2.5},
  {n:3,  type:2,  x:1.5,  y:2.5}
);
DG.dataProvider = datAr;
ここに、datArはArrayであって、datAr[0].xは1.5という数値(Number)である。
しかし、
datAr[0].x += 20;
とすると、いつのまにやら、datAr[0].xがStringになっており、
datAr[0].x が、"1.520"
という文字列になっている。
datAr[0].x = Number(datAr[0].x) + 20;
とすれば、無事に、21.5になるのだが。
まぁ、こういうもんなのだろう。。

2011年12月1日木曜日

FLEXのObjectのdeleteする件の1

だいぶ更新をサボってしまった。。
さて、表題の件、かなりあれこれ迷った挙句、根本的にここらへんの仕組みを理解していなかったので、整理を含めて書いてみる。

まず、データが階層構造で存在している。(JSON)
これを、Objectに変換する。
これが、表示・編集する元データとなる。
しかし、これを表示するとなると、DisplayObjectにしなきゃいけない。
よって、それを包括したクラスを作成した。
こんな感じ。※実際にはこれをさらに派生させる。
public class spBase extends UIComponent{
。。。
public var obj:Object; // データの参照が入るよ。
。。。
//実際には、このインスタンスに、以下のように設定
xxx.obj = maindata.a[0].b.c;
要するに、
"maindata":{
  "a":[
   {
   "b":{
    "c":{
       "dat1":1,
       "dat2":2,
       "dat3":3
     },
     "c2":{
       "cat1":1,
       "cat2":2,
       "cat3":3
     }    
    }
   }
  ]
}
って感じで。
で、何がやりたいかというと、xxxインスタンスを削除し、maindata.a[0].b.c;を無きものにしたいのだ。
xxxインスタンス自体は、xxx.parent.removeChildAt(zz);
で消せる。しかし、そんなことをやっても、maindata.a[0].b.cは、生きてる。
ここから、悪戦苦闘が始まるのだ。

テスト開始
item:Object = new Object;
item.obj = mainData.a[0].b.c;
で、デバッガで見た状況。
たしかに同じアドレスをさしている。

もちろん、
item.obj = {};
なんて書けば、こうなる。まぁ当然である。

でも、
trace(delete item.obj);
と書くと、こうなる。
【その1】

でも、
trace(delete mainData.a[0].b.c);
と書くと、こうなる。
【その2】

問題なのは、traceしてみると、両方ともtrueを返すことだ。
その1はいいのだが(いや、厳密には良くない気がするが。)、、、その2は、明らかに他が参照しているので、falseが返されるべきなんじゃ。。。。。
まぁどっちにしても、両方実行しないと消せないのである。

ってことは、、、参照だけもってても消せないのである。
ってことは、、、やりたいと思うことが、、できないわけである。