メニュー項目の一覧を取得したい

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/09/12(Thu) 21:59:12 No.2473

お世話になります。アークです。

質問ばかりで申し訳ありません。

さて、ウィンドウに貼り付けた部品は、
そのコンテナを指定する事で一覧を取得できますが、
メニュー項目の一覧を取得する事は可能でしょうか。

もし可能でしたらヒントだけでもお願いします。
勿論、「そんな事できないよ」という回答でも有難いです。
宜しくお願い致します。

Re: メニュー項目の一覧を取得したい

投稿者:とおりすがりや 投稿日:2019/09/13(Fri) 15:49:56 No.2475

いつもお世話になっております。
素人考えがお手伝いになればと思い書かせていただきます。

メニュー項目の取得方法はわかりませんでした。
ですので、逆に考えて「配列や辞書などを先に用意してメニュー項目に追加」するのはどうでしょうか?
そうすれば配列や辞書などからメニュー項目を作っているのでそれが実質メニュー項目を取得したものということになりますが……

とおりすがりや さん

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/09/13(Fri) 22:07:39 No.2478

こんばんは。コメントありがとうございます。

ですが今回の質問はメニュー項目を作る事では無く、
既に在るプログラムからメニュー項目を取得する事なので、
若しかしたらその様な方法は無いのかも知れません。

Re: とおりすがりや さん

投稿者:通り道 投稿日:2019/09/15(Sun) 13:39:06 No.2479

想定できる範囲が広すぎて回答の付けようがないです。
対象のアプリが、自分なのか他なのか
ほかのアプリなら、NativeなのかFormsなのかStoreAppなのかWPFなのかその他なのか
自身のあぷり(プロデルと仮定して)なら、どのメニューを使っているのか(旧来のメニューバーとすストリップバーがあった気がする)、プログインから読みたいもしくは、プラグインから設定したものを読みたい
などなど。
それによって、可否や方法やむずかしさが変わってきます。。

そのための、最大の近道は、具体的に書いて、質問を一般化しないことです。質問を見た人が、手元で正しい方法(質問者の意図と同じ)で試せる というのが重要です。
また、一般化する中で、本来は重要だった要素が省略されてしまうことを防げます(何が重要なのかは、質問者が正しく判断できることは稀です。なぜなら、だからこそ問題が解決できずに質問につながっているため)
意図しない回答が付いたり、それによってツリーが伸びるのは、たいていがそれが原因です。

通り道 さん

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/09/15(Sun) 14:23:33 No.2480

いつもお世話になります。アークです。

ご指摘ありがとうございます。
改めて補足説明をさせていただきます。

補足します

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/09/15(Sun) 14:49:49 No.2481

質問内容が漠然とし過ぎていたので補足したいと思います。

実はプロデルを始める前はPowershellを少し遣っていたのですが、
Powershellには公式のフォームデザイナが存在しません。
そこで少し慣れて来たプロデルを使用してそれを作ってみようと思いました。

試行錯誤の末、ターゲットをMDIアプリの子ウィンドウ上に作成して、
そこから必要な情報を収集して最終的にps1ファイとして書き出す事を思いつきました。
この方法で既に多くのウィンドウ部品の情報を取得して、
ps1ファイルに変換できる事は確認しています。

只、メニューやツールバー、ステータスバーの要素一覧を取得する方法が分かりません。
過去にPowershell自身でPowershell用フォームデザイナを作成した事が有るので、
必要なデータを拾えたならできそうな気はしているのですが…。

勿論、部品のグループ化やメニューのサブ項目の扱いなど色々と課題が有りそうですが、
先ずはメニューと一次プルダウンメニューに限定して、
それ以上は行く行く検討するつもりでいます。

私のスキルでは無謀かもしれない事は承知していますが、
宜しくお願い致します。

Re: 補足します

投稿者:通り道 投稿日:2019/09/15(Sun) 16:02:23 No.2482

結構、高難易度なことをすでにやってみますよ。

どう、取得してどう制御しているのか、わからないのですが、基本的部分のヒントだけ。

