海外旅行から帰ってきたら、まず何を食べる?

お世話になります。FLASH8の質問です。

外部テキストをloadVariablesでムービークリップの中にロードする際に、「HTMLレンダリング」をonにして<font color="#cc0000">したいのですがうまくいきません。

ムービークリップは二つ(インスタンス名:「title_mc」「honbun_mc」)あり、それぞれがダイナミックテキストボックスを持ち、インスタンス名を「title_txt」「honbun_txt」としています。

テキストファイルは"text.txt"で、
内容は
title=・・・
&honbun=・・・<font color="#cc0000">・・・</font>・・・

シーン1の1フレーム目に
this.loadVariables("text.txt");
this.onData = function() {
this.title_mc.title_txt.text = title;
this.honbun_mc.honbun_txt.text = honbun;
};

プロパティパネルの変数ボックスには何も記入していません。
この方法で出来ると思うのですが・・・うまくいきません。
HTMLレンダリングはムービークリップ内では効かないのでしょうか?それとも何かコツがありますか?

よろしくお願いします。

A 回答 (3件)

#1です。




LoadVars を使う場合は、次のようなスクリプトになります。
このスクリプトは、テキストフィールドを持つムービークリップを配置したタイムラインのフレームに設定してください。

(↓各行頭に全角のスペースが入っています。コピーする際は、全て半角のスペースかタブに置き換えてください)



 //LoadVarsオブジェクトを作成
 load_obj = new LoadVars();

 //読み込みが済んだ時の処理
 load_obj.onLoad = function( success )
 {
  //読み込みが成功したら、
  //読み込んだ変数をHTMLとしてレンダリングして表示
  if( success )
  {
   title_mc.title_txt.htmlText = this.title;
   honbun_mc.honbun_txt.htmlText = this.honbun;
  }
 };

 //Shift-JISで読み込む
 System.useCodepage = true;
 load_obj.load( "text.txt" );



var と「 : 」による型の明示は省略させていただきました。Flash Player 6 以上、ActionScript 1.0 でもパブリッシュできます。
テキストファイルの文字コードを UTF - 8 にした場合は、

 System.useCodepage = true;

↑この1行を削除するかコメントにしてください。

*******************************

loadVariables も LoadVars.load も、外部から情報を読み込むことが主な仕事です。
外部から情報を読み込む場合は、「変数名=値」という形で情報を用意し、Flash では変数として扱う方法が一般的です。

例えば、テキストファイルの内容が

 title=サンプル
 &honbun=本文:<font color='#cc0000'>ここだけ色が変わる</font>

だとします。
これを loadVariables か LoadVars.load で読み込むと、” title ”と” honbun ”という名前の変数が用意され、その内容がそれぞれ”サンプル””本文:<font color=・・・</font>”になります。


trace は、指定のメッセージや変数の内容などを「出力」パネルに表示するアクションです。
ですから、上記のスクリプトの onLoad = function の中で

 trace( this.honbun );

と書くと、読み込まれた変数 honbun の内容である、タグの付いたままの文字列が「出力」パネルに表示されます。

trace は主に、スクリプトを書く時に、変数の値が何になっているか・関数が呼び出されているかどうかなどを確認するために使います。
trace アクションによってテキストフィールドに文字列が表示されるのではありません。


文字列や変数の内容をテキストフィールドに表示したり HTML タグを解釈して文字を装飾するのは、TextField クラスという別の担当者の仕事です。
タグをレンダリングしてテキストフィールドに表示する時は、trace の代わりに、テキストフィールドが持っている htmlText プロパティに読み込んだ変数を代入するスクリプトを書きます。

-------------------------------------------------------------------

ActionScript では、変数や関数・インスタンスなどには全て持ち主がいると考えます。
この持ち主を正確に指定しないと、目的のものを利用することができません。
持ち主の指定のことを”ターゲットパス”といいます。

ターゲットパスにはいろいろな書き方があり、this を使った書き方もそのうちの1つです。
this は使う場所によって指す相手が変わってしまうクセモノです。
慣れないうちは何にでも付けてしまいがちですが、this を付けても付けなくても同じ場合もあれば、this を付けないと上手く指定できないもの、逆に this を付けたために失敗してしまうこともありますので、注意が必要です。

*******************************

先述の LoadVars を使ったスクリプトで、onLoad = function の中を見てみてください。

 title_mc.title_txt.htmlText = this.title;
 honbun_mc.honbun_txt.htmlText = this.honbun;

↑この部分が、LoadVars で読み込んだ変数の内容をテキストフィールドに表示するスクリプトです。

ご提示のスクリプトですと、ムービークリップの名前の前に this が付いていますよね。
読み込んだ変数である” title ”と” honbun ”の前にはありませんが、今回の例では逆に、こちらの方に this を付けています。


LoadVars.load で読み込んだ変数は、読み込みを担当した LoadVars オブジェクトのものになります。
先述のスクリプトですと、load_obj という LoadVars オブジェクトのものになっています。

onLoad はイベントハンドラといって、一種の変数のようなものです。
変数と似たようなものですから、イベントハンドラにも当然、持ち主がいます。
今回の例では、onLoad の持ち主は load_obj です。

イベントハンドラには関数を登録します。
登録される関数の中での this は、イベントハンドラの持ち主のことを指します。
つまり、

 this.title

は” load_obj が持っている変数 title ”という意味になり、読み込まれた変数を利用することができます。

*******************************

ステージに配置したインスタンスや、メインのタイムラインで特に何も指定せずに宣言した変数などは、通常は _root というムービークリップのものです。
先の load_obj も、スクリプトをメインのタイムラインに書いたのなら _root のものです。

