1

Flash(AS3)のステージ上にすでにあるTextFieldを次のように拡張する方法を探しています。

public class ChildTextField extends TextField 
{
    //code for childTextField comes here    
}

インスタンス名が「thetextfield」のTextFieldをステージに配置しました。ここで、このテキストフィールドのタイプがChildTextFieldであることをフラッシュに伝えたいと思います。したがって、私のドキュメントクラスでは、そのテキストフィールドをChildTextFieldとして宣言します。

public class DocumentClass extends Sprite()
{
    public var thetextfield : ChildTextField;
}

これにより、型強制失敗エラーがスローされます。ライブラリシンボルの場合と同じように、Flash IDEのテキストフィールドに使用されるクラスを変更することはできますか?

4

1 に答える 1

1

恐れません。拡張テキストフィールドクラスを追加する場合は、ActionScriptを使用する必要があります。

編集:ハックの方法があります。ソース: http: //board.flashkit.com/board/archive/index.php/t-738887.html

実際、私は以前にこの正確な問題に遭遇しました。私の場合、他の非コーダーアーティストが使用できるように、追加の動作を備えたテキストフィールドを作成しようとしていました。元のソリューションはすべてas3ですが、致命的な欠陥があり、現在のソリューションはas3とjsflの組み合わせです。

すべてのas3ソリューションは、2つのことを除いて優れています。まず、ビルド時ではなく実行時に発生します。つまり、ムービーが正しく初期化されない時間はごくわずかですが実際の部分です。第二に、ムービーに複数のフレームがある場合はうまく再生されません。基本的な考え方は、変更するTextFieldを検出し、それらを置き換えるものを構築してから、ステージ上でそれらを置き換えることです。これを行うには、TextFieldを拡張するか、TextFieldを含み、そのインターフェイスを処理するクラスを作成します。あなたが最初にやっているとしましょう。気になるすべてのフィールドをコピーするコンストラクターをSmartTextFieldに追加します。

public function SmartTextField(TextField tf)
{
this.text = tf.text; //continue with copy of anything relevant. 
}

メインムービーには、置換するTextFieldを検出して置換するコードがあります

 var toreplace:Array = findTextFields(); 
 var tf:TextField;
 var stf:SmartTextField; 
 var where:int;
 for (int i = 0; i < toreplace.length;i++)
 { tf = TextField(toreplace[i]);
   stf = new SmartTextField(tf); 
   where = getChildIndex(tf); 
    addChildAt(stf,where); 
    removeChild(tf); 
 }

上記の点を除いて、これは正常に機能します。

JSFLソリューションは少し複雑すぎて詳細を説明できませんが、基本は次のとおりです。必要な新しい動作でテキストフィールドをラップするas3クラスがあります。選択したアイテムを反復処理するjsflスクリプトを記述し、それがテキストフィールドの場合は、新しいラッパークラスのベースクラスを持つシンボルに変換します。これには、作成者時に発生するという利点があり、位置、インスタンス名、その他のものが自動的に保持されます。jsflには、解決すべき小さな厄介な癖がたくさんあるという欠点があります。

編集:もちろん、これが1つの映画のみの場合は、jsflコンバータースクリプトを使用せずに、手動で実行することもできます。シンボル->ラッパーベースクラスに変換します。

于 2009-10-24T10:48:44.197 に答える