プロデルのGUIは、System.Windows.Forms以下の部品群で組まれています。
ウィンドウ部品(メインウィンドウも含む)が、System.Windows.Forms.Fomです。
通常、ウィンドウ内の部品は、親となるウィンドウの子として、ツリー階層を構成するように登録されてゆくのですが、メニューだけは、直接Formにも登録されます。
・メニュー
Form.MainMenuStrip
親となるウィンドウから、Formのインスタンスが取得できるようでしたら、試してみたください。
なお、設定・取得できるのは、プロデルとしての部品ではなく、System.Windows.Forms.MenuStrip(か、そのサブクラス)です。
また、シンプルメニューの場合、「Form.Menu」に登録されるはずです。実態は、System.Windows.Forms.MainMenu(かそのサブクラス)のインスタンスです。

可能ならば、レフレクション等で参照できるのではと思います。

より、確実なところは、実際のソースと実際のコードが必要です。
(同じものをこちらでも1から作るというのは厳しいというか難しそう)

こちらです

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/09/15(Sun) 17:59:48 No.2483

通り道 さん、お世話になります。アークです。

何時も貴重な情報をありがとうございます。

〉結構、高難易度なことをすでにやってみますよ。
いぇ、それがそうでも無くちゃんと勉強した事が一度も無いので、
基本的な手順とそれでできない処は創意工夫で乗り切っています。

〉どう、取得してどう制御しているのか、わからないのですが、
上記の事も含め、ここにソースを公開してしまうのが最善だとは思うのですが、
既に3000行近いソースを掲載するのは流石に気が引けるので下記にアップして置きました。
拙いコードで実現しているのがお分かりかと思います。

https://mega.nz/#!i9ARVCpL!LQz8Ib9SFZ5OOxAVYYjUCCoF8EoI6w5NRIuEMKrS-Hs

より詳細な情報は下記の私のブログで紹介しています。
http://handslab.blog.fc2.com/

〉System.Windows.Forms.MenuStrip
〉System.Windows.Forms.MainMen
先ずはこの辺りを調べてみます。

今後ともよろしくお願いいたします。

Re: こちらです

投稿者:通り道 投稿日:2019/09/19(Thu) 01:08:53 No.2485

毎々こんばんは。

> https://mega.nz/#!i9ARVCpL!LQz8Ib9SFZ5OOxAVYYjUCCoF8EoI6w5NRIuEMKrS-Hs

こちらからでは見えないようです。
(mega.nzのアカウント(Lite)を作成してみてもダメでした)
アクセス後、「#」なしの引数付きURLに移動するのですが、サイトの紹介と自身のメニューしか
無いように見えます
(初めて見る画面なので、単に見落としている可能性もありますが)

> より詳細な情報は下記の私のブログで紹介しています。
> http://handslab.blog.fc2.com/

ちまちま読んでみます。

通り道さん

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/09/19(Thu) 08:38:36 No.2486

通り道 さん、おはようございます。アークです。

〉こちらからでは見えないようです。
失礼しました。何か仕様が変更になったようです。
改めまして下記からお願いします。
https://ux.getuploader.com/reg_mem/download/248

〉ちまちま読んでみます。
お恥ずかしいです。

今後ともよろしくお願いいたします。

Re: 通り道さん

投稿者:通り道 投稿日:2019/09/22(Sun) 20:57:38 No.2487

こんにちは。

無事落とせました。

現在、別途配列に保存を試みている部分を、対象の部品(メニュー)自体から
取得できないか(画面そのものの外に二重で管理するのを避けたい)
ということでよいでしょうか?

いろいろ試してみます。

Re^2: 通り道さん

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/09/22(Sun) 21:09:19 No.2488

通り道さん、こんばんは。

はい、その通りです。
宜しくお願い致します。<m(_ _)m>

Re^3: 通り道さん

投稿者:通り道 投稿日:2019/09/24(Tue) 21:22:43 No.2489

こんばんは。

