部品の名前について

投稿者:とおりすがりや 投稿日:2018/12/04(Tue) 15:47:05 No.2306

どうしても解決しないのでお知恵をお貸しください

部品の名前、例えばボタン1やテキスト領域1などですが
その部品の名前を変数で行うことはできないのでしょうか?

具体的にやりたいことはボタン1を押した回数だけボタン2、ボタン3、ボタン4・・・と増やすことなのですが
位置などは変数で指定することができたのですが
部品の名前だけはどうやって行えばいいのかわかりません。

私が思いついたのは――

メイン画面を表示する
待機する

メイン画面とは
  ウィンドウを継承する
  はじめの手順
    初期化する
    ーー貼り付けた部品に対する操作をここに書きます
  終わり
  初期化する手順
  ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
  この内容を「メイン画面」に変える
  初期化開始する
  ボタン1というボタンを作る
    その位置と大きさを{63,55,75,23}に変える
    その内容を「ボタン1」に変える
  初期化終了する
終わり

ボタン1がクリックされた時の手順
  ボタン2というボタンを作る
    その位置と大きさを{90,100,75,23}に変える
    その内容を「ボタン2」に変える
終わり

という安直な方法なのですが、これだとボタン2を生成するとその後は生成できません。
ボタン2の部分を変数が使えれば簡単なんですが……どなたかご教授いただけたら幸いです。

Re: 部品の名前について

投稿者:田中充 投稿日:2018/12/09(Sun) 08:15:06 No.2307

部品の名前には変数が使えます。

下記のように部品名前という変数を指定して、ラベルを動的に生成できてます。


部品名前というラベルを作る


以上です。

自己解決しました

投稿者:とおりすがりや 投稿日:2018/12/09(Sun) 16:59:24 No.2308

> 部品の名前には変数が使えます。
田中充さんから頂いたアドバイスでは解決できなかったのですが
なんとか解決することができました。

どうもボタン1やラベル1などといった「部品の名前」自体は変数で設定できないようです。
ですので「部品の名前」そのものを後で変更することにしました。
一応、どなたか困った時用にサンプルを記載しておきます。

本サンプルはボタンを押しただけボタンを増殖させます。

メイン画面を表示する
待機する

メイン画面とは
  ウィンドウを継承する
  はじめの手順
    初期化する
    ーー貼り付けた部品に対する操作をここに書きます
  終わり
  初期化する手順
  ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
  この内容を「メイン画面」に変える
  初期化開始する
  ボタン1というボタンを作る
    その位置と大きさを{0,2,75,23}に変える
    その内容を「ボタン1」に変える
  初期化終了する
終わり
回数は、0

ボタン1がクリックされた時の手順
回数は、回数+1
最終名前は、部品+回数
場所は、回数×40
ボタン名前というボタンを作る
その位置と大きさを{0,場所,75,23}に変える
その内容を回数に変える
その名前を最終名前に変える
終わり
終わり




>
> 下記のように部品名前という変数を指定して、ラベルを動的に生成できてます。
>
>
> 部品名前というラベルを作る
>
>
> 以上です。

バグでしょうか?

投稿者:とおりすがりや 投稿日:2018/12/12(Wed) 07:35:02 No.2312

自己解決したといいましたが、別の問題が発生しました。

部品の名前を変更することでボタンの無限生成は可能になったのですが
どうも部品の名前を変更しても元の部品の名前のままになっているようなのですが
素人の私には、使い方を間違っているのか、それともバグなのか判断できません。

プログラム自体は上記スレに記載、もしくは下に引用しているものでも確認できます。
このプログラムだとボタン1によって生成されたボタンの名前は最初は「ボタン名前」で名前変更後は「部品+回数」(うっかり部品という変数を入れてしまいましたが設定がないので無)なので
ボタンをクリックした回数が生成されたボタンの名前となるはずなのですが、変更前の「ボタン名前」というボタンのままなのです。

おかげでボタンは生成できても、それを個別に使うことができません。

解決にご助力お願いいたします。


