- ベストアンサー
createTextFieldでスクロールバーをつける方法とは?
- createTextFieldを使用してテキストフィールドを作成し、そのフィールドにコンポーネントを適用してスクロールバーを付けることはできないのか?
- Windows XP Flash MX Professional 2004を使用しているが、スクロールバーの取り付けができず困っている。
- ダイナミックテキストのフィールドにコンポーネントを適用させることで、スクロールバーが表示されることがわかったが、スクリプトで作成したテキストフィールドにコンポーネントを適用させることはできない。アドバイスを求める。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#1です。 まず、「ライブラリ」パネルに UIScrollBar コンポーネントのシンボルはありますでしょうか? スクリプトだけ貼り付けても、ライブラリにスクロールバーのシンボルがなければ話が進みません。 Flash MX 2004 には最初は UIScrollBar コンポーネントがなく、バージョン 7.2 にアップデートすると追加されます。 起動時に出てくるタイトル画面か、「ヘルプ」メニュー→「 Flash Professional について」を選択すると、右下の方に Flash MX 2004 のバージョンが表示されます。 7.2 以外のバージョンになっている場合は、Adobe 社のサイトでアップデータを入手してアップデートしてください。 ・ Macromedia Flash MX 2004、Flash MX Professional 2004 バージョン7.2 日本語版アップデータ http://www.adobe.com/jp/support/flash/downloads.html#flashmx2004 UIScrollBar のコンポーネントが追加されましたら、「コンポーネント」パネル(表示されていない場合は「ウィンドウ」メニュー→「開発パネル」→「コンポーネント」)から UIScrollBar コンポーネントのシンボルをステージにドラッグします。 これで、「ライブラリ」パネルにスクロールバーのシンボルが登録されます。 ステージに作られたインスタンスは削除してください。 リンケージの設定はとりあえず変更しなくても構いません。 attachMovie でスクロールバーが無事に挿入されたとしても、テキストフィールドに表示するテキストの行数が少なくスクロールの必要がない場合、スクロールバーは表示されずトラック(バーが移動するレール)の白い部分だけが表示されます。 スクロールバーがなくてもトラックだけでも表示されていれば、attachMovie はとりあえず成功しています。 トラックも何も表示されない場合は、attachMovie がそもそも失敗しているものと思われます。 リンケージ名の指定や、「リンケージプロパティ」でシンボルを最初のフレームに書き出すかどうかのチェックが外れていないかどうか確認してみてください。 チェックを外した場合は、シンボルを書き出すためにダミーをフレーム1以外のフレームに配置する必要があります。 attachMovie は、シンボルが書き出されるフレームよりも後で実行してください。 シンボルが書き出されているフレームよりも前のフレームで実行すると、シンボルが未定義になっていて attachMovie が失敗してしまいます。 また、UIScrollBar コンポーネントは ActionScript 2.0 という規格のスクリプトで作られています。 「パブリッシュ設定」の” Flash ”のタブに、「 ActionScript のバージョン:」という項目があります。 このリストで、必ず” ActionScript 2.0 ”を選択してください。 ちなみに Flash Player のバージョンは、ヘルプには 6 (ただし初期の Flash Player 6 は不可)でもいいようなことが書いてありますけれど、7 にした方が安全です。 -------------------------------------------------------------------- createTextField メソッドで作られるテキストフィールドは、単一行( multiline = false )・折り返しなし( wordWrap = false )になっています。 つまり、改行コードや <BR> タグがあっても無視して、1行にひたすらズラズラと出力するだけのテキストフィールドです。 これでは、たとえ何行もあるテキストを表示させたとしても結局は1行しかないことになり、スクロールバーは出てきません。 スクロールバーを利用する場合は、折り返しを必ず”あり”( wordWrap プロパティを true )に設定する必要があります。 スクリプトをまとめてみますと、大体、次のようになります。 このスクリプトはフレームに設定してください。 ライブラリに UIScrollBar コンポーネントのシンボルがあり、リンケージは初期設定のまま変更していないものとします。 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください) //テキストフィールドを作成 this.createTextField("my_txt", 10, 5, 60, 205, 240); //スクロールバーを挿入し、テキストフィールドに関連付ける this.attachMovie( "UIScrollBar" , "sc_bar" , 11 , { _x : 210 , _y : 60 , _height : 240 } ); sc_bar.setScrollTarget( my_txt ); //テキストフィールドの設定 //HTMLを有効・複数行・折り返しあり・境界線あり my_txt.html = true; my_txt.multiline = true; my_txt.wordWrap = true; my_txt.border = true; //ダミーのテキストを表示 //(このテキストは作品に合わせて変更してください) my_txt.htmlText = "<B>あいうえお<BR>かきくけこ<BR>さしすせそ<BR>たちつてと<BR>なにぬねの<BR><BR></B>"; my_txt.htmlText += "<I>いろはにほへと<BR>ちりぬるを<BR>わかよたれそ<BR>つねならむ<BR><BR></I>"; my_txt.htmlText += "<U>1234567890</U><BR><BR>"; my_txt.htmlText += "ABCDEFG"; //テキストフィールドの文字サイズを20ptに設定 format = new TextFormat(); format.size = 20; my_txt.setTextFormat( format ); ↑行頭の全角のスペースにだけ気を付けてコピーしていただければ、境界線のあるテキストフィールドにスクロールバーが付いて表示されます。(動作確認済み) 表示しているテキストはただの詰め物です。実際の作品では適宜変更してください。 なお、「ムービープレビュー」ではなぜか、1度テキストフィールドをクリックするかスクロールバーを動かすなどの操作をしないと一部のタグ(この例では <I> タグ)が有効にならないことがあるようです。 これはムービープレビューの時だけ起こる現象で、パブリッシュして HTML ファイルに組み込んだ時やスタンドアロンプレイヤーでは最初から有効になっています。
その他の回答 (1)
- DPE
- ベストアンサー率85% (666/776)
予めテキストフィールドの位置も場所も決まっているのでしたら、その”配置予定地”を元にスクロールバーの位置を決めて、コンポーネントのインスタンスを最初から設置しておいてはいかがでしょう。 コンポーネントとは、編集可能なパラメータを持っている”ムービークリップ”です。 UIScrollBar コンポーネントは _targetInstanceName というパラメータを持っており、普段はここにスクロールさせたいテキストフィールドのインスタンス名(ターゲットパス)を指定するだけで利用できます。 しかし、今回の件ではスクロールさせるテキストフィールドは最初はステージに存在していないため、このパラメータにインスタンス名を指定しておいても無効になってしまいます。 これは要するに、テキストフィールドがステージに現れてからスクロールターゲットを指定すればいいということです。 スクロールバーのインスタンスを配置した場合は、createTextField でテキストフィールドを作った後で setScrollTarget メソッドでテキストフィールドのインスタンス名を指定してみてください。 ------------------------------------------------------------------ 先述の通り、コンポーネントは編集可能なパラメータを持っているムービークリップです。 ですから、ムービークリップが持っている機能や使えるスクリプトは、基本的にはコンポーネントでも利用できます。 (ただし、一部のスクリプトはコンポーネントの動作に支障をきたすことがあります) ライブラリにあるムービークリップシンボルは、attachMovie メソッドでムービーに動的に挿入できます。 attachMovie は UIScrollBar コンポーネントでも使用できます。 予めステージにスクロールバーを置かず、attachMovie で後から挿入する方法もあります。 attachMovie を使うには”リンケージ”という設定が必要です。 「コンポーネント」パネルから UIScrollBar コンポーネントをステージにドラッグすると、コンポーネントのシンボルが「ライブラリ」パネルに登録されます。 このシンボルには既にリンケージが設定されていますから、特に問題がなければリンケージの設定は不要です。 ステージにドラッグした時にスクロールバーのインスタンスが作られますが、これは削除してください。 後は普通のムービークリップと同様に、attachMovie でステージに配置できます。 スクロールバーのコンポーネントに設定されているリンケージ識別子は” UIScrollBar ”です。 ************************************ ご質問文のテキストフィールドの右端に縦のスクロールバーを付けるスクリプトは、次のようになります。 createTextField を実行した後に、このスクリプトを追加してください。 テキストフィールド(この場合は my_txt )の htmlText プロパティに表示する文字列を代入した後で setScrollTarget を実行すると、スクロールバーが動かなくなることがあります。 この代入演算を行う前に関連付けを済ませておいた方が無難だと思います。 (↓各行頭に全角のスペースが入っています。コピーする際はご注意ください) //スクロールバーを挿入し、テキストフィールドに関連付ける this.attachMovie( "UIScrollBar" , "sc_bar" , 11 , { _x : 210 , _y : 60 , _height : 240 } ); sc_bar.setScrollTarget( my_txt ); 挿入したスクロールバーには” sc_bar ”というインスタンス名を付けています。 以降は、” sc_bar ”という名前で追加したスクロールバーを操作できます。 attachMovie の引数で { } の中に入れて渡しているものはスクロールバーの位置と高さで、これらが sc_bar の各プロパティに設定されます。 スクロールバーのコンポーネントの基準点は左上で、この点の座標がスクロールバーの _x と _y プロパティに入ります。これを元に位置を決めてください。 createTextField で作ったテキストフィールドも、基準点は左上です。 つまり、例えば X = 5 ・ Y = 60 の地点に幅 205 ・高さ 240 のテキストフィールドを作ったとすると、右端(フィールドの外にスクロールバーを置く場合)とは X = 210 ・Y = 60 ということになります。 3番目の引数である深度(重ね順)は簡単に言いますと、数値の大きいものほど上に表示されます。 例えばテキストフィールドの深度を 10 にしたのなら、スクロールバーには 11 以上の深度を指定してください。 9 以下にすると、テキストフィールドの方が上に表示されます。 テキストフィールドが上になっていると、テキストフィールドに境界線や背景がある場合は特に、スクロールバーが見えなくなったり左端が欠けて表示されることがあります。 ************************************ デフォルトでは、スクロールバーのコンポーネントはフレーム1(最初のフレーム)に書き出されます。 Flash に付属のコンポーネントには複雑なスクリプトが組み込まれているため、概して容量が大きくなっています。 プリロード画面を作っている場合は、フレーム1に大量のデータが書き出されるとプリロードのアニメ等がなかなか始まらなくなってしまいます。 「ライブラリ」パネルでスクロールバーのコンポーネントのシンボルを選び、右クリックで出すメニューから「リンケージ...」を選択してください。「リンケージプロパティ」パネルが開きます。 「リンケージ:」の項目に”最初のフレームに書き出し”という項目があり、最初はチェックが入っています。 このチェックを外してください。 このチェックを外したシンボルは、何もしなければムービーに書き出されなくなります。 しかし、タイムラインのどこかに配置してあれば、最初に登場するフレームに1度だけシンボルが書き出されます。 この特徴を利用して、ムービーに書き出すためのダミーのインスタンスをフレーム1以外のフレームに置いておくと、任意のフレームに書き出すことができます。 attachMovie で動的に挿入しようとすると少々面倒です。 「ムービープレビュー」ではムービーが全て読み込まれた状態になっているのであまり問題が起こらないのですが、実際にネットで公開した時は、シンボルが読み込まれているかいないか、テキストフィールドが無事に作られたかどうか、テキストが読み込まれたかどうかなど、ごくわずかなタイミングの違いで動作が不安定になる可能性もあります。 テキストフィールドの位置も大きさも決まっているのでしたら、わざわざスクリプトでテキストフィールドを作る必要もないと思います。 最初からテキストフィールドとスクロールバーを配置しておくと、位置や大きさもムービー編集中に画面を見ながら変更できて扱いも簡単です。 ヘルプでは、ムービークリップやテキストフィールドをスクリプトで動的に作っているサンプルをよく見かけます。 これは、”インスタンス名を○○と付けて、このスクリプトをどこそこに書く”などとややこしいことをしなくても、スクリプトをコピーするだけで動作を確認できるようにするという、それだけの理由です。 ムービークリップやテキストフィールドをスクリプトで動的に作ることが推奨されているのではありません。
お礼
DPEさん。要領を得ない質問に丁寧に回答していただき、ありがとうございます。 早速これから、試してみようと思います。
補足
返事が遅れて大変申し訳ありません。 アドバイスいただいたようにやってみたのですが、スクロールバーを付けることができませんでした。 //スクロールバーを挿入し、テキストフィールドに関連付ける this.attachMovie( "UIScrollBar" , "sc_bar" , 11 , { _x : 210 , _y : 60 , _height : 240 } ); sc_bar.setScrollTarget( my_txt ); これを貼り付けさせていただいたのですが、できませんでした。 もう少し、アドバイスをいただけないでしょうか? よろしくお願いします。
お礼
お礼が遅れて大変申し訳ありません。 教えて頂いた通りにしたところ、スクロールバーの取り付けに成功しました。 本当にありがとうございます。