- ベストアンサー
引数の渡し方について知りたい
- 外部テキストを読み込み、配列に格納して表示するスクリプトを組んでいます。
- myNameを引数に応じて切り替えて表示させたいが、方法が分からない。
- シフトJISで読み込み、カンマで分割して配列に格納する。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
#1です。 myNameは複数あり、… の意味がわかりました。変数myNameの "要素" がたくさんあるのかと思ってしまっていました。 myNameのような "変数" 自体がたくさんあるわけですね。 それで,スクリプトは一応書かれているもので動作するのでしたか。 "要素" がたくさんあるのかと思っていたので,for文かな? と思った次第です。 どうも失礼しました。 そして,配列アクセス演算子([ ] )で自己解決されたわけですか。 #1の for文内の左辺も配列アクセス演算子を使用しています。 _root["txt0"+(i+1)] = my_ary[i]; _rootのあとに「.」(ドット)はありません。 これで,変数自体をさらに動的に変えられます。 しかし…, ということは,……??? ボタンクリックによって違うフレームに行って, そしていちいちそのフレームに戻って,スクリプトを実行させているということなのですか。 それは変だと思います。 動きも変ですが,1回目でロードは完了しているのに,何度も同じ「data.txt」ロードさせるのも無駄ですね。 一応解決はされたみたいですが, 質問はまだ継続されているようなので,私ならこうするだろうという例を書いておきます。 お礼で書いてくださっているスクリプトはなるべくそのままで, また,とりあえず for文 などループも使わないというパターンで書きます。 メインムービー(_root) の フレーム1 などに書くスクリプトです。 -------------------------------- //Shift-JISで読み込む System.useCodepage = true; //メインのタイムラインを止める(不要??) stop(); //ロードされたかどうかのフラグを設置 var load_flag = 0; //LoadVarsインスタンスの生成 load_obj = new LoadVars(); //インスタンスにLoadVars.onLoadメソッドを定義 load_obj.onLoad = function(success) { //正常終了時 ロードされたかどうかのフラグを1にする if (success) { _root.load_flag = 1; } }; //LoadVars.loadを実行 load_obj.load("data.txt"); //グローバル関数 「showData」 の定義 _global.showData = function(globalName) { my_ary = new Array(); //カンマで分割して配列に格納 my_ary = load_obj[globalName].split(","); //配列を変数に num = my_ary[0]; txt01 = my_ary[1]; txt02 = my_ary[2]; txt03 = my_ary[3]; txt04 = my_ary[4]; //txt_mに変数を代入 base_mc.loadPhoto_mc.loadMovie("photo/"+globalName+".jpg"); base_mc.num_mc.num = num; base_mc.txt001_m.txt = txt01; base_mc.txt002_m.txt = txt02; base_mc.txt003_m.txt = txt03; base_mc.txt004_m.txt = txt04; }; --------------------------------- そして,ボタンのスクリプトには下のように書きます。 (例:山田さんデータ表示ボタンの場合) --------------------------------- on (release) { //ロードされたかどうかのフラグが1であれば if (_root.load_flag == 1) { //関数showData (引数:"yamada") を実行 showData("yamada"); } } --------------------------------- ロードは1回で良いので先に済ませておきます。 そして,その 「ロードされたデータの中から必要なものを取り出す。」 という部分をボタンで実行するわけです。 この 「ロードされたデータの中から必要なものを取り出す。」 という部分だけをユーザー定義関数にしておけば, その関数をボタンから何度でも呼び出せます。 また,引数も渡せます。 > 「質問:引数の渡し方」 やっと,ご質問の題名までたどりつくことができた気がします。 ユーザー定義関数は, function showData(){ //「ロードされたデータの中から必要なものを取り出す。」 } みたいに,単なる function に定義しても良いです。 でも,ボタンなどの階層などが良くわからなかったので, 上のスクリプトはグローバル関数にしてみました。 「関数とメソッドについて」 http://livedocs.macromedia.com/flash/8_jp/main/00001285.html 「グローバル関数とタイムライン関数の定義」 http://livedocs.macromedia.com/flash/8_jp/main/00001292.html 要はグローバル関数にしておけば定義済関数のように使えるわけです。 例えば, gotoAndPlay(); や stop(); や play(); など… これらは定義済み関数です。これらのように, showData("yamada"); と言う感じで, 自分が定義した関数がそのファイルが開いているうちはずっと使えます。 また引数も渡せます。 ちなみに,_global.showData = function() の { } 内を もう少し簡素にして for文にすると, --------------------------------------- _global.showData = function(globalName) { my_ary = new Array(); //カンマで分割して配列に格納 my_ary = load_obj[globalName].split(","); base_mc.loadPhoto_mc.loadMovie("photo/"+globalName+".jpg"); base_mc.num_mc.num = my_ary[0]; //txt_mに変数を代入 for (var i = 1; i<=4; i++) { base_mc["txt00"+i+"_m"].txt = my_ary[i]; } }; --------------------------------------- と,こんな感じになります。 --//--//--//--//--//--//--//-- それと,「data.txt」内のデータですが, 改行の前に & を入れる方が無難です。 yamada=あああ,いいい,ううう &tanaka=あああ,いいい,ううう &yamamoto=あああ,いいい,ううう ↓↓↓ yamada=あああ,いいい,ううう& &tanaka=あああ,いいい,ううう& &yamamoto=あああ,いいい,ううう 私は#6で回答していますが,こういう事例もあるので参考までに。 質問:テキスト入力での文字の判定 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1906190 ↑教えて!goo ↓OKWave (同じです) http://okwave.jp/kotaeru.php3?q=1906190
その他の回答 (1)
「data.txt」の中のデータを myName=ああ,いいい,う,えええ としておくと, 書かれているスクリプトそのままのコピペでうまく trace されましたよ。 質問に書かれているそのままでもちゃんと trace されましたので, スクリプトはだいたい合っていると思います。 ちょっと順番が変だと思うのと, for文でスッキリさせる方法と, 後のために変数のパスを _root にした場合で, 参考までに次に書いておきます。 ------------------------------------------ //Shift-JISで読み込む System.useCodepage = true; //先にストップ stop(); load_obj = new LoadVars(); load_obj.onLoad = function(success) { //正常終了時、カンマで分割して配列に格納 if (success) { my_ary = new Array(); my_ary = load_obj.myName.split(","); for (i=0; i<=3; i++) { _root["txt0"+(i+1)] = my_ary[i]; trace(_root["txt0"+(i+1)]); } } }; //最後にロード load_obj.load("data.txt"); ------------------------------------------ 参考URL: 「LoadVarsオブジェクトを使った外部テキストファイルの読込み」 http://www.fumiononaka.com/TechNotes/Flash/FN0303007.html より引用。 > LoadVars.onLoadメソッドの定義をまず行ってから、 > LoadVars.loadを実行するのが確実です。 質問の文章で >> myNameは複数あり、… と書かれている意味がよくわかりませんし, スクリプトではなくて,「data.txt」の中のデータの書き方が変なのではないでしょうか? ひょっとして, myName=ああ,myName=いいい,myName=う,myName=えええ とか言うような形なのですか? これではさっぱりダメですよ。 でも,もしそうだとすると,次のようなスクリプトでできることはできます。 ------------------------------------------ //Shift-JISで読み込む System.useCodepage = true; stop(); load_obj = new LoadVars(); load_obj.onData = function(success) { //正常終了時、カンマで分割して配列に格納 if (success != undefined) { my_ary = new Array(); my_ary = success.split(","); for (i=0; i<=3; i++) { _root["txt0"+(i+1)] = my_ary[i]; trace(_root["txt0"+(i+1)]); } } }; load_obj.load("data.txt"); ------------------------------------------ 私が回答したものではありませんが, 参考URL:「外部テキスト読み込み」 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1668616 ↑教えて!goo ↓OKWave (同じです) http://okwave.jp/kotaeru.php3?q=1668616 できないこともありませんけど, このあと,どうやってそれを使うのでしょうか? trace されるのは myName=ああ myName=いいい myName=う myName=えええ こんなのです。 この後の処理が面倒です。 以上までが一区切りですね。 「data.txt」の中のデータをどうされているのかをまず確認してみてください。 ========================================== >> (実際には表示)させたい 上の2例では, _root (メインムービーのステージ上) に変数 txt01 ~ txt04 をセットしています。 ですから, _root に "変数名" が txt01 ~ txt04 のダイナミックテキストのテキストフィールドを置くと, 上のスクリプトの場合, txt01 という変数名のテキストフィールドには 「ああ」 txt02 という変数名のテキストフィールドには 「いいい」 txt03 という変数名のテキストフィールドには 「う」 txt04 という変数名のテキストフィールドには 「えええ」 が表示されます。 ここまで見ておそらく気づかれていると思いますが, 変数名は txt01 txt02 … という形より txt1 txt2 … という形の方が良いです。 for文ももっとシンプルに for (i=0; i<=3; i++) { _root["txt"+(i+1)] = my_ary[i]; trace(_root["txt"+(i+1)]); } とできますし, これで,変数が10以上になった場合でも i<=3; を i<=1000; に変えるだけで, txt1~txt1000 までの変数が自動的に作成されますし, 後の管理も簡単になります。
お礼
ありがとうございます。 ループに関してはとりあえず本体が出来てからという感じで後回しにしていました。 すみません。質問が分かり難かったでしょうか。 >> myNameは複数あり、… >と書かれている意味がよくわかりませんし, >スクリプトではなくて,「data.txt」の中のデータの書き方が >変なのではないでしょうか? >ひょっとして, 実際のデータは yamada=あああ,いいい,ううう &tanaka=あああ,いいい,ううう &yamamoto=あああ,いいい,ううう というデータになっています。 それで、ボタンをクリックして該当の人物の内容をテキストエリアに読み込むというスクリプトなんです。 ループ処理はしていませんが、とりあえず以下のようなスクリプトで動きました。 //Shift-JISで読み込む System.useCodepage = true; load_obj = new LoadVars(); load_obj.load( "data.txt" ); load_obj.onLoad = function( success ){ //正常終了時、カンマで分割して配列に格納 if( success ){ my_ary = new Array(); my_ary = load_obj[globalName].split(","); } //配列を変数に num=my_ary[0]; txt01=my_ary[1]; txt02=my_ary[2]; txt03=my_ary[3]; txt04=my_ary[4]; //txt_mに変数を代入 base_mc.loadPhoto_mc.loadMovie("photo/"+globalName+".jpg"); base_mc.num_mc.num=num base_mc.txt001_m.txt=txt01 base_mc.txt002_m.txt=txt02 base_mc.txt003_m.txt=txt03 base_mc.txt004_m.txt=txt04 }; //一旦、メインのタイムラインを止める stop(); ボタンから変数を渡す時に my_ary = load_obj[globalName].split(",");の load_objの後に「.」を入れているとundefinedが返ってくるのでしばらく悩んでしまいました。 メンテナンスのことも考えるとやはりループ処理した方がいいですよね。 いかんせん初心者なもので、一つづつクリアして最後にカタチにするような感じになってしまっています。もう少し慣れて最初からある程度の形を作れるように頑張ります。
お礼
お返事が遅くなり申し訳ありません。 上記の内容でうまくいきました。ありがとうございました。