投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/5/24 18:17:33
動的に画面を作りたいという質問だと思ったのですが、
既に定義済みの画面を呼び出したいという質問だったのでしょうか。


> pgmxxxx が実行したい画面のプログラムです。
ここでいう「画面のプログラム」とは、何を指していますか?

pgm0001.exe というファイルを呼び出したいという意味であるのなら、
Process.Start メソッドを使います。


「public partial class pgm0001 : Form」な画面クラスを呼び出したいのなら、
 Form 変数名 = new pgm0001();
 変数名.Show(this);
などと書けますね。

"pgm0001" の部分などを文字列で指定したいなら、
Activator.CreateInstance メソッドを併用すると良いでしょう。
別の DLL で定義したフォームを呼び出すなんてこともできます。
https://gya-ia.hatenablog.com/entry/20111028/1319730965


あるいは、 = new pgm0001("引数1", "引数2"); のように
画面によっては追加のコンストラクタ引数が必要なケースなどでは、
あらかじめ static class Program などに
 public static Dictionary<string, Func<Form>> Creator = new Dictionary<string, Func<Form>>()
 {
  { "売上画面", () => new pgm0001("引数1", "引数2") },
  { "仕入画面", () => new pgm0002() },
 };
などの、「フォームを生成するためのデリゲート」を準備しておき、それを利用するという手も。


> 部署単位で表示する画面が違います。
それが「プログラムを動的に実行したい」という点に対して
どのように関わってくるのかが読み取れませんでした。


部署1を選択したときは pgm0001 と pgm0002 の 2 つが同時に実行され、
部署2を選択したときは pgm0003 だけが実行される、ということでしょうか。
部署によって画面数が違うようなので、階層管理の方法を相談したいという話?

あるいは最初にログイン画面があって、
部署1に所属しているユーザーなら
 [売上画面] ボタン ( pgm0001 を表示)と
 [仕入画面] ボタン ( pgm0002 を表示)
の 2 つが並んでいるメニュー画面が現れるが、
部署2に所属しているユーザーでログインした場合は、
 [マスタメンテ画面] ボタン ( pgm0003 を表示)
だけのメニュー画面を表示したい…といったことですか?


何を知りたいのかが、今一つ分からないです。