> > 部品の名前には変数が使えます。
> 田中充さんから頂いたアドバイスでは解決できなかったのですが
> なんとか解決することができました。
>
> どうもボタン1やラベル1などといった「部品の名前」自体は変数で設定できないようです。
> ですので「部品の名前」そのものを後で変更することにしました。
> 一応、どなたか困った時用にサンプルを記載しておきます。
>
> 本サンプルはボタンを押しただけボタンを増殖させます。
>
> メイン画面を表示する
> 待機する
>
> メイン画面とは
>   ウィンドウを継承する
>   はじめの手順
>     初期化する
>     ーー貼り付けた部品に対する操作をここに書きます
>   終わり
>   初期化する手順
>   ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
>   この内容を「メイン画面」に変える
>   初期化開始する
>   ボタン1というボタンを作る
>     その位置と大きさを{0,2,75,23}に変える
>     その内容を「ボタン1」に変える
>   初期化終了する
> 終わり
> 回数は、0
>
> ボタン1がクリックされた時の手順
> 回数は、回数+1
> 最終名前は、部品+回数
> 場所は、回数×40
> ボタン名前というボタンを作る
> その位置と大きさを{0,場所,75,23}に変える
> その内容を回数に変える
> その名前を最終名前に変える
> 終わり
> 終わり
>
>
>
>
> >
> > 下記のように部品名前という変数を指定して、ラベルを動的に生成できてます。
> >
> >
> > 部品名前というラベルを作る
> >
> >
> > 以上です。

Re: バグでしょうか?

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2018/12/12(Wed) 12:31:06 No.2313

とおりすがりやさん、アークです。

〉最終名前は、部品+回数
その様にしたいなら例えば、

最終名前は、「部品」&回数

この様に書けば意図した結果が得られます。

また、増殖したボタンのイベントを拾う場合は、

そのクリックされた時の手順は、ボタンがクリックされた

の一文を書き足しておくと、

ボタンがクリックされた時の手順
  発生元の名前を表示する
終わり

の様な手順でクリックされたボタンを取得できます。

より具体的な作例は私のサイトで公開しています。

Re: 部品の名前について

投稿者:とおり 投稿日:2018/12/13(Thu) 00:25:14 No.2316

質問で、部品の名前と呼んでいるのが、プログラム中で指定している、作成した部品に付けている名前のことだとしたら、通常、それ自体を動的に増やす必要はありません。

プログラム中で、
「AAAというボタンを作る」
とした場合、AAAという名前をもつ変数の宣言と、ボタン部品の実態を生成して変数AAAに代入するという操作を行っています。普段、プログラムの中で指定しているのは、この時宣言した変数の変数名です(変数以外のなにか部品固有のものが部品名としてできるわけでは無いはずです)
この変数は、他の変数と同じように、グローバル変数となっていたり、属する種類の変数になっていたりします(ウィンドウを継承した種類の手順で作っている場合が、その種類の変数になります)
実際、どう作成されて、どう保持されているのかは、CTRL+Gのデバッグ画面から、確認してみてください。ボタンの実態は、それを保持している変数の変数名とは別に、名前を持っています。この名前は、変数名とは別のものです(多くの場合、同じ内容にはなっています)

こういった、実行時まで確定しない場合には、配列や辞書の変数を1つ宣言しておいて、その中に、部品の実態を入れて利用してみてください。

その際、
「AAAというボタンを作る。」
という構文のかわりに、
「AAAは、ボタンを作ったもの。」
という構文で部品の実態を生成するようにしてみてください。
なお、動的に部品を生成する場合には、その実態を保持している変数がなくならないように、注意してください。どこからも保持されてない状態になってしまうと、動かしたり消したりが難しくなります(一応、親となる部品からたどることはできます)。
例えば、
---
【AAA:ボタン】
AAAは、ボタンを作ったもの。
AAAは、ボタンを作ったもの。
---
としてしまうと、先に作ったボタンの実態を操作することが難しくなります。
---
【ボタン一覧:辞書】は、空
【AAA:ボタン】は、ボタンを作ったもの。
ボタン一覧の「ボタン1」は、AAA。
AAAは、ボタンを作ったもの。
ボタン一覧の「ボタン2」は、AAA。
---
のように、作ったものがどこかに残るようにして、管理します(辞書を使った場合の例。ボタン一覧が、手順内のローカル変数にならないよう注意。)

▲ページの先頭へ

- WebForum -