ぼたんオブジェクトの取得

投稿者:田中充 投稿日:2018/08/09(Thu) 06:39:39 No.2158

ご教授お願い致します。

画面エディタでボタン1からボタン9を作成し、それを1から9までのループで内容を変えるには、どのようにすれば良いのでしょうか?

Re: ぼたんオブジェクトの取得

投稿者:ゆうと 投稿日:2018/08/10(Fri) 17:10:10 No.2163

田中さん、こんにちは。

> 画面エディタでボタン1からボタン9を作成し、それを1から9までのループで内容を変えるには、どのようにすれば良いのでしょうか?

この一文だけでは、何をしたいのか理解できません。
もう少し詳しく丁寧に書いてください。

プロデルデザイナの「ウィンドウの設計」画面でボタンを作ることができます。
9個必要があれば、マウスでボタンを9回、貼り付けます。
https://rdr.utopiat.net/docs/onepage/devenv.html#formdesign

例えば、ボタン1やボタン9の内容を変えるには
----
ボタン1の内容を「こんにちは」に変える
ボタン9の内容を「こんにちは」に変える
----
と書きます。

参考にしてください。

Re^2: ぼたんオブジェクトの取得

投稿者:田中充 投稿日:2018/08/16(Thu) 11:25:58 No.2170

お世話になっております。田中です。

説明不足で申し訳ありません。
VB6のindex的に多量のオブジェクトをループで回して設定したいのです。
#オブジェクト指向では邪道なのかもしれません。

下記例では、ボタン4つを作っています。そのボタンの前景文字をループで回して変更したいのです。
実際には、釦を最大100個作成し、CSVファイルから定義情報を読み込んで前景文字を変更します。

sample ソース

メイン画面を表示する

4回、値にカウントしながら繰り返す
  ボタン名=「ボタン」&[値]
  釦ラベル=「ぼたん」&[値]
  メイン画面の[ボタン名]の内容は、[釦ラベル] →個々の部分。これではエラーとなる。
繰り返し終わり

待機する

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

Re^3: ぼたんオブジェクトの取得

投稿者:アーク <info_nds-labo あっとまーくexcite.co.jp> 投稿日:2018/08/17(Fri) 22:25:15 No.2177

田中充さん、こんばんは。

そのエラーを解決するだけなら下記の様にすればOKです。

4回、値にカウントしながら繰り返す
  ボタンは、メイン画面の「ボタン[値]」
  ボタンの内容を「釦[値]」に変える
繰り返し終わり

只、ボタンそのものも動的に生成してしまった方が簡単なのでは…。

Re^4: ぼたんオブジェクトの取得

投稿者:田中充 投稿日:2018/08/18(Sat) 17:59:54 No.2184

田中です。

回答ありがとうございます。
サンプルでちゃんと動作するのを確認しました。

ただ、自分のプログラム(大量の釦を配置)では、
オブジェクトの参照を取ってきてくれません。エラーにもならないで(無)になります。
何かプログラムに悪い所があるのだと思いますので、自分で調べます。

動的に作らない理由:
色々な場所にボタンを配置しているので、動的に場所や大きさを指定して作るより
ビルダーで配置した方が楽なので、このような手法を取ろうとしています。

以上です。

Re^5: ぼたんオブジェクトの取得

投稿者:田中充 投稿日:2018/08/22(Wed) 00:31:03 No.2191

お世話になっております。田中です。

自分なりに調査して見ましたがオブジェクトの参照を取得できません。
自分が作っている画面に近いものをサンプルとして作成しましたので、どこが悪いのか
ご教授いただけませんでしょうか?

★★ サンプル ★★

メイン画面を表示する

4回、値にカウントしながら繰り返す
  ぼたんは、メイン画面の「ボタン[値+10]」
  ぼたんの内容を「釦[値+10]」に変える
繰り返し終わり


待機する

