メイン 迷える子羊の部屋【初心者専用】
外部テキストファイルの内容を変数に入れたいのですが… | 投稿するにはまず登録を |
| スレッド表示 | 新しいものから | 前のトピック | 次のトピック | 下へ |
| 投稿者 | スレッド |
|---|---|
| nish11 | Åê¹ÆNo.44361 投稿日時: 2010-2-3 23:48 |
新米 ![]() ![]() 居住地: 投稿: 4
使用環境:
WinXP,Flash CS3 |
外部テキストファイルの内容を変数に入れたいのですが… はじめて投稿させて頂きます。CS3、AS3.0で質問させて下さい。
やりたいことは「外部テキストファイルの中身を変数に入れる」という処理です。 (PHPのfile_get_contents関数のようなイメージです) ↓作ってみたクラス↓ package{ import flash.net.URLLoader; import flash.net.URLRequest; import flash.events.Event; /** * 外部ファイル読み込みクラス。 * * @auther * @version 1.0 */ public class loadFileData { public var contents:String; // ファイル内容 /** * コンストラクタ * @param (無し) * @return (無し) */ public function loadFileData(){ this.contents = "初期化"; }; /** * テキストファイル読み込み * @param String * @return Boolean */ public function getContentsAsText(path:String):Boolean{ var loader:URLLoader = new URLLoader(); var request:URLRequest = new URLRequest(path); loader.addEventListener(Event.COMPLETE, loadData); function loadData(event:Event){ this.contents = loader.data; trace("this_1:"+ this); // 結果→this_1:[object global] } loader.load(request); trace("this_2:"+ this); // 結果→this_2:[object loadFileData] return true; } public function getContents():String{ return this.contents; } }; }; ↓呼び元はこんな感じで考えてます↓ var lfData:loadFileData = new loadFileData(); var r:Boolean = lfData.getContentsAsText("test.txt"); var disp_message:String = lfData.getContents(); 「this.contents = loader.data;」のところでファイルの中身を入れようと しているのですが、上手く入ってくれません。 traceでthisがfunction loadData()の内外で違うものを指していることは分かって クロージャ関連も調べてみたのですが、具体的な対応が分からずにいます。 (traceしたりダイナミックテキストに入れる方法はたくさん見つかるのですが…) どうやればうまくいきますでしょうか。 参考URLでも大変助かりますので、何卒よろしくお願い致します。 |
| 野中文雄 | Åê¹ÆNo.44362 投稿日時: 2010-2-4 2:15 |
ちょんまげら ![]() ![]() 居住地: 東京 投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1) |
Re: 外部テキストファイルの内容を変数に入れたいのですが…
|
| nish11 | Åê¹ÆNo.44363 投稿日時: 2010-2-4 8:36 |
新米 ![]() ![]() 居住地: 投稿: 4
使用環境:
WinXP,Flash CS3 |
Re: 外部テキストファイルの内容を変数に入れたいのですが… 野中文雄様
ご返信ありがとうございます。 クラスで書く前にフレーム上で書いていたのですが、 そのときは例えばダイナミックテキストを 「testTextField」という名前で作り、 testTextField.text = loader.data; とすれば表示することができました。 クラスとして書いた後は試していませんでした。 (試しにやってみたところ、クラス内からstageを直接参照できないようで…) 言葉が足らず申し訳ございません。 引用:
|
| 野中文雄 | Åê¹ÆNo.44364 投稿日時: 2010-2-4 14:40 |
ちょんまげら ![]() ![]() 居住地: 東京 投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1) |
Re: 外部テキストファイルの内容を変数に入れたいのですが… おそらく「フレーム上で書いて」いれば、「変数に入れる」ことも可能だと思われます。だとすれば今回の問題は、「変数」か「ダイナミックテキスト」かではなく、クラス定義の構成です。
引用: nish11さんは書きました: すると、「参考URL」は「たくさん見つかる」のではありませんか?「変数」にこだわらず、「ダイナミックテキスト」であっても、それらの「参考URL」でカスタムクラスのインスタンスがプロパティ(TextFieldインスタンス)をどう参照しているのか研究するべきでしょう。 引用: (traceしたりダイナミックテキストに入れる方法はたくさん見つかるのですが…) 大切なのは、問題を切分けることです。胃を調べるときは、まず空腹にしなければなりません。余分なものが入っていたために、問題が「変数」なのか「クラスの構成」なのか見えなくなっていたのではないでしょうか。 参考:「関数クロージャ内のthis参照について」「関数クロージャのthis参照について」 |
| nish11 | Åê¹ÆNo.44368 投稿日時: 2010-2-4 23:03 |
新米 ![]() ![]() 居住地: 投稿: 4
使用環境:
WinXP,Flash CS3 |
Re: 外部テキストファイルの内容を変数に入れたいのですが… 野中文雄様
度々のご回答、並びにご指摘ありがとうございます。 その後色々試してみまして、ようやく原因が分かりました。 "this"の向き先に関しては、突き詰めれば本件と直接関係 ありませんでしたので、今後の課題とさせて頂きます。 「読み込んだデータが変数に入らない」という件が問題 だったのですが、これがそもそも勘違いでして、 変数にはきちんと入っておりました。 当初、traceを使ってloadData()メソッドの内外で変数の値を 確認していたのですが、変数の代入前後を取り違えておりました。 ここで「変数に読み込んだデータを代入→変数の値が初期値に戻る」 という錯覚を起こしてしまいました。 さらにその後、(詳しくは割愛させて頂きますが)取得した変数を 用いてMovieClipを作成、それに対してENTER_FRAMEで処理を進めたところ、 テキストファイルから取得されるべきテキストが無かったので 錯覚が確信となってしまいました。 実際にはENTER_FRAMEの2回目でテキスト自体は拾えるようになって おりました。 (1回目ではテキストファイルが読み込めなかったようです) 従いまして実際は、テキストファイルを読み込んだ後は traceで出力できましたし、 ダイナミックテキストにも入りましたし、 変数にも入りました。 これはご指摘頂いた通りでした。 以上踏まえまして、以前に書かせて頂きましたクラスも少し整理しまして 後述のようになりましたが、テキストファイル自体は読み込める ようになりました。 (ただ取得側でENTER_FRAMEまわりのタイミングで悩ましくはあるのですが… これは別問題として、これから調べようかと思います。) わかってみれば下らない質問で、大変申し訳無く思います。 貴重なお時間を割いて頂きまして、本当にありがとうございました。 //----------------------------- package{ import flash.net.URLLoader; import flash.net.URLRequest; import flash.events.Event; /** * 外部ファイル読み込みクラス。 * * @auther * @version 0.1 */ public class loadFileData { private var contents:String; private var loader:URLLoader; /** * コンストラクタ * @param String * @return (無し) */ public function loadFileData(path:String){ var request:URLRequest = new URLRequest(path); loader = new URLLoader(); loader.addEventListener(Event.COMPLETE, loadData); loader.load(request); }; /** * テキストファイル内容格納 * @param Event * @return (無し) */ private function loadData(event:Event):void{ this.contents = loader.data; }; /** * テキストファイル内容取得 * @param (無し) * @return String */ public function getContents():String{ return this.contents; }; }; }; |
| 野中文雄 | Åê¹ÆNo.44369 投稿日時: 2010-2-5 0:06 |
ちょんまげら ![]() ![]() 居住地: 東京 投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1) |
Re: 外部テキストファイルの内容を変数に入れたいのですが… まず、URLLoader.completeイベントのリスナーメソッドは、何か特別な理由がないかぎり、クラスのメソッドとして定義することは正解です。そして、「何か特別な理由」が生じなければ、「"this"の向き先」をあえて研究する必要性も薄いでしょう(もちろん、知っているに越したことはありませんが)。
引用: nish11さんは書きました: つぎに、Flashムービー側で値を取出すタイミングについて悩んでいらっしゃるようですね。仕組みとしては、外部ファイルの読込み後にその処理を行えばよいでしょう。比較的簡単なのは、つぎのようにコールバック関数を呼出すことです。 引用: (ただ取得側でENTER_FRAMEまわりのタイミングで悩ましくはあるのですが… EventDispatcherクラスをすでに学習されていれば、これを継承してイベントリスナーとして扱うのがActionScript 3.0スタンダードでしょう。 |
| nish11 | Åê¹ÆNo.44378 投稿日時: 2010-2-5 23:23 |
新米 ![]() ![]() 居住地: 投稿: 4
使用環境:
WinXP,Flash CS3 |
Re: 外部テキストファイルの内容を変数に入れたいのですが… 野中文雄様
丁寧なご説明とサンプルソースを頂きまして、ありがとうございました。 サンプルソースをもとに早速修正してみたところ、 無駄な判定要素を入れることも無く動かすことができました。 (前回の時点では「値が取れている」「2回目のループ」など 不細工な判定を入れてどうにか動かしていたもので…) 引用:
また、上記のアドバイスもありがとうございました。 とりあえず見よう見まねで書いてみまして、 同じような動きになるところまで確認できました。 まだまだ足りない記述もあるかと思いますが、今後地道に 足していこうかと思います。 本件に関しましては貴重なお時間を頂きまして、本当にありがとうございました。 |
| スレッド表示 | 新しいものから | 前のトピック | 次のトピック | トップ |
| 投稿するにはまず登録を | |



ログイン




CS5.5
.6.8
Vista Home Premium (SP1)

