ラベルやボタンのひとつひとつにIf文使っていませんか?―Object型とFunction―
私は研究の過程でよくVisual Basicで実験用プログラムを書くのですが、作るプログラムって、ラベルやボタンがたくさんフォーム上に並んでいるものが多いんですよね。そういう時に、ある条件が満たされたら一度に複数のラベルやボタンに同じような操作を行うってことがあるのです。
例を以下に示します。CommandButton1からCommandButton20に「OK」と表示したいときに、
CommandButton1.Text = "OK" CommandButton2.Text = "OK" CommandButton3.Text = "OK" CommandButton4.Text = "OK" CommandButton5.Text = "OK" CommandButton6.Text = "OK" CommandButton7.Text = "OK" CommandButton8.Text = "OK" CommandButton9.Text = "OK" CommandButton10.Text = "OK" CommandButton11.Text = "OK" CommandButton12.Text = "OK" CommandButton13.Text = "OK" CommandButton14.Text = "OK" CommandButton15.Text = "OK" CommandButton16.Text = "OK" CommandButton17.Text = "OK" CommandButton18.Text = "OK" CommandButton19.Text = "OK" CommandButton20.Text = "OK"
なんて書いてもいいですが、大変もっさりしたコードになってしまいます。今回は「すべてのボタンにOKの表示」だからいいですけど、これが「幾つかの条件によってある1つのボタンだけNGになる」とかだと、もうその度に似たようなコードを書くことになってしんどいことこの上なしです。
そこで私は、返り値がObject型の関数を一回作ってしまいます。そうすれば、このようなもっさりコードは関数の定義内で1回書いて済みます。
まず関数ですが、こんな感じ:
Function getCommandButton(ByVal n As Integer) As Object Select Case n Case 1 Return CommandButton1 Case 2 Return CommandButton2 Case 3 Return CommandButton3 '(中略) Case 19 Return CommandButton19 Case 20 Return CommandButton20 Case Else Return Nothing End Select End Function
最後のReturn Nothingは私の趣味です。返り値がNothingである場合の処理が面倒だ(もしくはこの一文を読んで理解できていない)という人は代わりにCommandButton20を入れてもいいかもしれません。
この関数を最初に用意しておきますと、先のコードはこれで済みます:
For i As Integer = 1 To 20 getCommandButton(i).Text = "OK" Next
ね、簡単でしょ?
先ほどちょろっと言いました、「ある条件の時はひとつのボタンだけNGと表示したい」というときも、このとおり:
'kの値と同じ番号が振られたボタンだけNGと表示。例えば9。 Dim k As Integer = 9 For i As Integer = 1 To 20 If i = k Then getCommandButton(i).Text = "NG" Else getCommandButton(i).Text = "OK" End If Next
GUIをもった実験プログラムを書くのに多くの学生がVBでプログラムを書いてるっぽいので、この記事を書いてみました。研究の一助になれば幸いです。