なでしこの質問掲示板で気になる質問がありました
なでしこ1で、ボタンを配列で作成したのですが、クリックした時の挙動が変です
どのボタンが押されたかをタグで認識させたいのですが、以下のプログラムでB【0】のタグが1となり、B【8】をクリックするとエラーになります
このプログラム、どこがおかしいのでしょうか?ご教示お願いします(バージョン 1.588です)
IDを0から8まで繰り返す //…1行目
B【ID】をボタンとして作成。
B【ID】→Y=25*ID
B【ID】→タグ=ID
B【ID】→テキスト=ID
B【ID】→クリックした時は~
「{B【ID】→タグ}」でボタン押した時 //…7行目
ここまで。
●ボタン押した時(IDで) //…10行目
「{ID}を押しました」と言う。
これ系は見たことがあったので、7行目の「B【ID】→タグ」を「自身→タグ」にすれば解決とすぐわかりました。
ただ、質問文のなかで
「プログラムでB【0】のタグが1となり、B【8】をクリックするとエラーになります」
とあります。
あれ、思ってたのと違う?
気になった理由
まずプログラムの構造ですが、変数「ID」が3つ登場しています。
IDを0から8まで繰り返す //…1行目
「{B【ID】→タグ}」でボタン押した時 //…7行目
●ボタン押した時(IDで) //…10行目
1行目の変数IDはグローバル変数です。
10行目の変数IDはローカル変数です。
そして7行目の変数IDが問題です。
7行目のIDはグローバル変数で、IDを0から8まで繰り返す
をしたので「ID=8」になっていると思いました。
「ID=8」だったとすると
「{B【ID】→タグ}」でボタン押した時
の部分は
「{B【8】→タグ}」でボタン押した時
となり、どのボタンも8と同じ挙動するはずだと思いました。
実際にプログラムを動かすと、B【0】のボタンはB【1】→タグを参照し、「1を押しました」と表示されます。
B【8】のボタンはB【9】→タグを参照し、エラーとなります。
思ったのと違う!
IDが指すもの
クリックした時は~の中で指している「ID」は、ボタンのメンバ変数の「ID」だったのです。
「ボタンのID」には作った部品の番号が入るようです。
そして「{B【ID】→タグ}」でボタン押した時
のIDは、自身→ID
を指していたということです。
変数名が同じ場合、ローカル変数、グループのメンバ、グローバル変数の順で探しに行く。
グループのメンバと同じ名前のグローバル変数は使わないほうがよいですね。