まずは、最も基本的な部品の一つである「チェックボックス」からです。チェックボックスというのは、マウスでクリックしてチェックをON/OFFするタイプのボタンのことですね。これはWindowsのダイアログなどでは必ず登場するものですからおわかりでしょう。
このチェックボックスは、Visual Basicでも「CheckBox」という名前のコントロールとして用意されています。このコントロールの使い方は実に簡単。フォームにただ作成するだけです。コードの類いは一切書く必要はありません。そのまま実行すれば、クリックするとちゃんと自動的にON/OFFされます。
このCheckBoxのON/OFFの状態は、「Value」というプロパティで設定されるようになっています。フォームにCheckBoxを作成し、プロパティウィンドウからValueという項目を探してみましょう。このプロパティの値はコンボボックスになっており、右端の三角マークをクリックするとメニューがポップアップします。ここで0にすればチェックをOFFに、1にすればONになります。
このプロパティは、もちろんコード内からCheckBoxの状態を調べるのにも使えます。Valueプロパティが0ならばOFFに、1ならばONになっているというわけです。
また、CheckBoxをクリックしたときに何かの処理をすることもできます。CheckBoxにも、CommandButtonと同じくClickイベントが用意されています。ですから、これを利用したサブルーチンを用意しておけば、マウスでチェックをON/OFFすると自動的に実行するようなプログラムを作ることができます。
例えば、フォームに用意したCheck1というCheckBoxをクリックすると、そのときの状態をText1というTextBoxに書き出して表示するようなサブルーチンを考えてみましょう。
Private Sub Check1_Click() If Check1.Value = 1 Then Text1.Text = "チェックされてます。" Else Text1.Text = "OFFになっています。" End If End Sub
このオプションボタンも、使い方はとても簡単です。フォームの上に必要なだけオプションボタンを作成すると、実行時にちゃんとそれらの中からクリックした1つだけがONとなるように動作してくれます。全くコードなど書く必要はありません。
OptionButtonは、CheckBoxと非常に似ています。プロパティなどもほとんどそっくりです。例えば、ボタンのON/OFF状態は、やはり「Value」プロパティで設定したりコード内から利用したりすることができます。
ただし、こちらのValueは0か1ではなく「True」か「False」か、という二者択一の値で設定されるところが違っています。
このTrueとFalseというのは、「ONかOFFか」「正しいか正しくないか」「動いているか動いていないか」「見えるか見えないか」というように、二者択一の状況を示すのに使われる特別な値です。通常、Trueであれば「ONである」「正しい」「動いている」「見える」というように肯定的な状態を示し、Falseであればその反対に否定的な状態であることを示します。このTrue/Falseで設定する値を「真偽値(Boolean)」と呼びます。
ですから、コード内からOptionButtonがONかどうかを調べる場合は、ちょっとだけ書き方が変わります。例えば、Option1というOptionButtonがONの時に何かを実行させたければ、
If Option1.Value = True Then …
このように書けばいいわけです。True/FalseというのはVisual Basicに用意されている予約語ですから、このようにそのまま書きます。"True"のようにテキストとして書いてはいけません。
また、上の条件文は、実はこんな感じで書くこともできます。
If Option1.Value Then …
わかりますか?「= True」がないですね。これでもちゃんと動くのです。True/Falseは、「正しいか正しくないか」を示すものですから、その値がそのまま条件として設定できるのです。というより、これこそが本当は正しい在り方なのです。
今までの条件文では、「If x = 0 Then …」などという具合に等号や不等号を使って条件を設定していました。これは、実をいえば「x = 0という式がTrueかFalseか」ということを示していたのです。つまり、Visual Basicの内部では、正しいかどうかというのは全てTrue/Falseという形で認識されていたのですね。
さて、OptionButtonは基本的にCheckBoxと同じなので、そう難しくはないのですが、ただ1つだけ欠点があります。それは「フォームの中に1つのグループしか作れない」ということです。つまり、ON/OFFするオプションボタンのグループが複数用意できないのです。
これはちょっと問題です。1つのウィンドウの中でいくつかのグループが必要となることはあります。こうしたときはどうすればいいのでしょうか。
この問題を解決するために用意されたのが「Frame」というコントロールです。これは、コントロールのグループを作成する働きを持つものです。
複数のグループをもったOptionButtonを作るときは、以下のようにして作ります。
1.まず、Frameを1つ作成します。
2.次に、OptionButtonを選び、そのFrameの中に直接OptionButtonを作成します。これを、そのグループに必要なだけ繰り返してOptionButtonを作ります。
3.出来上がったら、2番目のグループ用にまたFrameを作成します。
4.そして、またOptionButtonを選び、2番目のFrameの中に直接作成していきます。
5.この手順を必要なグループだけ繰り返します。
このようにして、Frameの中にOptionButtonが組み込まれた形で作成すると、それぞれのFrame内のOptionButtonは1つ1つ独立したグループとして扱われます。つまり、そのグループ内のボタンをクリックしても、他のグループのボタンのON/OFFには全く影響がでなくなるのです。
このリストボックスに非常によく似た部品がもう1つあります。それはコンボボックスです。リストボックスが項目をずらーっと画面に表示してあるのに比べ、コンボボックスはマウスでクリックすると一覧が表示される点が違います。コンボボックスは「ComboBox」というコントロールとして用意されています。
両者は非常に使い方が似ています。まず表示する項目ですが、これはどちらも「List」というプロパティとして用意されています。プロパティウィンドウのList項目の値部分はポップアップになっており、ここにテキストを書き込めるようになっています。この中に、表示したい項目を1つずつ改行して書き込めば、それがListBoxやComboBoxの選択項目として表示されるというわけです。
では、これらのコントロールで選択された項目はどうやって取り出せばいいか。これは、意外に簡単です。なんと「Text」プロパティで、現在選択されている項目のテキストが取りだせるのです。
例えば、Combo1,List1というComboBox,ListBoxで選択されたテキストを、それぞれText1,Text2というTextBoxに書き出すというコードを作ってみましょう。
Private Sub Combo1_Change() Text1.Text = Combo1.Text End Sub Private Sub Combo1_Click() Text1.Text = Combo1.Text End Sub Private Sub List1_Click() Text2.Text = List1.Text End Sub
こんな感じになります。3つもサブルーチンがありますね。Combo1とList1のClickサブルーチンがあるのはわかるとして、Combo1_Change()というのは一体なんでしょう?
これは、ComboBoxで直接表示を書き換えたときのイベントなのです。ComboBoxは、選択項目から選ぶだけでなく、直接テキストを書き込むこともできます。このときに、テキストが書き換えられるとChangeイベントが発生し、このサブルーチンが呼び出されるようになっているのです。
さて、これで一通りは使えるようになった――と思いたいのですが、実はもう1つだけ問題があります。それはListBoxです。ListBoxでは、一度に複数の項目を選択することができるのです。
これは、「MultiSelect」というプロパティを変更することで可能になります。通常、初期状態ではこの値は0になっており、この状態では常に1つの項目しか選べません。が、これを1か2に変更すると、複数の項目を選択できるようになります(1と2の違いは選択の操作方法の違いです。それぞれどう違うか試してみて下さい)。
複数の項目が選択されてしまうと、Textプロパティは使えません。なぜなら、これでは最後に選択した項目だけしか得られないからです。
では、こういう場合はどうすればいいか。――いろいろと方法はあるのですが、もっとももわかりやすいのは「全ての項目について、選択されているかどうかを調べていく」というやり方でしょう。
ListBoxの各項目には、0から順に「インデックス番号」という番号が割り振られています。そしてSelectedというプロパティを使って、各項目の選択状態を調べます。このプロパティはちょっと変わった形をしていて、
《ListBox》.Selected(番号)
このように書きます。そのインデックス番号の項目が選択されていればTrue、されていなければFalseとなります。例えば、1つ目の項目(つまりインデックス番号が0番)が選択されているかどうかを調べたければ、
If List1.Selected(0) Then …
このようにすれば、選択されているときに何かの処理をすることができるというわけです。
では例として、List1を選択したときに、1番目〜4番目までの項目のON/OFF状態を調べてText1に書き出すサブルーチンを考えてみましょう。
Private Sub List1_Click() Text1.Text = List1.Selected(0) & "," & _ List1.Selected(1) & "," & _ List1.Selected(2) & "," & _ List1.Selected(3) End Sub
こんな感じでしょう。これで各項目のON/OFF状態が得られるようになりました。ちょっとだけコードの補足説明をしておきましょう。行の終りに「_」という記号がありますね? これは「見かけの改行」というものです。これは、長い命令などを書くとき、途中でこの記号をつけて改行すると、次の行まで1行の命令としてみてくれるというものです。つまり、上のサブルーチンは4つの命令が実行されているように見えますが、実は1行だったというわけです。
さて、それではON/OFF状態がわかったところで、「特定の項目のテキストを取り出す」方法も説明しておきましょう。これは、項目を設定するときに使った「List」というプロパティを使います。これもSelectedと同様にインデックス番号を使って特定の項目だけを取り出すことができます。例えば、
str1 = List1.List(0)
このようにすれば、List1の1番目の項目のテキストを変数str1に取り出すことができるというわけです。まあ、これはSelectedがわかればすぐにわかることでしょう。
このコントロールは、いくつかの基本的なプロパティの値を元に動作が決められるようになっています。まずそれらについて説明しておきましょう。
「Min」――スクロールバーの最小値。スライドバーを一番左または一番上にしたときの値。
「Max」――スクロールバーの最大値。スライドバーを一番右または一番下にしたときの値。これは最大で32767まで。
「LargeChange」――スクロールバーのスライド部分(スライドバーや矢印以外の部分)をクリックしたときにいくつ値が増減するかを設定するもの。この値を変更すると、スライドバーの幅が変わる。
「Value」――現在のスライドバーの位置を示す値。Min〜Maxのいずれかの値となる。
これらをまず最初に設定してからスクロールバーは使います。例えば、Mix=0,Max=100とすれば、0〜100までの値をスライドで設定するスクロールバーになるわけです。
では、簡単な例をあげておきましょう。スクロールバーを動かすと、現在の値がText1というTextBoxに表示されるサンプルを作ってみましょう。
Private Sub HScroll1_Change() Text1.Text = HScroll1.Value End Sub
このスクロールバーは、ClickではなくChangeイベントが用意されています。現在の値(Value)が変更されたと、このChangeイベントが発生するようになっています。通常は、このイベントを利用するのが一番でしょう。
もし、「ユーザーがスクロールしている間、リアルタイムに呼び出されるようにしたい」という場合には「Scroll」というイベントを利用できます。これは、スクロール中に連続して発生し続けるイベントで、ここに必要な処理を書いておけば、スクロール中にリアルタイムに変化をさせることができます。
ただし、絶えまなく呼び出されるので、あまり複雑なことをさせると動作が遅くなって実用的ではなくなります。そのあたりをよく考えて使うようにして下さい。