失われるcapabilitiesの記憶[MX 2004] [Edit]

System.capabilitiesオブジェクトにアクセスすると、あるとき突然そんなものは知らないといわれることがあります。コンパイラが記憶喪失になるという悲しいバグです。

System.capabilitiesオブジェクトとSystem.setClipboard()メソッド
System.capabilitiesオブジェクトを使うと、Flash Playerやシステムの情報を調べることができます。たとえばSystem.capabilities.osプロパティは、オペレーティングシステムの詳しいバージョンを返します。

図001■System.capabilities.osはOSのバージョンを返す

そのほか、Flash Playerの再生されているシステム言語を返すSystem.capabilities.languageや、画面の解像度を調べるSystem.capabilities.screenResolutionX/screenResolutionYといったプロパティがあります。

System.setClipboard()メソッドは、指定したテキストをクリップボードにコピーします。コピー&ペーストの操作をスクリプトで実現する場合に、利用することができます。

きっかけはSystem.setClipboard()
2行のフレームアクションを、実行してみましょう。

System.setClipboard("test");
trace(System.capabilities.os); // コンパイルエラー

[ムービープレビュー]で確認すると、「capabilities'という名前のプロパティはありません」というエラーが表示されます。そして、2行目のステートメントが、問題の箇所とされています。

図002■[出力]パネルに表示されたエラー

しかし、System.capabilitiesプロパティは、もちろん存在します。不思議なことに、ステートメントの順序を入替えると、エラーは発しなくなります。

trace(System.capabilities.os); // エラーは発生しない
System.setClipboard("test");

さらに調べてみると、System.capabilitiesオブジェクトにアクセスする前にSystem.setClipboard()メソッドを実行すると、コンパイラがSystem.capabilitiesオブジェクトの存在を忘れてしまうようです。

したがって、対処法は、先にSystem.capabilitiesオブジェクトにアクセスしておけばよいということになります。

temp = System.capabilities; // オブジェクトに先にアクセス
delete temp; // 変数の存在が気になるようなら削除(省略可)
System.setClipboard("test");
trace(System.capabilities.os); // エラーは発生しない

その他の記事