なでしこを明後日の方向に

日本語プログラム言語なでしこを応援しています

なでしこ1の動的生成した部品がエラーになってしまう件

※ 記事が書かれた時点のなでしこはv1.588です。

なでしこ1で動的生成した部品について、以前のバージョンでは起きなかったバグがあるようです。
GUI部品のイベント中に動的生成するとエラーになってしまいます。

わかりやすく言うと「クリックした時は~」などの部品イベント中に 「(部品名)として作成」の命令を使用した時、ということです。 作成した部品に「→」でアクセスするとエラーを吐きます

サンプルプログラムはこちら

作成ボタンとはボタン
そのクリックした時   //GUI部品のイベント中に
  ボタン群[0]ボタンして作成  //部品を作成すると
  ボタン群[0]X20  //エラーになる(生成に不具合)

・エラーメッセージ

[なでしこ(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になってないといけないはずです。

バグ報告掲示板の様子

「なでしこv1」開発掲示板

↑これが該当スレと思われます。

自分はこんな複雑なグループの使い方しないしー、と思っていたのですが、 クリックした時作成できないとか身近な存在でした。

なでしこ1.588での回避法

どうやら作成の最中に呼ばれた作るのときだけ自身がおかしいので
作成が終わった後に作るの中身を呼びます。

ボタンを継承して作るの中身を空にし、作る2として元の作るのコードを配置。
作成が終わった後に作る2を呼びます。

■ボタンB +ボタン //←ボタンのグループを継承
 ・作る
 ・作る2 //ここに元の作るのコードを配置
   オブジェクト、VCL_CREATE(自身, 名前, VCL_GUI_BUTTON)
   テキスト、名前から「ボタン」初期テキスト切り出し

作成ボタンとはボタン
そのクリックした時
  ボタン群[0]ボタンBして作成 //作成が終わった後に
  ボタン群[0]作る2 //作るだったものを呼ぶ
  ボタン群[0]X20

…バグが直るまでイベント中に動的生成するのは控えた方がよいでしょうね。