2011年9月8日木曜日

FLASHでGUIの4

HttpServer関連と、Loader関連をひとつのクラスにしようと思ったけど、
まぁ使い方を考えると、それぞれ別でもイイ気がしてきたので、別で。
基本はHttpServerと同じ。内部でLoaderクラスを呼ぶだけ。
Httpのときと同じように、ひとつずつ動作させる。
こんな感じで。
// ------------------------------------------------------------------------------
function spLoadImage(){
  own = this;
  init();
}
// ------------------------------------------------------------------------------
public function ldInit(e:Event):void{
  trace(e);
}
// ------------------------------------------------------------------------------
public static function getEnum(n:int):String{
  switch(n){
    case eNotBitmap:    return  "Not Bitmap Resource";
    case eIOError:      return  "IO Error";
    case eSecurityError:  return  "Securit Error";
    default:        return  "Undifiend Error";
  }
}
// ------------------------------------------------------------------------------
private function ldComplete(e:Event):void{
  trace(e);
  if(loader.content is Bitmap){
    var lp:Object = loader.content;  //  var lp:Bitmapだとエラー
    var bit:Bitmap = new Bitmap(lp.bitmapData.clone());
    lp.bitmapData.dispose();
    okFunction(localVal,bit);
  }else{
    ngFunction(eNotBitmap,  getEnum(eNotBitmap));
  }
  nextGo();
}
// ------------------------------------------------------------------------------
private function ldIOError(e:IOErrorEvent):void{
  ngFunction(eIOError,e.text);
  nextGo();
}
// ------------------------------------------------------------------------------
private function nextGo():void{
  trace("--nextGo--");
  loader.contentLoaderInfo.removeEventListener(Event.INIT,        ldInit);
  loader.contentLoaderInfo.removeEventListener(Event.COMPLETE,      ldComplete);
  loader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR,    ldIOError);
  bRun = false;
  execute();
}
// ------------------------------------------------------------------------------
private function init():void{
  uVar  = new URLVariables;
  datAr  = new Array;
}
// ------------------------------------------------------------------------------
public function setData(url:String,  comtype:uint,  okRes:Function,  ngRes:Function,  args:String,method:String="POST"):void{
  datAr.unshift(
    {
      "url":    url,
      "comtype":  comtype,
      "okFunc":  okRes,
      "ngFunc":  ngRes,
      "args":    args,
      "method":  method
    }
  );
  //  Array  //  pop()  最後を取り出して削除  //  unshift(... args):uint 最初に追加
}
// ------------------------------------------------------------------------------
public function execute():void{
  setTimeout(executeSub, tInterval);
}
// ------------------------------------------------------------------------------
private function executeSub():void{
  if(datAr.length < 1){
    //  END
  }else{
    if(bRun){
      setTimeout(executeSub, tInterval);
    }else{
      trace("☆executeSub "+datAr.length);
      bRun = true;
      var o:Object  = datAr.pop();
      loader = new Loader;
      loader.contentLoaderInfo.addEventListener(Event.INIT,        ldInit);
      loader.contentLoaderInfo.addEventListener(Event.COMPLETE,      ldComplete);
      loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR,  ldIOError);
      var UR:URLRequest    = new URLRequest(o.url);
      if(o.method == "GET")  UR.method = URLRequestMethod.GET;
      else          UR.method = URLRequestMethod.POST;
      uVar = new URLVariables;  //  何か設定することになるだろう。
      uVar.args = o.args;
      UR.data=uVar;        //  
      okFunction  = o.okFunc;
      ngFunction  = o.ngFunc;
      localVal  = o.comtype;
      try{
        loader.load(UR);
      }
      catch (error:SecurityError){  //  err:Error
        ngFunction(eSecurityError,getEnum(eSecurityError));
      }
    }
  }
}
// ------------------------------------------------------------------------------

2011年9月7日水曜日

FLASHでGUIの3

FLASHのGUIといっても、当然、サーバとのやりとりが必要なわけで。
そうすると、マルチタスクのイベントドリブンのような顔をしたActionScriptではあるけど、
正しくタイムシェアリングしてるわけでもなんでもないし、
サーバとの転送量が大きい場合(データが大きい画像とか)を考えると、
1つづつ実行できるようなシステムにしたいわけですね。
といったところで、画像一覧をゲットするようなことを考えて見る。

