※ 記事が書かれた時点のなでしこはv1.588です。
なでしこ1で動的生成した部品について、以前のバージョンでは起きなかったバグがあるようです。
GUI部品のイベント中に動的生成するとエラーになってしまいます。
わかりやすく言うと「クリックした時は~
」などの部品イベント中に
「(部品名)として作成
」の命令を使用した時、ということです。
作成した部品に「→」でアクセスするとエラーを吐きます。
サンプルプログラムはこちら
作成ボタンとはボタン
そのクリックした時は~ //GUI部品のイベント中に
ボタン群[0]をボタンとして作成 //部品を作成すると
ボタン群[0]→Xは20 //エラーになる(生成に不具合)
・エラーメッセージ
[なでしこ(vnako)] ver.1.588 [作成ボタンのクリック時を実行中のエラー] [エラー] vnako.nako(98): 関数『VCL_SET』の実行中にエラーが起きました。 VCL_SETでプロパティ番号(10)の設定で、オブジェクトの値が(nil)です。オブジェクトが生成されていない可能性があります。(関数)
[エラー] vnako.nako(98): (関数定義)
[エラー] com.nadesi.exe.nakopad.temp.bak1.nako(4): (代入)
なでしこ1.588ではエラーとなりました。
なでしこ1.584では正常に動作しました。
なでしこ1.588では「自身」の更新タイミングがおかしい?
なでしこで部品を作成
した時にまず呼ばれるのは・作る~
のメンバです。
たぶん他言語では「コンストラクタ」と呼ばれているやつ。
コンストラクタ(constructor:構築者)とは、クラスからオブジェクトを作成した際に、自動的に実行される特殊なメソッドのこと
ボタンの・作る~
はvnako.nakoに書かれています。
■ボタン +ウィンドウ部品 +ボタンイベントプロパティ +ドロッププロパティ
・種類{="ボタン"}
・作る~
オブジェクトは、VCL_CREATE(自身, 名前, VCL_GUI_BUTTON)
テキストは、名前から「ボタン」を初期テキスト切り出し
・作る~
の中にあるVCL_CREATE
という関数が実際にボタンを作っている関数です。
1.588では、この引数「自身
」「名前
」が動的生成した部品(ボタン群[0])のものではなく、イベントが発生した部品(作成ボタン)のほうを指している…気がします!
以下のプログラムから確かめることができます。
■ボタンB +ボタン
・作る~
自身の名前を言う
作成ボタンとはボタン
そのクリックした時は~
ボタン群[0]をボタンBとして作成
ボタン群[0]→名前を言う
作る~
の中で自身の名前
は作成ボタン、
ボタン群[0]→名前
は_AUTO1962となりました。
本来、作る~
の中でも自身の名前
は_AUTO1962になってないといけないはずです。
バグ報告掲示板の様子
↑これが該当スレと思われます。
自分はこんな複雑なグループの使い方しないしー、と思っていたのですが、
クリックした時
に作成
できないとか身近な存在でした。
なでしこ1.588での回避法
どうやら作成
の最中に呼ばれた作る
のときだけ自身
がおかしいので
作成
が終わった後に作る
の中身を呼びます。
ボタン
を継承して作る
の中身を空にし、作る2
として元の作る
のコードを配置。
作成
が終わった後に作る2
を呼びます。
■ボタンB +ボタン //←ボタンのグループを継承
・作る~
・作る2~ //ここに元の作るのコードを配置
オブジェクトは、VCL_CREATE(自身, 名前, VCL_GUI_BUTTON)
テキストは、名前から「ボタン」を初期テキスト切り出し
作成ボタンとはボタン
そのクリックした時は~
ボタン群[0]をボタンBとして作成 //作成が終わった後に
ボタン群[0]→作る2 //作るだったものを呼ぶ
ボタン群[0]→Xは20
…バグが直るまでイベント中に動的生成するのは控えた方がよいでしょうね。