おいしいAS3 -45ページ目

iTunesみたいなサムネール

iTunesみたいな感じのサムネール
つくることになったけど、さて
PaperVision3D使おうかな?

そこまでする必要ないか・・・


っていうかサイト全体としては
3Dのイメージでは作ってないし
バリバリ3Dのものがあると
ちょっと違和感あるし

あくまで操作感がそんな感じ
っていうところにしておこう

例のごとく作りながらコードを考えていくけど、まずは
前に作ったCSVクラスのdataプロパティを使う事を前提に
サムネールのクラスを作って
クリックされたサムネールに対応するObjectを
引数にして指定のFunctionを実行する
ということをさせるようにしようと思います

CSVを読み込む

CSVを読み込んで使うことになったけど
文章の入ったセルがあるもんだから
どこで改行やコンマが入ってくるかわからない

ダブルクォートで囲まれた改行とコンマは
無視してsplitするようにしないと


一応全てのセルがダブルクォートで囲まれてるから
"CRLF"で最初に、次に","でsplitするという手もあるけど
この際だから規格にそってるCSVならちゃんと対応できる
CSV読み込み用のクラスを作っておきたい

規格では改行やコンマのあるセルはダブルクォートで
囲まなきゃだめだけどそれ以外はどっちでもいいってなってる

ということでこの記事更新しながら
コードを考えていきます


■使う方
データグリッド使って見てみる

UIコンポーネントなんでDataGridがライブラリにないと書き出せない
UIコンポーネント・・・便利なんだけど不便だ


import fl.controls.DataGrid

var csv=new CSV("product.csv")
var tbl=new DataGrid()
addChild(tbl)
tbl.width=stage.stageWidth
tbl.height=stage.stageHeight
tbl.horizontalScrollPolicy="on"

csv.addEventListener(Event.COMPLETE,onComp)

function onComp(e){
for(var clm in e.target.data[0]){
tbl.addColumn(clm).width=100
}
for each(var item in e.target.data){
tbl.addItem(item)
}
}



■肝心のクラス

紆余曲折あってダブルクオート囲みセル中のダブルクオート囲みという
おいおい・・・・っていう状態にも対応した

temp用の変数が多くなって読みにくい・・・


/*
CSV読み込み用のクラスです

■パブリックプロパティ
data:Array 読み込んだcsvのフィールドのオブジェクトの配列です
■パブリックメソッド
load(URL)
■イベント
COMPLETE 読み込みが完了したら発信します
*/

package simplizer.page{

import flash.system.System
import flash.events.*
import flash.net.URLRequest
import flash.net.URLLoader

public class CSV extends EventDispatcher{

public var data:Array=new Array()
public var debugMode:Boolean=false

public function CSV(url:String){
load(url)
}
public function load(url:String){
//System.useCodePage=true
new URLLoader(new URLRequest(url)).addEventListener(Event.COMPLETE,onComp)
function onComp(e){
var csvTxt:String=e.target.data
data=csvToList(csvTxt)
dispatchEvent(new Event(Event.COMPLETE))
if(debugMode){
trace("CSV読み込み完了\n")
trace("▼▼▼CSV内容▼▼▼\n")
for each(var obj in data){
for(var ind in obj){
trace(ind+" = "+obj[ind])
}
trace("\n")
}
trace("\n▲▲▲CSV内容▲▲▲\n")
}
}
}
private function csvToList(csvTxt:String):Array{
csvTxt=csvTxt.replace(new RegExp("[\r\n]+","gn"),"\n")
var rtn:Array=new Array()
var tmpArr:Array=splitCR(csvTxt)
for each(var row in tmpArr){
rtn.push(splitCM(row))
}
return arr2DtoObjArr(rtn)
function splitCR(csvStr:String):Array{
if(csvStr.search('"')==-1){
return csvStr.split("\n")
}else{
var rtn:Array=[]
var frg:Boolean=false
var tmpArr:Array=csvStr.split("\n")
for(var i=0;i<tmpArr.length;i++){
if(frg){
rtn.push(rtn.pop()+"\n"+tmpArr[i])
}else{
rtn.push(tmpArr[i])
}
if(tmpArr[i].match('"')!=null){
if(tmpArr[i].match('"').length%2==1)frg=!frg
}
}
return rtn
}
}
function splitCM(csvRow:String):Array{
if(csvRow.search('"')==-1){
return csvRow.split(",")
}else{
var rtn:Array=[]
var frg:Boolean=false
var tmpArr:Array=csvRow.split(",")
for(var i=0;i<tmpArr.length;i++){
if(frg){
rtn.push(rtn.pop()+","+tmpArr[i])
}else{
rtn.push(tmpArr[i])
}
if(tmpArr[i].match('"')!=null){
if(tmpArr[i].match('"').length%2==1)frg=!frg
}
}
return rtn
}
}
function arr2DtoObjArr(arr2D:Array):Array{
var rtn:Array=new Array()
for(var i=1;i<arr2D.length;i++){
var obj=new Object()
var arr=arr2D[i]
if(arr2D[0].length==arr.length){
for(var j in arr){
obj[arr2D[0][j]]=arr[j]
}
rtn.push(obj)
}
}
return rtn
}
}
}
}



追記:Flashの自動インデントを使うとコードがおかしくなります
どうやら一行に内容を詰めすぎるとよくないみたい
addEventListenerで関数の名前じゃなく直接関数を書いても
おかしなことになってしまうし・・・便利なんだけど不便だ


さらに追記:
ダブルクオート付きのCSVを読み込めるようにしたけど
逆にダブルクオートのないCSVでよみこみに問題ある事が判明
ちょっと書き直してます


またまた追記:
訂正しました、処理順がまったく変わりましたが
クラスの機能とかプロパティは全然変わってません

マウスチェイサー




オリジナルのPictクラスを使ったマウスチェイサー

計算量を多いからタイムラグ発生するかと思ったら全然大丈夫だった