[AS]FocusManagerインスタンスを生成した状態で、InteractiveObjectのtabEnabledをfalse > trueに切り替えると、focusRectが利かなくなる

タイトルどおりの挙動に出くわした。

以下、再現する環境
メインタイムラインには、ボタンインスタンスとテキストフィールド(Input状態)が配置してあるとする。
ボタンインスタンスのインスタンス名:_btn

import fl.managers.FocusManager;
var focusManager:FocusManager = new FocusManager(this);
_btn.tabEnabled = false;
_btn.tabEnabled = true;

これで、パブリッシュし、Tabキーを押すと、テキストフィールドのカーソルからフォーカスは移動していることがわかるが、ボタンにフォーカスがあたっている状態で、黄色の枠が表示されない。
ちなみに、
var focusManager:FocusManager = new FocusManager(this);
この一文がなければ、黄色の枠は表示される。

黄色枠を表示させたい場合は明示的にfocusRectをtrueにしてあげればOK。
なんか面倒だ。

import fl.managers.FocusManager;
var focusManager:FocusManager = new FocusManager(this);
_btn.tabEnabled = false;
_btn.tabEnabled = true;
//これで_btnがフォーカス時に黄色枠が表示される
_btn.focusRect = true;

[AS]コンテンツ内のTabキーでのフォーカス移動を無効にする。

Tabキー対応は本気でやると結構面倒なので、いっそ全部無効にしてしまった方がいいかも.
素敵サイトもTabキーでバグること多々あり・・・

//これでひとまず全部無効(多分)
stage.stageFocusRect = false;

ただし個別のオブジェクトでfocusRectをtrueしてる場合は個別対応が必要

以下、InteractiveObject.focusRectプロパティ引用

このオブジェクトがフォーカス矩形を表示するかどうかを指定します。true、false または null の 3 つの値のいずれかを指定できます。true および false の値は、予想されるとおり、フォーカス矩形を表示するかどうかが指定されます。null 値は、このオブジェクトが Stage の stageFocusRect プロパティに従うことを示します。

[AS]内部にムービークリップを持つMCをgoAndStop()でMCが存在しないフレームへ移動したあとMCが存在するフレームに戻しても内部MCはnull参照になるみたい

タイトルが何言ってるかよくわからないと思うので、以下のフレームアクションを参照ください。

前提条件
//メインタイムラインにMovieClipインスタンス(インスタンス名:_mc1)を配置
//_mcの内部は全2フレームで、1フレーム目にフレームアクションstop();を記載
//_mcは内部の1フレーム目にのみ、MovieClipインスタンス(インスタンス名:_mc2)を持つ
//_mcの2フレーム目は何もない状態。

//ステージにMovieClipインスタンス(インスタンス名:_mc1)を配置
//_mcの内部は全2フレームで、1フレーム目にフレームアクションstop();を記載
//_mcは内部の1フレーム目にのみ、MovieClipインスタンス(インスタンス名:_mc2)を持つ
//_mcの2フレーム目は何もない状態。

trace("before _mc1:"+_mc1);
//出力:before _mc:[object Timeline_1]
trace("before _mc1._mc2:"+_mc1._mc2);
//出力:before _mc._btn:[object SimpleButton]

var mc:MovieClip = _mc1._mc2;
mc.buttonMode = true;

trace("before numChildren:"+_mc1.numChildren);
//出力:before numChildren:1
trace("before getChildAt:"+_mc1.getChildAt(_mc1.numChildren-1));
//出力:before getChildAt:[object MovieClip]

//_mcの2フレーム目に移動(_btnがないフレーム)
_mc1.gotoAndStop(2);
//_mcの1フレーム目に移動(_btnがあるフレーム)
_mc1.gotoAndStop(1);

trace("after _mc1:"+_mc1);
//出力:after _mc1:[object Timeline_1]
trace("after _mc1._mc2:"+_mc1._mc2);
//出力:after _mc1._mc2:null
trace("after mc:"+mc);
//出力:after mc:[object MovieClip]

trace("after numChildren:"+_mc1.numChildren);
//出力:after numChildren:1
trace("after getChildAt:"+_mc1.getChildAt(_mc1.numChildren-1));
//出力:after getChildAt:null

//nullでないmcが_mc2と同じと思いきや、そうでもない様子
mc.buttonMode = true;//マウスカーソルにならない

ちなみにこれはFlashPlayer9での書き出しの場合。
FlashPlayer10での書き出しの場合は、上記スクリプトのnullの部分が全部Mcとなる。
・・・が、元のMcを挿しているわけでは無いようで、最後のbuttonModeは適応されない。

だいぶAS3と戯れてきたと思ったはずなのに今始めてしった挙動。。。

Flash-JPに似たような内容の記事がありました。
http://www.flash-jp.com/modules/newbb/viewtopic.php?topic_id=8525&forum=20

[AS]ステージに配置したRadioButtonコンポーネントをRadioButtonGroupに反映させる方法

ちょっとだけハマってしまったのでメモ。

FlashIDE上でRadioButtonをステージに配置して、プロパティのパラメータからgroupNameを設定。
groupNameからRadioButtonGroupインスタンスを作りたい。

◆前提条件
ステージにラジオボタンを配置
プロパティgroupNameには、hogeという名前を設定

◆失敗例

var radioButtonGroup:RadioButtonGroup = new RadioButtonGroup("hoge");
trace(radioButtonGroup.numRadioButtons) //出力:0 (1と出て欲しい)

◆成功例

var radioButtonGroup:RadioButtonGroup = RadioButtonGroup.getGroup("hoge"); 
trace(radioButtonGroup.numRadioButtons) //出力:1 (想定どおり)

ステージに配置してあるRadioButtonのグループ名を取得するにはRadioButtonGroup.getGroup(“グループ名”)メソッドを使うってこと。
new RadioButtonGroup(“hoge”);は動的に生成したRadioButtonを紐付けたいときとかに使う、多分。