2017-03-15 8 views
2

複数のフォームを一度に作成するにはどうすればいいですか?一度に複数のフォームを開く方法

public static void RepeatAction(int repeatCount, Action action) 
{ 
    for (int i = 0; i < repeatCount; i++) 
     action(); 
} 

static void Main(string[] args) 
{ 
    RepeatAction(10,() => { 
     Random random = new Random(); 
     int x = random.Next(0, 100); 
     Random random1 = new Random(); 
     int y = random.Next(0, 100); 

     var form = new Form1 
     { 
      StartPosition = FormStartPosition.Manual, 
      ShowInTaskbar = false, 
      Location = new Point(x, y) 
     }; 
     form.ShowDialog(); 
    }); 

現在、これは1つのフォームを開くことによって動作し、ユーザーはそのフォームをクリックして新しいフォームを開きます。一度に10の書式をすべて開くにはどうすればいいですか?

+0

フォームの位置が完全に同じではないと確信していますか? – JohanP

+0

全く同じではありません。それらは乱数の場所を介してランダムに生成されます。 –

答えて

1

あなたのコードにはいくつかの問題があります。

  1. 主な問題は、そのShowDialog()方法ブロックまで表示されているフォームは閉じられています。
  2. 最初の問題に関連するのは、プログラムにメッセージポンピングループがないことです。これは通常、Program.Main()メソッドの最後にApplication.Run()を呼び出すことによって、デフォルトのWinformsテンプレートで提供されます。あなたの例では、ShowDialog()メソッドはこのループを提供しますが、もちろんそれには他の問題があります(最初の問題を参照してください:)。
  3. 新しい乱数を取得するたびに、新しいRandomオブジェクトを作成します。これにより、Randomクラスのデフォルトのシードが変更されないように、コードが非常に高速に実行できるため、乱数の均等分配に関する保証が無効になるだけでなく、正確に同じ番号を繰り返し使用することができます(現在のティックカウントに基づいています)。ここで

は、実際に動作する例です。

static class Program 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     ShowForms(); 
     Application.Run(); 
    } 

    public static void RepeatAction(int repeatCount, Action action) 
    { 
     for (int i = 0; i < repeatCount; i++) 
      action(); 
    } 

    static void ShowForms() 
    { 
     Random random = new Random(); 
     int formCount = 0; 

     RepeatAction(10,() => 
     { 
      formCount++; 

      int x = random.Next(0, 100); 
      int y = random.Next(0, 100); 

      Form1 form = new Form1 
      { 
       StartPosition = FormStartPosition.Manual, 
       ShowInTaskbar = false, 
       Location = new Point(x, y) 
      }; 

      form.FormClosed += (sender, e) => 
      { 
       if (--formCount > 0) 
       { 
        return; 
       } 

       Application.ExitThread(); 
      }; 

      form.Show(); 
     }); 
    } 
} 

注:

  • あなたはMain()方法は、デフォルトのWinformsのテンプレートが提供するものとほとんど同じであることに気づくことがあります。 常にをこのテンプレートから始めて、それに最小限の変更を加えることをお勧めします。
  • デフォルトテンプレートはフォームインスタンスを作成し、Application.Run()に渡します。しかし、このアプローチは "メインフォーム"を形成し、フォームが閉じられると、プログラム全体が終了します。上記の例では、開かれた書式のすべてが閉じられたときにのみプログラムが終了します。これは、フォームインスタンスをApplication.Run()(アプリケーション出口の制御をあなたの手に委ねる)に渡さずに、次にいくつのフォームが開かれているかを追跡するカウンタを保持することによって行います。カウンタが0に戻ると、Application.ExitThread()が呼び出され、Application.Run()メソッドが復帰し、プログラムが終了します。
  • 私はRandomオブジェクトの初期化をフォーム作成ループから外して、ただ1回だけ実行し、同じオブジェクトを必要な乱数ごとに再利用するだけで、乱数の問題に対処しています。
  • RepeatAction()メソッドのポイントが分かりません(普通のバニラのループよりも便利なものは何も追加していないようです)が、元のコードとの一貫性のためにそこに残しました。
+0

ありがとう。リピートアクションが必要でした。 –

0

Try form.Show(); MSDNから

public static void RepeatAction(int repeatCount, Action action) 
{ 
    for (int i = 0; i < repeatCount; i++) 
     action(); 
} 
static void Main(string[] args) 
{ 
    RepeatAction(10,() => 
    { 
     Random random = new Random(); 
     int x = random.Next(0, 100); 
     Random random1 = new Random(); 
     int y = random.Next(0, 100); 

     var form = new Form1 
     { 
      StartPosition = FormStartPosition.Manual, 
      ShowInTaskbar = false, 
      Location = new Point(x, y) 
     }; 
     form.Show(); 

    }); 
+0

作品!ありがとう! –

+0

@RohanPas –

+0

@RohanPasを聞いて嬉しいです。これで問題が解決した場合は、正しい答えとしてマークする必要があります。 –

0

あなたはあなたのアプリケーションでモーダルダイアログボックスを表示するためにShowDialog()を使用することができます。このメソッドが呼び出されると、それに続くコードはダイアログボックスが閉じられるまで実行されません。あなたは各フォームごとに異なるスレッドを生成する場合を除き、あなたが使用する必要があります

Control.Show()

関連する問題