メイン画面とは
  ウィンドウを継承する
  はじめの手順
    初期化する
    ’貼り付けた部品に対する操作をここに書きます
  終わり
  
  初期化する手順
  ’自動生成された手順です。ここにプログラムを書き加えても消える場合があります
  この内部領域大きさを{784,561}に変える
  この最前面を○に変える
  この種類を「ダイアログ」に変える
  この最大化ボタンを×に変える
  この最小化ボタンを×に変える
  この初期位置を「手動」に変える
  この内容を「メイン画面」に変える
  タブフレーム1というタブフレームを作る
    その位置と大きさを{0,0,784,561}に変える
    その見出しサイズを{65,18}に変える
    その移動順を2に変える
    そのドッキング方向を「全体」に変える
    タブページ1というタブページをタブフレーム1へ作る
      その位置と大きさを{4,22,776,535}に変える
      その内容を「タブページ1」に変える
      そのフォーカス移動可能を○に変える
      その背景色を「黒」に変える
      ラベル11というラベルをタブページ1へ作る
        その位置と大きさを{386,0,284,64}に変える
        その内容を「ラベル11」に変える
        そのフォントを「MS ゴシック,48」に変える
        その移動順を11に変える
        その文字色を「白」に変える
        その背景色を「黒」に変える
      ボタン11というボタンをタブページ1へ作る
        その位置と大きさを{0,0,384,115}に変える
        その内容を「ボタン11」に変える
        その移動順を6に変える
        そのフォントを「MS ゴシック,48」に変える
        その背景色を「黒」に変える
      ボタン12というボタンをタブページ1へ作る
        その位置と大きさを{0,110,384,115}に変える
        その内容を「ボタン12」に変える
        その移動順を7に変える
        そのフォントを「MS ゴシック,48」に変える
        その背景色を「黒」に変える
      ボタン13というボタンをタブページ1へ作る
        その位置と大きさを{0,221,384,115}に変える
        その内容を「ボタン13」に変える
        その移動順を8に変える
        そのフォントを「MS ゴシック,48」に変える
        その背景色を「黒」に変える
      ボタン14というボタンをタブページ1へ作る
        その位置と大きさを{0,326,384,115}に変える
        その内容を「ボタン14」に変える
        その移動順を9に変える
        そのフォントを「MS ゴシック,48」に変える
        その背景色を「黒」に変える
      ボタン15というボタンをタブページ1へ作る
        その位置と大きさを{0,426,384,115}に変える
        その内容を「ボタン15」に変える
        その移動順を10に変える
        そのフォントを「MS ゴシック,48」に変える
        その背景色を「黒」に変える
      ラベル12というラベルをタブページ1へ作る
        その位置と大きさを{386,73,284,64}に変える
        その内容を「ラベル12」に変える
        そのフォントを「MS ゴシック,48」に変える
        その移動順を12に変える
        その文字色を「白」に変える
        その背景色を「黒」に変える
      ラベル13というラベルをタブページ1へ作る
        その位置と大きさを{386,148,284,64}に変える
        その内容を「ラベル13」に変える
        そのフォントを「MS ゴシック,48」に変える
        その移動順を13に変える
        その文字色を「白」に変える
        その背景色を「黒」に変える
      ラベル14というラベルをタブページ1へ作る
        その位置と大きさを{386,239,177,40}に変える
        その内容を「ラベル14」に変える
        そのフォントを「MS ゴシック,30」に変える
        その移動順を14に変える
        その文字色を「白」に変える
        その背景色を「黒」に変える
      ラベル15というラベルをタブページ1へ作る
        その位置と大きさを{386,296,177,40}に変える
        その内容を「ラベル15」に変える
        そのフォントを「MS ゴシック,30」に変える
        その移動順を15に変える
        その文字色を「白」に変える
        その背景色を「黒」に変える
      ラベル16というラベルをタブページ1へ作る
        その位置と大きさを{386,368,284,64}に変える
        その内容を「ラベル16」に変える
        そのフォントを「MS ゴシック,48」に変える
        その移動順を16に変える
        その文字色を「白」に変える
        その背景色を「黒」に変える
      ラベル17というラベルをタブページ1へ作る
        その位置と大きさを{386,445,284,64}に変える
        その内容を「ラベル17」に変える
        そのフォントを「MS ゴシック,48」に変える
        その移動順を17に変える
        その文字色を「白」に変える
        その背景色を「黒」に変える
終わり

★★ サンプル終わり★★

以上、よろしくお願いいたします。

これで如何でしょうか

投稿者:アーク <info_nds-labo あっとまーくexcite.co.jp> 投稿日:2018/08/22(Wed) 07:19:25 No.2192

田中さん、おはようございます。アークです。

サンプル拝見しました。
幾つか問題が有るようです。
全ては下記の4行に在ります。

4回、値にカウントしながら繰り返す
  ぼたんは、メイン画面の「ボタン[値+10]」
  ぼたんの内容を「釦[値+10]」に変える
繰り返し終わり

1. この時点ではオブジェクトを完全には取得できないようです。
2. ボタンが配置されているコンテナが違います。

これ等を解決する為に先ずはこの処理自体を移動させます。
例えば、「開いた」手順内にです。
次にこの場合のボタンオブジェクトが配置されているコンテナは、
メイン画面ではなくタブフレーム1のタブページ1です。
これ等を修正すると下記の様になるかと思います。

  開いた時の手順
    タブフレーム1の選択タブをタブページ1に変える
    4回、値にカウントしながら繰り返す
      ぼたんは、タブフレーム1の選択タブの「ボタン[値+10]」
      ぼたんの内容を「釦[値+10]」に変える
    繰り返し終わり
  終わり

参考になれば宜しいのですが…。

コンテナ指定無しでの取得はできないでしょうか?

投稿者:田中充 投稿日:2018/08/23(Thu) 09:31:39 No.2193

田中です。
回答ありがとうございます。
訂正イメージで動作する事を確認しました。

ただ、当方のプログラムの場合、任意のタブやフレームの中の釦等を変えて行きたいのです。
したがって、コンテナを探さないといけないのは、厳しいものがあります。
コンテナ指定無しでオブジェクト参照を取得できませんでしょうか?

