2003年11月27日号

━━━━━━━━━━━━━━━━━━━━━ 2003.11.27 Vol.876 ━━━━━
 ■□■□■
 ■□■□■ 日刊「WEBのツボ!」
 □■□■□              http://www.soho-union.com/
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
                             配信部数 xxxx部
「システムはオブジェクト指向 Ruby & Flash」(#009)   
                                                          福井修@Fsys

【○】本日のお題【 応用編 】Ruby&Flash&PostgreSQL での 郵便番号検索 ━━
 
はや11月も終わりいよいよ冬ですね。それにしても南極皆既日食は、なかなか
神秘的でしたね。本連載も9回目であと2回、Ruby&Flash応用編となります。

前回【 実践編 】「LoadVars連携での DB検索 」というテーマでサーバサイド
のRubyでのDBデータハンドリングについて解説しました。簡潔で楽しいプログ
ラムを感じて頂ければ有り難いところです。

さて本日は、Ruby&Flash&PostgreSQL での 郵便番号検索 というテーマで実用的
な画面に進みます。

前回PostgreSQLはもうすぐバージョン7.4が出るという予告をしましたが、11
月17日に PostgreSQL7.4 が正式リリースされました。注1)
また IBM DB2 Express の料金体系にも情報がありますので、補足します。注2)

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ 準備
────────────────────────────────────
今回から【応用編】ですが、【実践編】過去3回で、説明した記事が準備となり
ます。

管理者権限のあるLinuxマシンでRuby,PostgreSQLがインストールされており、郵
便番号が、登録済みであるところの準備が整っている必要があります。

連載 6【実践編】サーバサイドで Ruby&PostgreSQL 連携
http://www.melma.com/mag/02/m00020302/a00000641.html

連載 7【実践編】LoadVars連携での ログイン認証
http://www.melma.com/mag/02/m00020302/a00000651.html

連載 8【実践編】LoadVars連携での DB検索
http://www.melma.com/mag/02/m00020302/a00000661.html
               
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ まとまったデータの受け渡しは、LoadVarオブジェクトのonDataメソッドで
────────────────────────────────────
 前回はサーバサイドのDB連携まわりを解説しましたので、今回は、クライア
ントのActionScriptの方のツボに迫ります。対象バージョンは、Flash MX です。

DBの検索結果は、複数レコードの場合があります。これまでの LoadVarsの例
では、取り扱うデータにひとつひとつ変数名を与えては、値とのペアで操作する
方式でした。これは、基本ではありますが、データ量が増えてくるとその方式で
は、なかなかいちいちやっておれなくなってきます。

まとまったデータを扱うには、XMLオブジェクトも有効です。次回の最終回には、
このXMLオブジェクトを利用します。

ActionScriptでは、イベントが発生した場合に、あらかじめ仕掛けておいたイベ
ントハンドラメソッドを呼び出してくれるしくみになっています。

外部データにアクセスするLoadVarsオブジェクトのイベントハンドラには
 onLoad イベントハンドラがあります。このイベントハンドラメソッドに処理を
実装してゆくのです。
  
    オブジェクト.onLoad = function(){
      読み込みが完了したイベントで実行する処理
    }

第7回 LoadVars連携での ログイン認証の中で login.as スクリプトで
      :
   // 応答読み込み完イベントハンドラメソッドを定義
  resCheck.onLoad = function(success) {
    _root.res.text = resCheck.addr
  }
      :

という部分があります。この onLoadイベントハンドラメソッドでは、サーバか
ら応答された住所データを表示用のテキストのインスタンスに格納しています。

 この onLoadというイベントハンドラメソッドは、サーバからのデータを受信用
LoadVarsオブジェクトに読み込み完了して発行されるイベントなのです。

XMLオブジェクトでは、ダウンロードしたデータをXMLとして解析した後で発生す
るonLoadの他に、onLoadの前に、すなわちダウンロードしたデータをXMLとして
解析する前の素のテキストデータを渡してもらうイベントの onDataというイベ
ントハンドラメソッドもあります。

このように解析する前の素のテキストデータを渡してもらえるメソッドが
LoadVarsオブジェクトにも存在すると、いちいち取り扱うデータをひとつひとつ
変数名と値とのペアで操作する必要がなくなります。幸いなことに LoadVarsオ
ブジェクトでも onDataイベントハンドラメソッドが使えるのです。
但し公式マニュアルには、記載されていない非公式な利用方法であったのです。
しかし 幸いな事に Flash2004 では、公式に使えるようなので、もうどんどん使
っても良いのでしょう。
    
 データ量が多い場合には、LoadVarsオブジェクトの onDataメソッドを、使用し
ます。

〜〜〜〜〜    ここから postlist.as 抜粋   〜〜〜〜〜〜〜〜〜〜〜〜
	:
  // Load完時に サーバで作成した.csvファイルを読む
  rcvData.onLoad = function(success) {
    // 読み込みリクエスト
    loadCSV("postlist.csv")
  }

  // csv読み込み完了時の処理を定義
  csvLoad.onData = loadDataInfo

  // データリクエスト サーバサイドのスクリプト呼び出し
  reqData.sendAndLoad("getpostlist.rb",rcvData,"POST")
	:
//──────────────────────────────────
// 受信データの編集表示
function loadDataInfo(list) {
  // 受け取ったcsvデータを編集格納
  // 行毎に区切る
  lineList = list.split("\n")

  // データ数(=行数)
  maxDataCount = lineList.length - 1
  if (maxDataCount > maxLine){
    // 画面のmaxを越える場合は、画面のmaxにとどめる
    maxDataCount = maxLine
  }

  //--受け取ったcsvデータを行毎に分解した分を逐次処理
  // 行毎に逐次処理
  rowEdit(lineList,maxLine)
}
〜〜〜〜〜    ここまで postlist.as 抜粋   〜〜〜〜〜〜〜〜〜〜〜〜

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■ ActionScriptで テーブル表示は、TextFieldオブジェクト
────────────────────────────────────
 Flashで文字を出力するには、レイアウト上で固定文言をベタに、貼り付ける事
もやりますし、レイアウトは固定で、テキスト文言を可変で表示する事もできま
す。
では、レイアウト自体を可変にすることは可能でしょうか?もちろん可能です。
DBの検索結果の表示などで、可変行を大量に出力する場合など、いちいちマウ
スで、文字出力枠を定義していると大変ですし、そもそも可変になりません。
可変に文字列出力枠を定義するには、createTextFieldメソッドにてTextField
オブジェクトを生成します。

〜〜〜〜〜    ここから postlist.as 抜粋   〜〜〜〜〜〜〜〜〜〜〜〜
         :
    // ─────── 項目毎に逐次処理 ───────→
    // 項目毎に逐次処理
    for (var j = 0; j