KEN's .NET

[初心10] コントロールとイベント

ホーム > KEN's .NET > [初心10] コントロールとイベント

ここではプログラミングがはじめての人のための解説をおこないます。 今回は、前回作ったプログラムにコードを追加していきます。Buttonクラス、TextBoxクラスを利用します。

0.はじめに

まずは、下記の図とコードをご覧下さい。

ボタン付きのフォーム
   図1 ボタン付きのフォーム

   1:'vbc /t:winexe /out:Module10_1.exe /r:System.dll,System.Drawing.dll,System.Windows.Forms.dll
   2:'    /optimize+ /optionstrict+ Module10_1.vb
   3:Imports System.Windows.Forms
   4:
   5:Module Module10_1
   6:    Sub Main()
   7:        Dim b As Button
   8:        Dim f As Form
   9:
  10:        f = New Form()
  11:        f.Text = "はじめてのプログラミング"
  12:
  13:        b = New Button()
  14:        b.Text = "ボタン"
  15:
  16:        f.Controls.Add(b)
  17:        f.ShowDialog()
  18:    End Sub
  19:End Module
   図2 Button付きForm(図1)を表示するプログラム

前回は単にフォームを表示しただけでしたが、今回は図1のようにボタンを配置してみます。 さて、この図1の画面を表示しているプログラム(図2)を見ていきましょう。 「[初心9] Formクラスに触れてみる 」の図2のプログラムとの違いだけ説明します。
  • 7行目変数bをButton型で宣言しています。Buttonクラスはボタンを表すクラスです。
  • 13行目は、Buttonクラスのインスタンスを作成しています。前回も説明しましたが、クラスを利用するにはNewを使ってインスタンスを作成する必要があります。
  • 14行目は、ButtonクラスのインスタンスbのTextプロパティに文字列"ボタン"を設定しています。ButtonクラスのTextプロパティは、 ボタンの表面に表示する文字列として定義されているので、図1にあるようにボタン上に表示されます。
  • ここまでの段階では、フォームf、ボタンbは互いに関係がありません。 そこで16行目では、フォームfのControlsプロパティのAddメソッドでボタンbをフォームfに追加しています。 これにより、フォームf上にボタンbが配置されます。

0.1. Controlsプロパティに関する補足

TextプロパティはString型ですが、ControlsプロパティはControl.ControlCollection型です。そのため、少し使い方が異なります。 Control.ControlCollection型という名前は当面どうでもいいのですが、この型がコレクションと呼ばれるものに属する型だという点が重要です。 コレクションというのは、「 [初心7] 変数と型、再び - 配列 」で説明した配列に似ています。 配列同様に複数のデータを保持しておくためのデータ型ですが、 Addメソッドでデータをコレクションに追加、Removeメソッドでデータをコレクションから削除するという典型パターンで、 保持しておくデータ数を動的に変更できる点が異なります。 Buttonや次に出てくるTextBoxのようにGUI(グラフィカルユーザインタフェース)を持つフォームに配置できる部品をコントロール(Control)といいます。 これらを入れておくためのプロパティなのでControlsプロパティです。

1. Clickイベント

フォームにボタンを配置しましたが、ボタンをマウスでクリックしてみても何も起きません。 ボタンをクリックしたら何かが起きるというごくありふれた機能を実現してみましょう。 フォームにさらにテキストボックス(文字列を入力できる入力用の場所のこと。図3の白い四角形の部分)を一つ配置します。 作成するプログラムの動作としては、テキストボックスに何か文字列を入力し、その後、ボタンをクリックすると、 そのテキストボックスに入力した内容をタイトルに持つ新しいフォームを表示するというものにします。
ボタンとテキストボックスを配置したフォーム
   図3 ボタンとテキストボックスを配置したフォーム
ボタンをクリックして新たなフォームをで表示
   図4 ボタンをクリックして新たなフォームをで表示
   1:'vbc /t:winexe /out:Module10_2.exe /r:System.dll,System.Drawing.dll,System.Windows.Forms.dll
   2:'    /optimize+ /optionstrict+ Module10_2.vb
   3:Imports System
   4:Imports System.Drawing
   5:Imports System.Windows.Forms
   6:
   7:Module Module10_2
   8:    Private WithEvents b As Button
   9:    Private t As TextBox
  10:
  11:    Sub Main()
  12:        Dim f As Form
  13:        
  14:        f = New Form()
  15:        f.Text = "はじめてのプログラミング"
  16:
  17:        b = New Button()
  18:        b.Location = New Point(0,30)
  19:        b.Text = "ボタン"
  20:
  21:        t = New TextBox()
  22:        t.Text = ""
  23:
  24:        f.Controls.Add(b)
  25:        f.Controls.Add(t)
  26:        f.ShowDialog()
  27:    End Sub
  28:
  29:    Private Sub b_Click(ByVal sender As Object, ByVal e As EventArgs) Handles b.Click
  30:        Dim f2 As Form = New Form()
  31:        f2.Text = t.Text
  32:        f2.Show()
  33:    End Sub
  34:End Module
   図5 ボタンクリックで別のFormを表示するプログラム

