- ベストアンサー
DataGridでの数値変更時の処理について
- WinXP、Flash8Proにてオーサリングしております。質問です。下記のスクリプトで、ダイナミックテキストに設定した変数amount_hに変更された数量が追加されていくようにしたいのですが、なぜか、String扱いとなってamount=2として、amount_h+=amount; ←これを2回くりかえすとamount_hの値は22と表示されてしまいます。なぜこうなってしまうのでしょうか?どうぞ宜しくお願いいたします。
- 質問者はWinXPとFlash8Proでのオーサリングを行っています。スクリプトでダイナミックテキストに設定した変数amount_hに変更された数量を追加したいそうですが、なぜかString扱いとなってしまい、amount=2として、amount_h+=amount;を2回繰り返すとamount_hの値が22と表示されてしまいます。なぜこのような状況になるのか、質問者は知りたいとしています。
- 質問者はWinXPとFlash8Proを使用してオーサリングを行っています。スクリプトでダイナミックテキストに設定した変数amount_hに変更された数量を追加したいそうですが、なぜかString型として扱われてしまい、amount=2として、amount_h+=amount;を2回繰り返すとamount_hの値が22と表示されてしまいます。なぜこのような現象が起こるのか、質問者は理解したいとしています。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ダイナミックテキストに変数名を付けて, その値を取ってくると元から String(文字列) です。そういう仕様です。 だから,Flash 8 以前でも,かなり慎重に扱うべきものです。 個人的に私は鬼門だと思っているので,そういう使い方は避けて通っています。 加算と文字列連結 http://homepage3.nifty.com/ginga-b/MX/add_and_stringconcat.html --- 引用 ------------- > CGI、外部テキストファイル、html、cookieから > 変数の値を読み込んだときや、 > ダイナミックテキスト、テキスト入力などの変数は > 必ず文字列となります。 > 数値として使用する場合には、 > 型変換の処理が必要になりますので注意が必要です > (数値に型変換するにはNumber関数を使用します)。 このご質問を機に実験してみました。 下の通り,パブリッシュするバージョンによっても結果が変わります。 ====================== ◎Flash Player 7 でパブリッシュ設定をした場合 ○ 変数名 amount_h のダイナミックテキストに, 手動で「2」を記入した状態で次のスクリプトを実行 ---実行スクリプト------------------- trace("amount_hの値="+amount_h); trace("amount_hのタイプ="+typeof amount_h); trace("ここで amount_h++ を実行") amount_h++; trace("amount_hの値="+amount_h); trace("amount_hのタイプ="+typeof amount_h); --------------------------------- ---出力内容---------------------- amount_hの値=2 amount_hのタイプ=string ここで amount_h++ を実行 amount_hの値=3 amount_hのタイプ=number --------------------------------- ○ 変数名 amount_h のダイナミックテキストに, 無記入の状態で次のスクリプトを実行 ---実行スクリプト------------------- var amount_h:Number = 2; trace("amount_hの値="+amount_h); trace("amount_hのタイプ="+typeof amount_h); trace("ここで amount_h++ を実行") amount_h++; trace("amount_hの値="+amount_h); trace("amount_hのタイプ="+typeof amount_h); --------------------------------- ---出力内容---------------------- amount_hの値=2 amount_hのタイプ=number ここで amount_h++ を実行 amount_hの値=3 amount_hのタイプ=number --------------------------------- = = = = = = = = = = ◎Flash Player 8 でパブリッシュ設定をした場合 ○ 変数名 amount_h のダイナミックテキストに, 手動で「2」を記入した状態で次のスクリプトを実行 ---実行スクリプト------------------- trace("amount_hの値="+amount_h); trace("amount_hのタイプ="+typeof amount_h); trace("ここで amount_h++ を実行") amount_h++; trace("amount_hの値="+amount_h); trace("amount_hのタイプ="+typeof amount_h); --------------------------------- ---出力内容---------------------- amount_hの値=<p align="left"><font face="_ゴシック_14pt_st" size="14" color="#000000" letterSpacing="0.000000" kerning="1">2</font></p> amount_hのタイプ=string ここで amount_h++ を実行 amount_hの値=NaN amount_hのタイプ=number --------------------------------- ○ 変数名 amount_h のダイナミックテキストに, 無記入の状態で次のスクリプトを実行 ---実行スクリプト------------------- var amount_h:Number = 2; trace("amount_hの値="+amount_h); trace("amount_hのタイプ="+typeof amount_h); trace("ここで amount_h++ を実行") amount_h++; trace("amount_hの値="+amount_h); trace("amount_hのタイプ="+typeof amount_h); --------------------------------- ---出力内容---------------------- amount_hの値=2 amount_hのタイプ=number ここで amount_h++ を実行 amount_hの値=3 amount_hのタイプ=number --------------------------------- ========================= なぜ,Flash のパブリッシュするバージョンを変えて実験してたかいうと, > (数値に型変換するにはNumber関数を使用します)。 これを使えばなんとかなるのでは??? と考えたからです。 しかし,Flash 8 では何とも解決できませんでした。 それでなぜだろうと,実際に trace してみると, amount_hの値=<p align="left"><font face="_ゴシック_14pt_st" size="14" color="#000000" letterSpacing="0.000000" kerning="1">2</font></p> この状態です。 これでは,Number関数 も効きません。 Flash MX (Flash Player 6) からは, ダイナミックテキストにインスタンス名が付けられるようになり, それと同時に,ダイナミックテキストには, 変数名を付けずに,インスタンス名だけを付けることが推奨されています。 「テキストフィールドのインスタンス名と変数名について」 http://livedocs.macromedia.com/flash/8_jp/main/00001418.html > プロパティインスペクタの [変数] テキストボックスで、 > 変数名をダイナミックテキストフィールドや > テキスト入力フィールドに割り当てることができます。 > これによって、変数に値を割り当てることができます。 > これは、旧バージョンの Flash Player (Flash Player 4 など) 用の > ア プリケーションを作成するときに使用する可能性のある > 非推奨の機能です。 「ScrollBarコンポーネントのスクロールバーがアクティブにならない」 http://www.fumiononaka.com/TechNotes/Flash/FN0303006.html > TextFieldにはインスタンス名に加えて変数名も使用でき > ますが、スクリプトに混乱を生じるおそれがありますので、 > 変数名は削除することをお勧めします。 ですから,変数は変数で計算処理をして, その結果を,インスタンス名の付いたダイナミックテキストに表示させるのが普通の方法です。 ---例-------------- // A,B,C は変数で,mytxt がダイナミックテキストのインスタンス名 A = 1; B = 2; C = A+B; mytxt.text = C; C++; mytxt.text = C; --------------------- 個人的に私は, データがちゃんと代入されたかどうかを確認するために, trace(); の代わりにダイナミックテキストに変数名をつけて, 表のようなものを表示させることはよくします。 しかし,trace 代わりに使用する物ですから作成後は消します。 本番前のデータ確認であれば, ダイナミックテキストに変数名をつけて,表示させても良いと思いますが, 実際の本番にはやはり使用を避けた方が良いと思います。 特に Flash 8 になってからは,上のような結果ですから, ダイナミックテキストに変数名を付けた物の値をさらに使うのはさらに鬼門です。 DataGrid に関しては,何も回答していませんが(よくわからないので), ご質問について思ったことを回答しました。 なにかの参考にでもしてください。
お礼
お返事ありがとうございます。 変数、鬼門なのですね。 どうりで、環境によって違いが出るはずですよね。 この度は、変数を使用せずにDTのみで行う事で 解決できました。 どうも有り難う御座いました。