2009年6月30日火曜日

文字コードチェック

Flash の文字コードは UTF-8 で、以下のようにしたら文字のコードを見られる。
var msg:String = 'この文字列をコードで見てみる';
for (var i:uint = 0; i < msg.length; i++ ) {
 trace('msg [' + msg.charCodeAt(i).toString(16) + ']');
}

2009年6月22日月曜日

MySQL プロシージャ実行時に文字化けとか Incorrect string value とか

ブラウザの文字コード UTF-8

mysql> status
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Server characterset:    latin1
Db     characterset:    utf8
Client characterset:    latin1
Conn.  characterset:    latin1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

エラーがなく通るも、画面上で文字化け

mysql> charset utf8
mysql> status
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Server characterset:    latin1
Db     characterset:    utf8
Client characterset:    utf8
Conn.  characterset:    utf8
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

プロシージャ実行中にエラー
ERROR 1366 (HY000): Incorrect string value: 'xxxxxxxxx' for column 'xxxxxxxx' at row xx

mysql> SET character_set_client = sjis;
mysql> status
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Server characterset:    latin1
Db     characterset:    utf8
Client characterset:    sjis
Conn.  characterset:    latin1
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

エラーなく通るも、画面上で文字化け

mysql> SET character_set_client = sjis;
mysql> SET character_set_connection = utf8;
mysql> status
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Server characterset:    latin1
Db     characterset:    utf8
Client characterset:    sjis
Conn.  characterset:    utf8
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

問題なく通る

2009年6月16日火曜日

クラス名を変数や文字列で指定してインスタンス化する

import flash.utils.getDefinitionByName;

var foo:Class   = getDefinitionByName('MyClass') as Class;
var myClass:MovieClip   = new foo();

2009年6月13日土曜日

XMLファイルの取り扱いについて

PHPやJavaなど、webサーバ側で簡潔するものなら気にならなかったんだけど、Flashの場合、XMLファイルを扱おうとすると、DocumentRoot 配下に設置せざるを得ないと思うんだけど、それだと、セキュリティ的に問題あり。 こういうときは皆さんどうしてるんでしょう。

2009年6月12日金曜日

addedToStageについて

http://www.harhid-labo.com/p1/index.php?Added-To-Stageイベント
ADDED_TO_STAGEイベントは、DisplayObject(またはそれ自体を含むツリー)がステージに追加されると、 DisplayObjectに対して送信されます

つまり、ドキュメントクラスにこのリスナーを登録した場合、自分自身がステージに追加されると、ドキュメントクラスに対して送信されるので、ステージが参照できるということ。

ドキュメントクラスはステージの子であるようなので、ステージには直接配置せず、ドキュメントクラスないし、その子のDisplayObjectに追加してあげるのが理想か。

ドキュメントクラスがステージに配置されるのは最初だけ。 ドキュメントクラスはステージオブジェクトの参照を持っておくほうが無難。 addToStage イベントが発行されるのは、リスナーを登録したクラスのコンストラクタが終わってから。

Loader クラスで他の swf を読み込んでも、 stage は共通。 Loader クラスで他の swf を読み込んだとき、読み込み元の DisplayObject がstage の子なら、Loader クラスインスタンスを DisplayObject に addChild() した時に、addToStage イベントが発行される(はず)。

Stage にはドキュメントクラスが子として配置されている。Stage 以下の DisplayObject を全て削除するということは、ドキュメントクラスのインスタンスも、削除されてしまう。

DisplayObject は、直接 Stage の子として扱わないほうがいい、と思う。たぶん。 配置する DisplayObject はあくまでドキュメントクラスの子として、もしくはそれが持つ DisplayObject の子として定義するのが自然だと、今の段階の私は思った。

2009年6月8日月曜日

LocalConnection で Object型 を send するときの罠

そういうものなのかはよくわからないけど。

LocalConnection はカスタムクラスを swf 間でやり取りできなくはないけど、インスタンスそのものではなく、プロパティしか送ることができない。AMF形式というものに圧縮されて送られるそうだけど、その詳細はまだよくわかりません。なので、public 型および、明示的な getter, setter だけが渡せるという話だったんだけど、そこで躓いた。

クラスのプロパティを private として定義するときは、当然 public アクセスしてほしくない値だからで、その値に getter と setter を両方用意することはナンセンスだと思ってた。なので、private なプロパティを含むカスタムクラスを LocalConnection で send するときも、当然 getter しか用意しなかった。そこに落とし穴があった。

setter のないプロパティは、send 先で取得することができない。おそらく、AMF形式とやらから解凍するとき(unserialize?)に、値をセットするんだろうけど、それができないんじゃないだろうか(要調査)。じゃあ public でいいじゃない?

ずいぶん時間をとられたけど、ひらめいたとき、これが答えであってほしいような、ほしくないような気持ちがなんとも気持ち悪い感じでした。

2009年6月3日水曜日

Loderクラスで読み込んだ swf のstage が null

Loader クラスを使用して読み込んだ swf で、stage を参照しようとすると null となる。なんとなくそういうものなんだと思っていたら、よくないのは、参照するタイミングだったらしい。 タイミングは、Event.ADDED_TO_STAGE というイベントで取得することができる。stage の初期化を取得するのかとも思ったけど、リファレンスを読んでると、どうも違う? 後々で調べてみよう。

AS3.0 クエリストリングの値を取得

http://flamemo.blogspot.com/xxxx.swf?id=hoge&pw=fuga とかのリクエストからクエリストリングの値を取得するには、loaderInfo.paramtersを参照。 DisplayObject が loaderInfoプロパティを持っています。
var id:String = loaderInfo.parameters['id'];
var pw:String = loaderInfo.parameters['pw'];
txtLog.text = 'id : ' + id + "\n" + 'pw : ' + pw;