ターゲットパスは省略して書くこともできます。
タイムラインでターゲットパスを省略すると、これはそのタイムラインの持ち主を表します。
ですから、メインのタイムラインで

 load_obj = new LoadVars();

と書くと、この load_obj は _root のものになるのです。


省略した時の対象は関数の中などでも同様で、この関数が定義されているタイムラインの持ち主を指します。
つまり、onLoad = function の中の

 title_mc.title_txt

↑これは、”メインのタイムラインの持ち主= _root にあるムービークリップ title_mc の中のテキストフィールド title_txt ”と解釈されます。

これに this を付けると、どうなるでしょうか?
onLoad = function の中での this は、onLoad の持ち主である load_obj を指します。
しかし、load_obj は title_mc というムービークリップを持っていません。
この場合は this を付けると、目的のテキストフィールドの持ち主を正確に指定できないために、読み込んだ文字を表示できなくなってしまいます。

同じように考えると、onLoad = function の中で、読み込んだ変数 title と honbun には this を付けなければならない理由も見えてくると思います。
this がないと、これらの変数は、関数が定義されている _root のものだと解釈されます。
ですが、読み込まれた変数は LoadVars オブジェクト load_obj のものであって、_root のものではありません。


ちなみに、loadVariables で読み込む時に使う onData もイベントハンドラです。
this.loadVariables とした時は、メインのタイムラインであれば this は _root のことを指しています。
そして、loadVariables で読み込むと、読み込まれた変数は loadVariables の持ち主のムービークリップのものになります。
this の指す相手や this を省略した時の対象から、読み込んだ変数を表示できる理由を考えてみてください。

-------------------------------------------------------------------

LoadVars クラスの登場により、loadVariables で読み込む手法は旧式になりました。
世の中後からできたものの方が高性能ということで、LoadVars にはできるけれど loadVariables だとできないこともあります。

LoadVars の優れているところは、

 ・ CGI とやりとりしやすい
   今回は変数を読み込むだけでしたが、CGI に変数を送ったり、
   送ったものを CGI で加工して再度送り返してもらうこともできます。
 
 ・読み込みの状況がいろいろと把握できる
   これにより、読み込みが失敗した時などの処理を作りやすくなりました。

 ・変数でなくても読み込める
   「変数名=値」として情報を用意するのが一般的ですが、実は、LoadVars であれば
   変数の形になっていないテキストでも読み込んで利用することができます。


などです。


これらの特長を利用しないなら loadVariables とあまり変わりません。
単純にテキストファイルから変数を読み込む・読み込みの完了を待って何かをするくらいであれば、loadVariables でも充分用が足ります。

ただ、旧式になってしまったということは、いずれは使用を避けるスクリプトに指定される可能性があります。
LoadVars はターゲットパスのこと・関数が受け取るパラメータ(引数といいます)などいろいろとややこしい点もありますので、ActionScript に慣れてきたら研究してみてください。
    • good
    • 0
この回答へのお礼

丁寧に解説いただきありがとうございました。
理解する間もなく時間が過ぎてしまい、お礼が遅くなりすみません。
理解できるようにがんばりたいと思います!
ありがとうございました。

お礼日時:2007/05/08 15:08

こんにちは。


「うまくいかない」というのは具体的には、「HTMLレンダリングされず、タグのまま表示される」ということでしょうか?
下記2点を確認してみてください。
1)ダイナミックテキストのプロパティで「テキストをHTMLとしてレンダリング」がチェックされていること
2)this.title_mc.title_txt.text= ではなく、this.title_mc.title_txt.htmlText=に変える

以下余談です。
loadVariablesでもonDataイベントが発生するようですが、
下記のようにLoadVarsを使ったほうが良い気がします。
var my_lv:LoadVars = new LoadVars();
my_lv.onLoad = function(success:Boolean) {
if (success) {
trace(this.title);
trace(this.honbun);
} else {
trace("Error loading/parsing LoadVars.");
}
};
my_lv.load("text.txt");

この回答への補足

loadVarsは・・・すみません、知ってるスクリプトしか使えないのです。せっかく書いていただいたのに、わたしには理解できない・・・m(__)m
var my_lv:LoadVars = ・・・以下をシーン1の1フレーム目に書いてみましたら、出力パネルに表示(traceだから、ですよね?)されてHTMLタグのまま記述されてました。

補足日時:2007/04/09 17:41
    • good
    • 0
この回答へのお礼

ありがとうございます。
そうです、HTMLが効いてなかったのです。
htmlTextを使ってみましたら、できました♪

お礼日時:2007/04/09 17:41

HTML タグを付けたテキストをレンダリングして表示する時は、text プロパティではなく” htmlText ”というプロパティを書き換えます。


text プロパティを書き換えると、タグが付いたままのテキストが表示されてしまいます。

テキストフィールドがムービークリップの中にあるかどうかは関係ありません。
ムービークリップ内のテキストフィールドでも、HTML で装飾したテキストを表示できます。


ご提示のスクリプトの

 > this.title_mc.title_txt.text = title;
 > this.honbun_mc.honbun_txt.text = honbun;

↑この部分を、

 this.title_mc.title_txt.htmlText = title;
 this.honbun_mc.honbun_txt.htmlText = honbun;

(各行頭に全角のスペースが入っています。コピーする際はご注意ください)

に書き換えてみてください。
    • good
    • 0
この回答へのお礼

ありがとうございました。
htmlText、ひとつ賢くなれました。

お礼日時:2007/04/09 17:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報