ユーザーインターフェイス(1)

コントロールのプロパティとメソッド

これまでにも、コントロールのプロパティについては、さんざん取り上げてきた。
コントロールはVB.Netにあらかじめ用意されているオブジェクトで、 フォームデザイナでコントロールを配置し、コントロールのプロパティを変更すると、プログラムが実行されたときに、コントロール=オブジェクトが生成され、それぞれのプロパティが設定されるコードが自動的に生成される。

例えば、フォームデザイナで、ボタンを一個フォームに張り付ける場合を考える。

配置した段階で、button1のlocationプロパティとsizeプロパティが自動的に設定されているのがわかる。
さらにbutton1のTextプロパティを"押してください"に変更してみる。

この状態は、いわばアプリケーションの初期状態であり、ユーザーがフォームデザイナで作った画面、コントロールの配置、それぞれの位置や大きさは、プログラム実行時に再現されるよう、プログラムコードが自動的に生成されている。
生成されたコードはForm1.Designer.vb(通常は見えない)に格納される。

Form1.Designer.vbの内容を見てみる。
メニューの「表示」から「ソリューションエクスプローラ」を選択する。

通常では、「My Project」と「Form1.vb」しか見えないが、

小さなアイコン「すべて表示」をクリックし、「Form1.vb」を展開すれば、

「Form1.Designer.vb」を選択できるようになる。
これをクリックすると、Form1.Designer.vbの内容を見ることができる。



form1.Designer.vbの内容には、

エディターで編集するべきではない

この辺をいじると、初心者にはわけがわからない状態となる。

このように、単純なVBプログラムには、「隠された」ファイルが数多く存在する。
それらは互いに依存関係にあり、全体像がわかるまで、このようなファイルをいじったりすると訳がわからなくなる。


オブジェクトとしてのコントロール

しかし、プログラム実行中にオブジェクト=コントロールを動的に生成するために大いに参考になる。
VB.Netには、あらかじめ定義されているオブジェクトがある。これはクラスと呼ばれ、例えば
System.Windows.Forms.Button
は「ボタン」コントロールのクラスとなっている。
クラスはあるオブジェクトを生成するための設計図であるといってよい。 Dim a as System.Windows.Forms.Button
とかやり、
a= new System.Windows.Forms.Button
とかやることで、クラスはインスタンス化(設計図から実体化)され、自由に使えることになる。
クラスにはプロパティメソッドイベントを定義することができる。

プロパティはオブジェクトが持つ属性であり、メソッドはオブジェクトに対して作用する命令、イベントはオブジェクトに対し、発生した
イベントであると理解してよい。

大雑把に言えば、クラスとは「人間」の概念である。
この場合、クラスのプロパティは、例えば「点呼番号」「体重」「身長」「名前」などであり、 クラスのメソッドとは、例えば「走れ」「目立て」などとなる。イベントは「殴られた」「名指しされた」とかとか。

クラスをインスタンス化するとは、「人間」の型から、個別の人間「山田一郎」とか「和田アキ子」を生成することとなる。
それぞれ、プロパティ「点呼番号」「体重」「身長」「名前」が個別に設定可能であり、メソッド「走れ」「目立て」が個別に実行可能である。 「和田アキ子」を殴ったら、イベント「殴られた」が発生する。


TabIndexプロパティトとfocus()メソッド

コントロール=インスタンスのプロパティとメソッドの例を挙げる。

TabIndexプロパティ

ほとんどのコントロールには、TabIndexプロパティがついている。
フォームデザイナで、コントロールを配置すると、配置されたコントロールのTabIndexプロパティは配置順に0,1,2・・と設定される。
このTabIndexの値により、実行時、Tabキーでフォーカスを移動していくことができる。
よってTabIndexプロパティに整数を設定することで、TABキーでコントロールのフォーカスをコントロールできる。
なお、enabled=Falseなコントロールに対してはフォーカスは自動的にスル―される。

Focus()メソッド

モジュール内で、あるコントロールに強制的にフォーカスを与えることができる。

TextBox1.Focus()

コントロールTextBox1にフォーカスを与える。


ラジオボタン、チェックボックス、コンボボックス

ユーザー入力の補助的な役割をするコントロールに、ラジオボタンチェックボックスコンボボックスがある。今回は、これらのコントロールを用いて example1に、ユーザーインターフェイスを構築する。

左の例では、生年月日の入力にコンボボックスを、趣味の入力に チェックボックスを、性別の入力にラジオボタンを使用している。
また、グループボックスを用いてコントロールをグループ化している。

・コンボボックスはあらかじめ決められたアイテムの中から ひとつの値を選択するためのコントロールである。 プログラムは、ユーザーが選択したアイテム名か、アイテム番号を知ることができる。

・チェックボックスは複数の項目を選択できる。
ユーザーは任意の項目を好きなだけ選択できる。

・ラジオボタンは同じグループ内の一つ項目しか選択できない。
左の例では、の2つの項目が同一のグループである。 ユーザーは、このどちらしか選択できない。