●httpのためのクラスを作る
【仕様】
→url、データのタイプ、パラメータ、callBack関数を複数指定して、
ひとつづつhttpリクエストをかける。
100コの画像を取ってくる場合でも、必ず、ひとつずつリクエストするものとする。

いろいろやって結果、スマートかどうかは別にして、、、
タイマを使うことになってしまった。
要するに、
実行中かどうかをフラグで判定して、判定中だったら、タイマをまた設定みたいなことを繰り返す。
ActionScriptにはSleepも無いことだし。
ちょっといい加減に書きなぐったSRCがこんな感じ。

なんとなくそれらしく動く。パラメータとかTEXT系じゃないときは、次に考えます。

function spHttp(){
  own = this;
  init();
}
// ------------------------------------------------------------------------------
public function init():void{
  datAr  = new Array;
}
// ------------------------------------------------------------------------------
public function setData(url:String,  comtype:uint,  okRes:Function,  ngRes:Function,  method:String="POST",useProxy:Boolean=false):void{
  datAr.unshift(
          {
            "url":    url,
            "comtype":  comtype,
            "okFunc":  okRes,
            "ngFunc":  ngRes,
            "method":  method,
            "useProxy":  useProxy
          }
        );
}
// ------------------------------------------------------------------------------
public function execute(){
  setTimeout(executeSub, tInterval);
}
// ------------------------------------------------------------------------------
public function executeSub(){
  if(datAr.length < 1){
    //  END
  }else{
    if(bRun){
      setTimeout(executeSub, tInterval);
    }else{
      bRun = true;
      var o:Object  = datAr.pop();
      httpSV  = new HTTPService();
      httpSV.addEventListener(ResultEvent.RESULT,  okResult);
      httpSV.addEventListener(FaultEvent.FAULT,  ngResult);
      httpSV.resultFormat = "text";  //  
      httpSV.url    = o.url;    //  
      httpSV.method  = o.method;    //  httpSV.method = "POST";
      httpSV.useProxy  = o.useProxy;  //  httpSV.useProxy =false;
      uVar  = new URLVariables;
      uVar.decode("Giant=Baba");
      var at:AsyncToken = httpSV.send(uVar);
      at.id    = o.comtype;
      okFunction  = o.okFunc;
      ngFunction  = o.ngFunc;
    }
  }
}
// ------------------------------------------------------------------------------
public function okResult(event:ResultEvent):void{
  httpSV.removeEventListener(ResultEvent.RESULT,okResult);
  httpSV.removeEventListener(FaultEvent.FAULT,ngResult);
  okFunction(event);      //  本当の処理はこっちだよ
  bRun = false;
  execute();
}
// ------------------------------------------------------------------------------
public function ngResult(event:FaultEvent):void
{
  httpSV.removeEventListener(ResultEvent.RESULT,okResult);
  httpSV.removeEventListener(FaultEvent.FAULT,ngResult);
  ngFunction(event);      //  本当の処理はこっちだよ
  bRun = false;
  execute();
}
// ------------------------------------------------------------------------------

2011年9月1日木曜日

FLASHでGUIの2



とりあえず、FLASHでのGUIのobjectの階層構造。(ver1)

<TOP> MXML
  <app> 固有クラス。アプリ制御(非GUI)
  <doc> 固有クラス。doc制御(非GUI)
  <menues> MXML
  <mainArea> MXML
    <Canvas>  :Base:UIComponent 
      <Layer>  :Base:UIComponent
        <Item>  :Base:UIComponent
        <Item>  :Base:UIComponent
        <Item>  :Base:UIComponent
        <Item>  :Base:UIComponent
      <Layer>  :Base:UIComponent
      <Layer id="last">  :Base:UIComponent
  <dialog> MXML

スケールを設定して拡縮するのは<Canvas>のみ。
<Layer id='last'>には、メッシュというかGRID表示させる。
BaseはUIComponentほぼそのままだが、基本的な機能だけをいれる。
マウスイベントをうけとるかどうかのon-offとか。

あとは、かならずTOPへの参照をできるようにして、appとかdocとかを適宜参照可能にする。

やっぱ、絵の出るプログラムは楽しいよね。