WinFormsのコントロールとは? プロパティ・クラス・イベントを理解しよう

広告

Windows Forms(WinForms)でアプリを作るとき、フォーム上にはボタンやラベル、テキストボックスなど、さまざまな部品を配置します。

これらの部品は、まとめてコントロールと呼ばれます。

Visual Studioでは、ツールボックスからドラッグ&ドロップするだけで簡単に配置できますが、内部ではC#のクラスやオブジェクト、プロパティ、イベントといった仕組みが使われています。

今回は、次の問題をもとにWinFormsのコントロールの仕組みを確認していきます。

問題

WinForms のコントロールに関する説明として正しいものをすべて選びなさい。

A. プロパティウィンドウで値を変更できる

B. ボタンやラベルはクラスとして定義されている

C. イベントハンドラは特定の操作時に実行するメソッドを指定する

D. フォームへドラッグすると「静的クラス」が作成される

正解は、

A・B・C

です。

Dは誤りです。

それぞれ詳しく見ていきましょう。

A. プロパティウィンドウで値を変更できる

これは正しい説明です。

Visual Studioでフォーム上のボタンなどを選択すると、プロパティウィンドウにさまざまな設定項目が表示されます。

例えば、Buttonコントロールでは次のような項目があります。

  • Name
  • Text
  • BackColor
  • Font
  • Size
  • Location
  • Enabled
  • Visible

例えば、ボタンに表示する文字を変更する場合は、Textプロパティを変更します。

button1.Text = "実行";

プロパティウィンドウでTextを変更する操作も、考え方としてはこのコードと同じです。

つまり、Visual Studioのプロパティウィンドウは、

オブジェクトのプロパティを画面上から設定するための機能

と考えることができます。

プロパティとは何か

プロパティは、そのオブジェクトが持っている状態や設定値を表します。

例えばButtonなら、

button1.Text
button1.Width
button1.Height
button1.Enabled

といったプロパティを持っています。

次のコードでは、ボタンの表示文字やサイズを変更しています。

button1.Text = "登録";
button1.Width = 120;
button1.Height = 40;

このように、WinFormsでは多くの見た目や動作をプロパティによって設定できます。

B. ボタンやラベルはクラスとして定義されている

これも正しい説明です。

WinFormsのButtonやLabelは、単なる画像や画面上の部品ではありません。

C#では、それぞれクラスとして定義されています

例えば、

Button
Label
TextBox
CheckBox
RadioButton
ListBox

などは、すべてクラスです。

そのため、コードから自分でButtonオブジェクトを作ることもできます。

Button button = new Button();

button.Text = "クリック";
button.Width = 100;
button.Height = 40;

さらにフォームへ追加すると、画面上に表示できます。

Controls.Add(button);

まとめると次のようになります。

Button button = new Button();

button.Text = "クリック";
button.Width = 100;
button.Height = 40;

Controls.Add(button);

Visual Studioのデザイナーでボタンをドラッグ&ドロップした場合も、内部ではこれに近い処理が自動的に生成されています。

クラスとオブジェクトの違い

ここは特に重要です。

Buttonクラスです。

Button

一方で、

button1

は、そのButtonクラスから作られたオブジェクトです。

イメージとしては、

Buttonクラス
     ↓
   new
     ↓
Buttonオブジェクト

となります。

コードで書くと、

Button button1 = new Button();

です。

Buttonが設計図、button1がその設計図から作られた実体、と考えると分かりやすいでしょう。

実際にはButtonも継承によって作られている

Buttonクラスは、完全に独立したクラスではありません。

WinFormsでは、多くのコントロールが共通のクラスを継承しています。

大まかには次のような関係があります。

Object
  ↓
MarshalByRefObject
  ↓
Component
  ↓
Control
  ↓
ButtonBase
  ↓
Button

Labelの場合は、

Object
  ↓
MarshalByRefObject
  ↓
Component
  ↓
Control
  ↓
Label

となります。

ButtonやLabelに、

Width
Height
Location
Visible
Enabled

など共通したプロパティがあるのは、共通の基底クラスであるControlから機能を受け継いでいるためです。

これが継承です。

C. イベントハンドラは特定の操作時に実行するメソッドを指定する

これも正しい説明です。

WinFormsでは、ユーザーの操作などをきっかけとして処理を実行できます。

例えば、

  • ボタンをクリックした
  • テキストボックスの内容が変わった
  • フォームが読み込まれた
  • マウスが動いた
  • キーが押された

といった出来事をイベントと呼びます。

例えばButtonにはClickイベントがあります。

button1.Click += button1_Click;

そして、クリックされたときに実行するメソッドを用意します。

private void button1_Click(object sender, EventArgs e)
{
    MessageBox.Show("クリックされました");
}

このbutton1_Clickのようなメソッドを、イベントハンドラと呼びます。

イベントとイベントハンドラの関係

イメージすると次のようになります。

ユーザー
   ↓
ボタンをクリック
   ↓
Clickイベント発生
   ↓
イベントハンドラ実行
   ↓
button1_Click()

つまり、イベントハンドラは、

イベントが発生したときに実行する処理を記述するメソッド

です。

「イベントハンドラを指定する」とはどういうことか

例えば次のコードがあります。

button1.Click += button1_Click;

これは、

button1のClickイベントが発生したら、button1_Clickメソッドを呼び出してください

という意味です。

+=が使われていることにも注目してください。

イベントには、実行するメソッドを登録するという仕組みがあります。