プロデルでは・・というより、Windows.Formsでは、以下のような感じで辿れそうです。
基本的には、プロデル自体に、参照できるようにしてもらった方がよさそうです。
(メニューは取れないんですが、古い形式のシンプルメニューはプロパティがあって、取得も設定もできるんですよね。)
このプログラムの場合、ウィンドウは、ただ、メニューを調べさせる対象を準備するためだけにあるのに近いです。
----------------------
Form型というドットネット型(「System.Windows.Forms.Form」)を作る
MenuStrip型というドットネット型(「System.Windows.Forms.MenuStrip」)を作る
ーーToolStripMenuItem型というドットネット型(「System.Windows.Forms.ToolStripMenuItem」)を作る
ToolStripDropDownItem型というドットネット型(「System.Windows.Forms.ToolStripDropDownItem」)を作る
Forms_MainMenuStripプロパティ情報は、Form型の管理型:"GetProperty"(「MainMenuStrip」)
MenuStrip_Itemsプロパティ情報は、MenuStrip型の管理型:"GetProperty"(「Items」)
ーーToolStripMenuItem_DropDownItemsプロパティ情報は、ToolStripMenuItem型の管理型:"GetProperty"(「DropDownItems」)
ToolStripDropDownItem_DropDownItemsプロパティ情報は、ToolStripDropDownItem型の管理型:"GetProperty"(「DropDownItems」)

窓というテスト窓を作る
窓を表示する
待機する

ーーメニュー項目を再帰的に辿る
【親メニュー項目】を項目色々する手順
 【型名】は、親メニュー項目の種類名
 もし、型名が空ならば、
  ーーこのケアをしないと、区切り線以外の型名(種類の名前)が取れない。インスタンスの名前は取れるのになぜ?
  型名は、(親メニュー項目:"GetType"())の"Name"
 もし終わり
  「[型名]:[親メニュー項目の名前]」を表示する
  もし、ToolStripDropDownItem型の管理型:IsInstanceOfType(親メニュー項目)でなければ、
   ーーこの型を継承していないと、DropDwonItemsが無い
   ーー多くの場合は、セパレータ(System.Windows.Forms.ToolStripSeparator)
   返る
  もし終わり
  【メニュー項目一覧】は、ToolStripDropDownItem_DropDownItemsプロパティ情報:"GetValue"(親メニュー項目)
  メニュー項目一覧を【メニュー項目】へそれぞれ繰り返す
   メニュー項目を項目色々する
  繰り返す終わり
終わり

ーーウィンドウから、メインメニューストリップを取得して、トップメニューの分だけ繰り返す
【親ウィンドウ:ウィンドウ】を色々する手順
  【メインメニュー】は、Forms_MainMenuStripプロパティ情報:"GetValue"(親ウィンドウ)
  【トップメニュー項目一覧】は、MenuStrip_Itemsプロパティ情報:"GetValue"(メインメニュー)
  トップメニュー項目一覧を【トップメニュー項目】へそれぞれ繰り返す
   トップメニュー項目を項目色々する
  繰り返す終わり
終わり
 
テスト窓とは
  ウィンドウを継承する
はじめの手順
    初期化する
    ーー貼り付けた部品に対する操作をここに書きます
  終わり
初期化する手順
  ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
  この内容を「テスト窓」に変える
  ボタン1というボタンを作る
    その位置と大きさを{82,132,105,27}に変える
    その内容を「ボタン1」に変える
    その移動順を3に変える
  ラベル1というラベルを作る
    その位置と大きさを{12,93,39,12}に変える
    その内容を「ラベル1」に変える
    その移動順を2に変える
  テキスト1というテキストを作る
    その位置と大きさを{113,90,139,19}に変える
    その移動順を1に変える
  メニュー1というメニューを作る
    その位置と大きさを{0,0,284,24}に変える
    その内容を「メニュー1」に変える
    その移動順を4に変える
    ファイルToolStripMenuItemというメニュー項目をメニュー1へ追加する
      その内容を「ファイル」に変える
      開くToolStripMenuItemというメニュー項目をメニュー1のファイルToolStripMenuItemへ追加する
        その内容を「開く」に変える
      閉じるToolStripMenuItemというメニュー項目をメニュー1のファイルToolStripMenuItemへ追加する
        その内容を「閉じる」に変える
      ToolStripSeparator1という区切り線部品をメニュー1のファイルToolStripMenuItemへ追加
        その大きさを{101,6}に変える
      終了ToolStripMenuItemというメニュー項目をメニュー1のファイルToolStripMenuItemへ追加する
        その内容を「終了」に変える
    編集ToolStripMenuItemというメニュー項目をメニュー1へ追加する
      その内容を「編集」に変える
      RedoUndoToolStripMenuItemというメニュー項目をメニュー1の編集ToolStripMenuItemへ追加する
        その表示を○に変える
        その内容を「Redo/Undo」に変える
        UndoToolStripMenuItemというメニュー項目をメニュー1の編集ToolStripMenuItemのRedoUndoToolStripMenuItemへ追加する
          その内容を「Undo」に変える
        RedoToolStripMenuItemというメニュー項目をメニュー1の編集ToolStripMenuItemのRedoUndoToolStripMenuItemへ追加する
          その内容を「Redo」に変える
      ここToolStripMenuItemというメニュー項目をメニュー1の編集ToolStripMenuItemへ追加する
        その表示を○に変える
        その内容を「ここ」に変える
    ヘルプToolStripMenuItemというメニュー項目をメニュー1へ追加する
      その内容を「ヘルプ」に変える
      "あばうとToolStripMenuItem"というメニュー項目をメニュー1のヘルプToolStripMenuItemへ追加する
        その内容を「あばうと」に変える