いずれも、グループ化のためにグループボックスを利用している。


コントロールのグループ化

ラジオボタンは同一グループの中で一つの項目を選択できる。 ラジオボタン等のコントロールをグループ化するのがグループボックスである。 通常、コントロールはフォーム上に貼り付けていくが、 フォーム上にグループボックスを貼り付け、その上にコントロールを貼り付けることができる。 これにより、コントロールをグループ化することができる。 フレームも同じ用途に使用することができる。

グループボックス上に貼り付けられたコントロールは、そのグループボックス上でしか移動できない。 このように、他のコントロールを貼り付けられるコントロールをコンテナという。
一方、この例では、グループボックス上にコントロールが貼り付けられているように見えるが、実は フォーム上に貼り付けられている。



チェックボックス・ラジオボタンの状態の取得および設定

チェックボックスやラジオボタンがチェックされているかは、コントロールの Checked プロパティで調べることができる。
下の例では、chkMaleをチェックボックス名としている。


If chkMale.Checked = True Then
.....
Else
.....
End If

逆に、次のようなコードで、チェックボックスのチェック状態を変更することができる。


チェックボックスのチェック状態をオンにする
chkMale.Checked = True

チェックボックスのチェック状態をオフにする
chkMale.Checked = False


コンボボックス

これまで、生年月日の入力にはテキストボックスを使用してきた。 今回はこれを「コンボボックス」に変更する。

「チェックボックス」「ラジオボタン」と大きく異なるのは、プロパティの設定である。「コンボボックス」の場合は、表示される選択肢をあらかじめ設定しておかなくてはならない。
例として、「月」用のコンボボックスの設定を示す。 コンボボックスへの項目の設定はプロパティでおこなう。

対象となるコンボボックスのプロパティウィンドウを開く。
Itemsプロパティをダブルクリックするとアイテム入力ウィンドウが現れるので、必要なアイテムを入力する。

ユーザーがコンボボックスで何を選択したかを調べるには、プログラム上でSelectedItemプロパティを調べればよい。



Private btnNenrei_Click(...)

	Dim Month As Integer
	Month = Cint(cmbMonth.SelectedItem)
	.....
End Sub

通常、コンボボックスのSelectedItemプロパティは文字列型であるので、 上ではCint()関数を用いて、強制的に整数型に変換している。


実行時にコントロールのプロパティ設定をする

これまでは、フォームにはりつけるコントロールはフォームデザイナでおこなってきた。
しかし、プログラム実行時に、コントロールの設定をおこなうことも可能である。
このためにはプロシージャForm1_Load ()でコントロールの設定をおこなう。

重要
プロシージャForm1_Load () は、通常、アプリケーション起動時に最初に実行されるプロシージャである。コントロールの初期設定はこのプロシージャの中でおこなう

フォームデザイナ上で、コンボボックスComboBox1にアイテムを追加するのと等価なコマンドは、
ComboBox1.Items.Add("アイテム名")
である。

厳密に言えば、ComboBox1はクラスComboBoxのインスタンスである。クラスComboBoxはitemsプロパティを持つ。
itemsプロパティは実際にはクラスComboBox.ObjectCollectionのインスタンスであり、メソッドAdd()を持つ。
したがって、例えば「月」用のコンボボックスの設定は以下のようにおこなう。



    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        ComboBox1.Items.Add(1)
        ComboBox1.Items.Add(2)
        ComboBox1.Items.Add(3)
        ComboBox1.Items.Add(4)
        ComboBox1.Items.Add(5)
        ComboBox1.Items.Add(6)
        ComboBox1.Items.Add(7)
        ComboBox1.Items.Add(8)
        ComboBox1.Items.Add(9)
        ComboBox1.Items.Add(10)
        ComboBox1.Items.Add(11)
        ComboBox1.Items.Add(12)

    End Sub

For〜Next文を使って以下のようにするとプログラムがすっきりしてよいかもしれない。



    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim IndexNumber As Integer

	For IndexNumber = 1 To 12
	        ComboBox1.Items.Add(IndexNumber)
	Next IndexNumber

    End Sub


上の例では、IndexNumberを1から12まで変化させながら、ComboBox1.Items.Add(IndexNumber)を実行させている。


    課題N06

コンボボックス、チェックボックス、ラジオボタンを使って、SNSサイトのプロフィール設定画面的なものを作り、 その内容をまとめてテキストボックスに表示するようなプログラムを作れ。 質問事項例: 名前? 男、女? 生年月日? 日曜日に何をやるか具体的に書いてください。 趣味を以下の中から選んでください。

テキストボックスの出力例:私は1999年7月2日生まれです。趣味はラジコンです。性別は女です。名前は山田一郎です。 日曜日には犬を散歩して市ヶ谷のアジャンタというカレー屋に行きます。 ・comboboxは動的に作成すること ・radiobutton,checkboxを使用すること ・入力用のTextboxもしようすること 締切:20171209:2359