WinFormsを学ぶと、イベントは単なる「クリックされたら動く仕組み」に見えますが、C#の文法としては、

  • event
  • delegate
  • メソッド
  • +=

などが組み合わされて動いています。

Visual Studioではイベントも自動設定できる

フォームデザイナーでButtonをダブルクリックすると、Visual Studioが自動的にイベントハンドラを作ってくれます。

例えば、

private void button1_Click(object sender, EventArgs e)
{
}

が作成されます。

同時に、内部ではClickイベントとこのメソッドが関連付けられます。

そのため、普段はイベントの仕組みを強く意識しなくてもWinFormsアプリを作ることができます。

ただし、内部の仕組みを理解しておくと、後でラムダ式や独自イベントを学ぶときにも役立ちます。

D. フォームへドラッグすると「静的クラス」が作成される

これは誤りです。

フォームへButtonなどをドラッグしても、静的クラスが作られるわけではありません

作成されるのは、Buttonクラスなどのオブジェクトです。

例えば、フォームにButtonを1つ配置すると、フォームクラスには次のようなフィールドが作成されます。

private Button button1;

そして、初期化処理の中でButtonオブジェクトが作られます。

button1 = new Button();

つまり、

Buttonクラス
    ↓
new
    ↓
button1というオブジェクト

という関係です。

静的クラスとは

静的クラスは、staticを付けて定義する特殊なクラスです。

例えば、

static class MyUtility
{
    public static int Add(int a, int b)
    {
        return a + b;
    }
}

このようなクラスは、

new MyUtility();

のようにオブジェクトを作ることができません。

一方、WinFormsのButtonは、

new Button();

とオブジェクトを作る必要があります。

したがって、Buttonは静的クラスではありません。

デザイナーで配置したボタンはどこで作られているのか

フォームにButtonを配置した場合、Visual Studioはコードを自動生成します。

例えば、概念的には次のようなコードです。

private Button button1;

そして、

private void InitializeComponent()
{
    button1 = new Button();

    button1.Text = "button1";
    button1.Location = new Point(100, 100);
    button1.Size = new Size(100, 40);

    Controls.Add(button1);
}

実際のコードは.Designer.csファイルに生成されます。

例えば、

Form1.cs
Form1.Designer.cs

という2つのファイルを見ることがあります。

フォームデザイナーが生成するコードは、主にForm1.Designer.cs側へ保存されています。

そのため、フォーム上へドラッグ&ドロップする操作は、

C#コードを書かずに、Visual Studioにオブジェクト生成コードを書いてもらっている

と考えると分かりやすいでしょう。

デザイナーとコードは別物ではない

Visual Studioのフォームデザイナーを見ると、

「画面を作る作業」

と、

「C#を書く作業」

が別々に見えるかもしれません。

しかし、実際にはつながっています。

例えばデザイナーで、

Text → 登録
Width → 120
Height → 40

と設定すると、内部ではそれに対応するコードが生成されます。

イメージとしては、

フォームデザイナー
       ↓
プロパティ設定
       ↓
Designer.csへコード生成
       ↓
実行時にオブジェクト生成

となります。

WinFormsを理解するための重要な関係

WinFormsでは、次の4つの関係を整理しておくと理解しやすくなります。

クラス

コントロールの設計図です。

Button
Label
TextBox

オブジェクト

クラスから実際に作られたものです。

button1
label1
textBox1

プロパティ

オブジェクトの状態や設定値です。

button1.Text
button1.Width
button1.Enabled

イベント

ユーザー操作などによって発生する出来事です。

button1.Click
textBox1.TextChanged

これらをまとめると、

Buttonクラス
     ↓
Buttonオブジェクト
     ↓
 ┌─────────────┐
 │ プロパティ   │ Text / Width / Enabled
 │ イベント     │ Click
 └─────────────┘

という関係になります。

コードで一度に確認してみよう

次のコードを見ると、クラス・オブジェクト・プロパティ・イベントの関係が分かります。

Button button = new Button();

button.Text = "実行";
button.Width = 100;
button.Height = 40;

button.Click += Button_Click;

Controls.Add(button);

イベントハンドラはこちらです。

private void Button_Click(object? sender, EventArgs e)
{
    MessageBox.Show("ボタンが押されました");
}

それぞれを分解すると、

Button

はクラスです。

button

はオブジェクトです。

button.Text
button.Width
button.Height

はプロパティです。

button.Click

はイベントです。

Button_Click

はイベントハンドラです。

WinFormsの基本的な仕組みが、この短いコードの中にまとまっています。

まとめ

今回の問題の正解は、

A・B・C

です。

それぞれの理由を整理すると、次のようになります。

選択肢判定理由
Aコントロールのプロパティはプロパティウィンドウから変更できる
BButtonやLabelはC#のクラスとして定義されている
Cイベントハンドラはイベント発生時に実行するメソッドである
D×配置されるのは静的クラスではなく、コントロールのオブジェクト

WinFormsを学ぶときは、単に「ボタンを配置する」「イベントを書く」と操作だけを覚えるのではなく、

クラス
↓
オブジェクト
↓
プロパティ
↓
イベント
↓
イベントハンドラ

というC#の仕組みと結び付けて考えることが重要です。

フォームデザイナーで行っている操作も、最終的にはC#のコードへ変換されています。

この関係が分かるようになると、WinFormsだけでなく、オブジェクト指向やイベント、デリゲート、ラムダ式といったC#の学習にもつながっていきます。

訪問数 4 回, 今日の訪問数 4回

広告

C#

Posted by hidepon