終わり

ボタン1がクリックされた時の手順
    これを色々する
  終わり
終わり

ありがとうございました

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/09/24(Tue) 23:52:41 No.2490

通り道さん、こんばんは。アークです。

早速、書いて頂いたサンプルを実行して、
希望通りにメニュー項目が取得できる事を確認しました。
いつも乍ら凄いですね。

また、要所要所にコメント入りの親切なサンプルになっているので分かり易いです。
この手法が自在に使えるようになれば鬼に金棒的に便利そうなのですが、
C#(.NET)の知識や経験が殆ど無いのでそうなるには時間が掛かりそうです。

私なりに少し消化してから実際に組み込んでみたいと思います。
お陰様で先に進む事ができそうです。

貴重な情報とサンプルをありがとうございました。
今後ともよろしくお願いいたします。

「子部品一覧」設定項目を追加しました

投稿者:ゆうと 投稿日:2019/09/26(Thu) 02:57:15 No.2492

こんにちは ゆうとです。

1.6.974で「子部品一覧」設定項目を追加しました。
通り道さま、フォロー感謝致します。

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

メイン画面とは
  ウィンドウを継承する
  はじめの手順
    初期化する
    ーー貼り付けた部品に対する操作をここに書きます
  終わり
  初期化する手順
  ーー自動生成された手順です。ここにプログラムを書き加えても消える場合があります
  この実質大きさを{562,331}に変える
  この内容を「メイン画面」に変える
  初期化開始する
  ボタン3というボタンを作る
    その位置と大きさを{131,247,75,23}に変える
    その内容を「ボタン3」に変える
    その移動順を2に変える
  ボタン2というボタンを作る
    その位置と大きさを{128,144,75,23}に変える
    その内容を「ボタン2」に変える
    その移動順を1に変える
  ボタン1というボタンを作る
    その位置と大きさを{134,64,75,23}に変える
    その内容を「ボタン1」に変える
    その移動順を3に変える
  メニュー1というメニューを作る
    その位置と大きさを{0,0,562,33}に変える
    その内容を「メニュー1」に変える
    その移動順を4に変える
    AAAToolStripMenuItemというメニュー項目をメニュー1へ追加する
      その表示を○に変える
      その内容を「AAA」に変える
      BBBBToolStripMenuItemというメニュー項目をメニュー1のAAAToolStripMenuItemへ追加する
        その内容を「BBBB」に変える
      CCCToolStripMenuItemというメニュー項目をメニュー1のAAAToolStripMenuItemへ追加する
        その内容を「CCC」に変える
      DDDToolStripMenuItemというメニュー項目をメニュー1のAAAToolStripMenuItemへ追加する
        その内容を「DDD」に変える
  初期化終了する
  メイン画面の設計スケール比率を{144,144}に変える
終わり

ボタン1がクリックされた時の手順
AAAToolStripMenuItemの子部品一覧すべての内容を報告する
終わり
終わり
---------------

Re: 「子部品一覧」設定項目を追加しました

投稿者:アーク <info.nds.laboratry あっとまーくgmail.com> 投稿日:2019/09/26(Thu) 11:00:48 No.2496

こんにちは。アークです。

お世話になります。

サンプルを少し修正して大元からツリー上に辿れる事を確認しました。
対応ありがとうございました。

▲ページの先頭へ

- WebForum -