こんばんは。pmpmpm5と申します。
質問集で検索しましたが、同じ質問がヒットしなかったので
今回質問させていただきます。
FlashMXを使用しアクションスクリプトで
「日替わりでちがうテキストを読み込む」方法を探しています。
以下、実際のスクリプトです。
■ダイナミックテキスト(変数名:test)を含む
ムービークリップ(インスタンス名box)をメインフレームに配置
■メインフレームにフレームアクション
myDate = new Date();
Month = myDate.getMonth()+1;
Date = myDate.getDate();
message = "m"+ Month +"d"+Date;
■boxのクリップアクション
onClipEvent (load) {
this.loadVariables ("days.txt");
}
onClipEvent (data) {
//this.test = m12d22;
this.test = this[message];
■外部テキスト(days.txt)
m12d22=今日は2月12日です。
m2d13=今日は2月13日です。
このように組み込んだのですが、ダイナミックテキストには
「今日は〇月〇日です。」という文字列が読み込まれず
困っています。
どうか、ご指導お願いいたします。
No.1ベストアンサー
- 回答日時:
まずテキストのデータ形式ですが,
ご質問のテキストデータやスクリプトを見る限り,
勝手に「改行」を「データの区切り」と決めていらっしゃいますね。
どこにもそんなルールはありませんよ。
もしそうしたいのでしたら
「改行コードがデータの区切りである」
という定義をするためのややこしいスクリプトが必要になります。
普通はそういうものは定義しません。
Flashのルール通り「&」をデータ区切りとします。
Google や Yahoo! などで何かを検索したとき,
URLアドレス欄に見える URLクエリ と同じルールです。
変数名A=値A&変数名B=値B&変数名C=値C …
これが Flash で外部テキストデータを扱うとき,
1つのファイル内に複数の変数と値を入れる基本ルールです。
しかし,
これではデータが横にひたすら長くなるので人間が読み書きしにくいです。
改行を入れれば良いのですが,
単に改行を入れだけでは「改行コード」までが 変数名 または 値 に混入してしまいます。
そこで改行コードをデータとして無視されるように改行前後に「&」を入れます。
ですから一般的には次のようなデータ形式にします。
変数名A=値A&
&変数名B=値B&
&変数名C=値C&
…
具体例は次のような感じにするということです。
m12d22=今日は12月22日です。&
&m12d23=今日は12月23日です。&
&m12d24=今日は12月24日です。
ややこしいと思われる場合は,
最初と最後にも「&」を入れても良いです。
&m12d22=今日は12月22日です。&
&m12d23=今日は12月23日です。&
&m12d24=今日は12月24日です。&
*********
外部テキストの文字コードに関してですが,
スクリプト中に次の1行が見当たりません。
System.useCodepage = true;
この1行をメインのフレーム1の最初辺りに入れておくと,
外部テキストが Shift-JIS として解釈されます。
入れておかない場合は,
自動的に UTF-8 として解釈されます。
これは FlashPlayer6 以上用の SWF をパブリッシュする場合の仕様変更でこうなりました。
Flash MX では FlashPlayer6 用の SWF をパブリッシュするのがデフォルト設定ですからこの点が要注意です。
*********
ターゲットパスに関してですが,これがうまく行かない第一原因です。
まず確認です。
階層などは次のようになっているのですよね。
_root ←myDate = new… を書いた
└box ←onClipEvent (load)… を書いた
└ テキストフィールド変数名「test」
このようになっているのだとすると,次のの1行ではうまく行きません。
this.test = this[message];
これだと,
ムービークリップbox 内にある変数 message を参照してしまいます。
message はムービークリップにある変数ではなくて _root にあるはずです。
したがって,次のように変更する必要があります。
this.test = this[_root.message];
または
this.test = this[_parent.message];
これでうまく行くはずです。
=====================
以下はうまく行く行かないではなくて,好ましくない箇所の指摘です。
******************
1つめ
Date = myDate.getDate();
変数 Date が Dateオブジェクト(クラス名)とかぶっています。
例えば date_num のような変数名にする方が良いです。
******************
2つめ
テキストフィールドに変数名を付けるのは,Flash Player 5 までの仕様で,
Flash Player 6 以降の SWF をパブリッシュする場合は非推奨の事項になっています。
Flash Player 6 以上用の SWF をパブリッシュする場合は,
テキストフィールドに変数名は付けずに,「インスタンス名」を付けて,
その text プロパティ や htmlText プロパティに値を代入するようにします。
したがって,ご質問の場合は,
box の中にあるダイナミックテキストの変数名 test を消して,
その ダイナミックテキスト に test というようなインスタンス名を付けるようにします。
こうした場合,
ムービークリップに書いた onClipEvent (data) {} は次のように変更する必要があります。
onClipEvent (data) {
this.test.text = this[_root.message];
}
*********
ダイナミックテキスト に変数名を付けた場合は,
自動的にその変数名の値が表示されますが,
上のようにダイナミックテキストインスタンス名のみを付けた場合は,
自動的に値は表示されません。
したがって必ず
○○.text = △△
のように ActionScript で値を代入する必要があります。
ご質問の場合は,
たまたまムービークリップの中にテキストフィールドがあるから良いのですが,
テキストフィールドは_rootの直下にあるかもしれません。
その場合は onClipEvent (data) {} は使えないか,
これを強引に使う場合,わざわざムービークリップを作成しなければならなくなります。
これは変です。
変ですし使い勝手が悪いです。
そこで登場したのが LoadVarsオブジェクト です。
この LoadVars について補足します。
ご質問のスクリプトを LoadVarsオブジェクト を使って書き替えてみます。
まず,ムービークリップに書いた
onClipEvent (load) {
this.loadVariables("days.txt");
}
onClipEvent (data) {
this.test.text = this[_root.message];
}
のようなスクリプトを全て消します。
そして _root のフレームのスクリプトを次のように書き替えます。
----------------------------------------
myDate = new Date();
month_num = myDate.getMonth()+1;
date_num = myDate.getDate();
message = "m"+month_num+"d"+date_num;
//
// 外部テキストの文字コードが Shift-JIS の場合は入れる
//System.useCodepage = true;
//
// LoadVarsオブジェクトを作成
myVars = new LoadVars();
//
// myVars に外部テキストがロードされたときの動作を定義
myVars.onLoad = function(Seikou) {
// ロードに成功したら
if (Seikou) {
// box 内の test に外部テキストの変数 message の値を表示
box.test.text = myVars[message];
// ロードに失敗したら
} else {
// box 内の test に「ロード失敗」を表示
box.test.text = "ロード失敗";
}
};
//
// myVars に外部テキストを ロード
myVars.load("days.txt");
----------------------------------------
FlashMXではこのような感じにするのが普通です。
これだと _root にインスタンス名だけを付けたダイナミックテキストがあった場合でも,
それと無関係なムービークリップを作成せずに済みます。
また 全てのスクリプトがフレームに書けるため一目瞭然になります。
また message の参照もこの階層で良くなりますからややこしくありません。
さらに ロードエラー も拾えます。
絶対このように LoadVars を使用した方が良いというわけではありません。
適材適所ですがこのような書き方にすると楽ではないかと思いましたので補足させていただきました。
BlurFiltanさん、こんばんは初めまして。
この度は素早い返答と的確なアドバイスをありがとうございました。
お返事が遅くなってしまいましたが、早速アドバイス通りスクリプトを修正してみたところ、問題なくテキストを読み込むことができました。本当にありがとうございます。
足りない点がたくさんある中、わかりやすい説明をありがとうございました。LoadVarsも初めて耳にする単語でしたが、このようなスクリプトの記述の仕方もあるのですね。大変勉強になりました。
困り果てていたので本当に助かりました!ありがとうございました!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 英語 to date 2 2023/05/23 23:22
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- JavaScript gasについて 1 2022/05/31 21:51
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- 英語 "this day"が当日か今日を表すのかの使い分け方等について 5 2023/08/08 14:29
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- Visual Basic(VBA) 【VBA】先月分の取得ができない理由が分かりません。 2 2022/04/24 11:16
- その他(プログラミング・Web制作) python 気象データの取得 2 2023/06/20 23:54
- Excel(エクセル) DATE関数で指定する「日」のセルが関数の場合の対処法 5 2022/09/14 15:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
中華ゲーム機のGame Console R3...
-
2002年製のpcと2008製のpcがあ...
-
情シスに異動するには。 非情シ...
-
ソフトに致命的なバグがあるか...
-
PowerShellで自分が書いたコマ...
-
Microsoftが非推奨にしてるかど...
-
スクリープロットの見方。この...
-
Windowsに致命的なバグがあるか...
-
ソフトが安定版かどうかを知る...
-
ソフトは安定版しか使うべきで...
-
PowerShellは大企業で使われて...
-
ファイル名とファイルの中身の...
-
PowerShellの使い方を学ぶのに...
-
PowerShellでバグが起きる確率...
-
SSDを放置していたらファイル名...
-
WinMergeはファイル名を比較す...
-
質問です! 現在就活中で監視方...
-
ハッシュ値を取る時はファイル...
-
マウスにチャタリングが起きな...
-
PowerShellに将来性はあるので...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
使用中のセクタが不良セクタに...
-
ファイル構造が破損しているフ...
-
すみません!パソコン開いて電...
-
現在と現在から20年前の2003〜2...
-
2つのファイルのバイナリをコン...
-
SSDを定期的にデフラグした方が...
-
どのストレージが一番高い所か...
-
AzureとOneDriveって何が違うの...
-
SSDに不良セクタがあるかどうか...
-
S.M.A.R.T.を見るのに1番有名な...
-
SSDに不良セクタが発生したら、...
-
次は、どこのメーカーのPCを買...
-
このパソコンは重量が689gと非...
-
ストレージの中に破損している...
-
SSDのデータがビット落ちにより...
-
SSDにTRIMをしたいのですがSSD...
-
コマンドプロンプトって「cmd」と...
-
SSDの不良セクタを代替セクタに...
-
SSDにTRIMってした方が良いので...
-
ファイルを記録してあるセクタ...
おすすめ情報