2008年9月アーカイブ

今回は保存するデータの型についてです。

特に制限はないらしので調べてみました。

Number型

var localData:Number, newData:Number, lastData:Number;

newData = 2;

var so:Object = SharedObject.getLocal("nanlow");
so.data.localData = newData;
so.flush();

lastData = so.data.localData;
trace(lastData+"/"+typeof (lastData));
//出力:2/number

String型

var localData:String, newData:String, lastData:String;

newData = "nanlow";

var so:Object = SharedObject.getLocal("nanlow");
so.data.localData = newData;
so.flush();

lastData = so.data.localData;
trace(lastData+"/"+typeof (lastData));
//出力:nanlow/string

Boolean型

var localData:Boolean, newData:Boolean, lastData:Boolean;

newData = true;

var so:Object = SharedObject.getLocal("nanlow");
so.data.localData = newData;
so.flush();

lastData = so.data.localData;
trace(lastData+"/"+typeof (lastData));
//出力:true/boolean

Array型

var localData:Array, newData:Array, lastData:Array;

newData = new Array(1, 2, 3);

var so:Object = SharedObject.getLocal("nanlow");
so.data.localData = newData;
so.flush();

lastData = so.data.localData;
trace(lastData+","+typeof (lastData));
//出力:1,2,3/object

Array型の戻り値がobjectなのは以下を参照してください。
-->変数の型を調べる『typeof』

少し前まで、XMLデータとかと同じ認識でなんとなくStringでしか読めないと思ってました。

前回の続きです。

今回は書き込んだデータの使用・管理についてです。

まずはローカルデータにアクセスします。

var so:Object = SharedObject.getLocal("nanlow");

「data」プロパティを介して任意の名前の変数を取り出します。

lastDate=so.data.lastAccessDate;

これで、前回保存した変数データを使用することができます。

次にローカルデータをリセットしたいときです。

最初、すべての変数にundefindを渡していたんですが
調べてみたらもっと便利な物が。

so.clear();

この一行ですべてのデータを消去し、さらにローカルのファイルも削除してくれます。

ブラウザのクッキーに似てるけどFlashから直接変数とかを突っ込めるから結構便利。
フォームの一度記入した内容を保存したり、超簡易的なアクセスカウンターだってできます。

ローカルにデータ保存用のファイルが生成します。

var so:Object = SharedObject.getLocal("nanlow");

引数のストリングが保存するデータの名前です。
指定のデータがあればそれにアクセスし、読み取りが可能になります。

so.data.lastAccessDate=nowDate;

「data」プロパティを介して好きな名前の変数にデータを割り当て。

so.flush();

上で割り当てたデータを保存します。

データの保存先は以下の通り。

win
C:¥Documents and Settings¥"ユーザー名"¥Application Data¥Macromedia¥Flash Player¥#SharedObjects

mac
ユーザ¥"ユーザー名"¥ライブラリ¥Preferences¥Macromedia¥Flash Player¥#SharedObjects

色々やりかたはあると思うのですが
僕はXMLのフォーマットを固定し、
それに併せたクラスで解析するようにしています。

固定したXMLフォーマットの例が以下。

<?xml version="1.0" encoding="UTF-8"?>
<contents>
    <content>
        <img>img/001.jpg</img>
        <url>page1.html</url>
    </content>
    <content>
        <img>img/002.jpg</img>
        <url>page2.html</url>
    </content>
    <content>
        <img>img/003.jpg</img>
        <url>page3.html</url>
    </content>
</contents>

ここで言う固定とはノードの入れ子構造のことです。
3階層目に各データが入っている構成であれば
名前やその個数は自由です。

そして、下記がXMLデータを解析するクラス。

class MyXPath {
    static function xmlToArray(_xml:XML):Array {
        var reArr:Array = new Array();
        var entrys:Array = new Array();
        entrys = _xml.firstChild.childNodes;
        for (var i = 0; i<entrys.length; i++) {
            var entry:XMLNode = entrys[i];
            reArr[i] = new Array();
            for (var j = 0; j<entry.childNodes.length; j++) {
                reArr[i][entry.childNodes[j].nodeName] = entry.childNodes[j].firstChild.nodeValue;
            }
        }
        return reArr;
    }
}

xmlToArray関数にXMLを渡すと2次元配列として戻ってきます。

2次元目がノード名をキーワードにした連想配列となっているところが
個人的なお気に入りポイントです。

Flash部分のソースだけに縦横100%の指定をしがちですが、
ドキュメントタイプ宣言の種類によっては正確に表示されないことがあるらしいです。

回避方法としては、swfを内包する全てのブロック要素に

width:100%;
height:100%;

を指定する必要があるらしいです。

フルフラッシュのコンテンツであれば特に他に影響する箇所でもないですし、
body以下swfにたどり着くまでの全部にまとめてかけといた方がよさそうですね。

2

このアーカイブについて

このページには、2008年9月に書かれたブログ記事が新しい順に公開されています。

次のアーカイブは2008年10月です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。