当方のプログラムでは、下記のように分岐文を並べまくって対応しています(-_-;)
これだとコンテナ指定無しでもオブジェクト参照を取得できるのです。
ただ、すごい数になるので、何とかならないものかと考えてます。

  開いた時の手順
      4回、値にカウントしながら繰り返す
       値について分岐
       1の場合
          ぼたんは、ボタン11
       2の場合
          ぼたんは、ボタン12
       3の場合
          ぼたんは、ボタン13
       4の場合
          ぼたんは、ボタン14
       分岐終わり
       ぼたんの内容を「釦[値+10]」に変える
      繰り返し終わり
  終わり  

Re: コンテナ指定無しでの取得はできないでしょうか?

投稿者:通りすがり 投稿日:2018/08/23(Thu) 22:12:59 No.2194

再帰的にたどりながら探すとすると、以下のような感じでしょうか。
(わりと何でもできますね、プロデル)
ここでは、力技で実装してしまいましたが、プロデル本体に同じような動きをする命令があると便利そうです。
2つ目のブロックにある処理が、メイン画面の定義以外の部分です。メイン画面に以下を追記します。
-------------------------
  開いた時の手順
   これへ名前変更
  終わり
-------------------------
以下は、最初の画面表示処理と、上記で呼びされれる側の処理となる部分です。メイン画面の種類の定義の前を以下で置き換えてください。
-------------------------
メイン画面を表示する
待機する

[部品]をタブフレーム判定する手順
 型名は、(部品から型情報を取得)の名前
 もし、型名=「タブフレーム」なら、
  ○を返す
 もし終わり
 ×を返す
終わり

[部品]をコンテナ判定する手順
 型名は、(部品から型情報を取得)の名前
 もし、型名=「メイン画面」または型名=「ウィンドウ」または型名=「パネル」または型名=「タブページ」なら、
  ○を返す
 もし終わり
 ×を返す
終わり

[親]から[部品名:文字列]をとっても探す手順
 '(親から型情報を取得)の名前を表示
 もし、親をタブフレーム判定=○なら、
  '「タブフレーム」を表示
  元番号は、親の選択番号
  (親の一覧の個数)回 順番にカウントしながら 繰り返す
   親の選択番号は、順番
   今タブは、親の選択タブ
   もし、今タブの内容=部品名なら、
    '「タブに見つけた」を表示
    親の選択番号は、元番号
    今タブを返す
   もし終わり
   結果は、今タブから部品名をとっても探す
   もし、結果<>「」なら、
    '「タブの子が見つけた」を表示
    親の選択番号は、元番号
    結果を返す
   もし終わり
  繰り返し終わり
  '「タブフレームにはなかった」を表示
  親の選択番号は、元番号
  「」を返す
 もし終わり
 もし、親をコンテナ判定=○なら、
  '「コンテナ」を表示
  部品達は、親の子部品一覧
  もし、部品達の個数=0なら、
   '「子が無かった」を表示
   「」を返す
  もし終わり
  部品達のすべての子部品についてそれぞれ繰り返す
   もし、子部品の名前=部品名なら、
    '「見つけた」を表示
    子部品を返す
   もし終わり
   結果は、子部品から部品名をとっても探す
   もし、結果<>「」なら、
    '「子が見つけた」を表示
    結果を返す
   もし終わり
  繰り返し終わり
  '「ウィンドウにはなかった」を表示
  「」を返す
 もし終わり
 '「それ以外」を表示
 '親型を表示
 「」を返す
終わり

[親]へ名前変更する手順
 4回、値にカウントしながら繰り返す
   ぼたんは、メイン画面から「ボタン[値+10]」をとっても探す
   '(ぼたんから型情報を取得)の名前を表示
   ぼたんの内容を「釦[値+10]」に変える
 繰り返し終わり
終わり
-------------------------
プロデルでは、ウィンドウやパネルなどの中で、名前を付けて作成した部品は、作成した親となる部品の設定項目に追加されるのと合わせて、その作成された部品自体の名前にも設定されます。ここでは、その名前をキーにして、メイン画面から再帰的に探しに行っています。
なお、既存の種類を継承して種類を作った場合、上記の判定の中で、「タブフレーム」なのか、他の部品を複数持てる「コンテナ」なのかの判定がうまくゆかなくなります。
記載中、「メイン画面」の種類名を判定しているのと同じような感じで判定を追加する必要があります(メイン画面は、ウィンドウを継承した種類ですが、型情報の名前は、「メイン画面」としか取得できまず、ウィンドウを継承したということを判定する方法はなさそうでした)

解決しました。

投稿者:田中充 投稿日:2018/08/24(Fri) 09:00:01 No.2195

とおりすがりさん、ありがとうございます。

ご教示いただいたソースに下記修正しました所、参照が取ってこれました。
#もしに「フレーム」を追加

感謝感激です!!!!
ありがとうございます。


   もし、型名=「メイン画面」または型名=「ウィンドウ」または型名=「パネル」または型名=「タブページ」または型名=「フレーム」なら、

▲ページの先頭へ

- WebForum -