図1から図3のような画面に変更します。図3の画面でボタンをクリックすると図4のようにもう一つ画面が表示されます。 その際、あらかじめテキストボックスに例えば、"テスト"と入れておくと、表示した画面のタイトルが"テスト"となったフォームが表示されます。

ソースコードは図2から図5のように変更します。下線の引いてあるところが新しい点です。

  • 29行目でEventArgsクラスを利用するために、3行目のおまじないを追加します。
  • 8行目は、Buttonクラスの変数bを宣言している部分ですが、図2のコードの7行目とは下記の点で大きく違っています。
    1. 変数の宣言している場所が違う
    2. Dimの代わりにPrivateになっている
    3. WithEventsという新しいキーワードが付いている

    1、2はこの変数bがModule〜End Module内のどこからでも参照/設定できるようにするために必要です。 Privateキーワードはこのモジュール内でプライベート(私的)な利用が可能であることを示します。 ちなみにSub Mainの中で宣言したDim f As FormのfはこのSub Main〜End Subの中でしか参照したり設定したりアクセスできません。 つまり、f.Text = "はじめてのプログラミング"などのようにしてfを操作できるのは、Sub Mainの中でだけということです。

    ユーザがボタンがクリックしたということは、アプリケーション側からするとユーザによってボタンがクリックされたということになります。 ユーザがボタンをいつクリックするかなんてわかりませんので、「クリックされたよ!」というお知らせを受けて、 そのお知らせをきっかけにボタンがクリックされたときの処理を行う必要があります。このお知らせをイベントといいます。 あるオブジェクトのイベントを受け取りたい場合、WithEventsキーワード付きで変数を宣言します。 今回の場合、Buttonのクリックされたというイベントを受け取るために、変数bをWithEvents付きで宣言しています。

  • 9行目でTextBoxクラスの変数tを宣言します。このテキストボックスもModule〜End Module全体で利用するので、 Privateで宣言しています。
  • 18行目でボタンbのLocationプロパティを設定しています。Locationプロパティはボタンbの配置する位置を表すプロパティです。 Locationプロパティには点を表すPoint構造体のインスタンスを設定しています。 点はX座標、Y座標で表されるのでX=0、Y=30を指定してインスタンスを生成しています。(単位はピクセル)
  • 21行目でテキストボックスtにTextBoxクラスのインスタンスを生成して設定しています。22行目でTextプロパティを空にしています。
  • 25行目でテキストボックスtをフォームf上に配置しています。
  • 29行目から33行目のb_Clickプロシージャはクリックされたときのイベントに対する処理を書いています。 ここに書いた処理は、ユーザがボタンbをクリックしたときに実行されます。8行目でWithEvents付きで変数bを宣言していますが、 これはイベントを受け付けますという宣言に過ぎません。実際に受け付けるには、29行目のような宣言でプロシージャを作る必要があります。 このときの決まりは以下の通りです。
    1. プロシージャ名(b_Click)には特に規定はないので、好きな名前でよい
    2. プロシージャの引数は名前は特に規定はないが、一つ目をObject型で宣言、二つ目をEventArgs型で宣言する必要がある(クリックイベントの場合)
    3. 末尾にHandlesキーワードを使って何のイベントを取り扱うかを記述する。この場合、ボタンbのClickイベントを扱うので、 Handles b.Clickとなる(Handle(取り扱う)+s(三単現のs) b(インスタンスb).(の)Click(クリックイベント))
  • 30行目はForm型の変数f2を宣言すると同時に新しいインスタンスを生成して設定しています。
  • 31行目はフォームf2のタイトルをテキストボックスtに入力された文字列から設定します。
  • 32行目はShowメソッドによって新しいフォームf2の表示を行っています。ShowDialogとShowの違いはここでは触れません。 違いについては、実際にShowDialog、Showのそれぞれでコードを書いてみて違いを自分で確認してみて下さい。

2. 学んだこと

キーワード:Buttonクラス、TextBoxクラス、Point構造体、Private、イベント(WithEvents、Handles)、Locationプロパティ
  • ボタンを表すButtonクラス、テキストを入力する場所を表すTextBoxクラス
  • ButtonやTextBoxはコントロール(Control)
  • Point構造体は点を表すクラス。X座標、Y座標がある
  • イベントとはお知らせのようなもの
  • イベントを処理するプロシージャの記述法

3.ソースコード

今回、紹介したソースコード、実行ファイル(EXE)をbeginner10.lzhファイルにまとめました。 lzhはVectorなどのオンラインソフトのサイトにあるたいていの解凍ツールで解凍できますので、ツールをお持ちでない場合は入手して解凍して下さい。 beginner10.lzhには、下記のファイルを収録してあります。
  • Module10_1.vb
  • Module10_1.exe
  • Module10_2.vb
  • Module10_2.exe
beginner10.lzh


ホーム > KEN's .NET > [初心10] コントロールとイベント

[e-mail]yone_ken00@hotmail.com