Formアプリケーションで、複数の画面で同じように使う機能(外見的な部分というよりは内部ロジック)がある場合、機能をまとめたフォームをコンポーネントとして機能を使い回すと便利です。この記事ではそのやり方をまとめます。サンプルプロジェクトはGitHubをご覧ください。github.comメリット/デメリットメリットこれをやる最大のメリットは、MVCで言うところのモデル部のコードが共通化でき、作成/保守が容易になる点です。クラスライブラリとして分割すればプロジェクト毎に使い回すことも可能です。VisibleやEnabledといったパラメータをいじることでまとめて有効/無効化できる点も、場合によっては便利です。デメリットフォームをコンポーネントとして扱う場合、それをデザイナーで表示することができないため、位置などの調整が面倒になります。Designerを弄ることでデザイナーにも表示可能でした。後で記事を書き直します。デザイン用のプロジェクトを用意してそこで作成し、実際の作成時にやるのが一番手っ取り早いでしょうか。Formを継承するクラスは抽象クラス化出来ないのも地味に面倒だったりします。やることデザイン的な部分でやることは大きく2つです。コンポーネントとして扱うフォームを準備する呼び出し側のフォームを準備する(ベースとして作ったフォームを継承し、使い回す)コンポーネントとして扱うフォームを準備するまずFormBorderStyleをNoneに設定します。これによってFormの枠が消えます。次にコンポーネントのデザインを設定します。今回は背景色を変えてボタン1つのみ置いた状態としました。最後にコンストラクタに必要な内容を記述します。重要なのはWith句内と、その後に続くparent.Controls.Add(Me)です。この呼び出しはデザイナーで必要です。呼び出しの後で初期化を追加します。Class呼び出し側のフォームを準備するテキトーにフォームのデザインを用意します。これのコードで、以下のようにコンポーネントを呼び出します。Class実行すると、以下のようになります。フォームをコンポーネントのように扱うためにやることとしては以上です。冒頭で述べたとおり、これは本来外見ではなくロジックの部分を使い回すためのハックなので、実際は「コンポーネントとして扱うフォームを準備する」部分のコードにロジックを書き、それを継承したフォームでデザインを書くというのが正しいです。(ベースとして作ったフォームを継承し、使い回す)この部分は本来フォームをコンポーネントのように扱うことの本質的な内容ですが、例を作りきれなかったので時間があればやります。一応、自分がやる上で工夫していたやり方は以下の2点です。