まぁ、がしがしとタイピングするのも楽しいけど、私は作業量を考えて短くするのが好きです。
行数にするとアウトプットの量が減るんですけどねw、気にせず。
こんな風な画面で、マウスをポイントしたとき(MouseEnter と MouseLeaveイベント)の時にステータスバーにメッセージを表示します。
あと、チェックボックスを切り替えた時に、各ボタンの有効/無効が変えられます。
ざっと、ソースコード。何故か VB で(笑)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 | Public Class Form1 Private Sub Form1_Load( ByVal sender As System. Object , ByVal e As System.EventArgs) Handles MyBase .Load ' 有効/無効を設定 InitEnableMode() ' 動的にイベントを追加 AddHandler RadioButton1.CheckedChanged, AddressOf RadioButton1_CheckedChanged AddHandler RadioButton2.CheckedChanged, AddressOf RadioButton1_CheckedChanged AddHandler RadioButton3.CheckedChanged, AddressOf RadioButton1_CheckedChanged ' ステータスバーの設定 InitStatusBar() ' イベントを追加 Dim items As New List(Of Control) items.Add(Button1) items.Add(Button2) items.Add(Button3) items.Add(ComboBox1) items.Add(TextBox1) items.Add(TextBox2) items.Add(TextBox3) For Each c In items AddHandler c.MouseEnter, AddressOf Button1_MouseEnter AddHandler c.MouseLeave, AddressOf Button1_MouseLeave Next End Sub ''' <summary> ''' 有効/無効を設定 ''' </summary> ''' <remarks></remarks> Public Sub InitEnableMode() Dim o As Boolean = True Dim x As Boolean = False '' Mode 1, 2, 3, コントロールの順で指定 SETMODE(o, o, o, Button1) SETMODE(o, o, x, Button2) SETMODE(o, x, x, Button3) SETMODE(o, x, x, ComboBox1) SETMODE(o, x, x, TextBox1) SETMODE(x, o, o, TextBox2) SETMODE(x, o, o, TextBox3) End Sub Private _modes As New List(Of List(Of Object )) Public Sub SETMODE( ByVal ParamArray params As Object ()) Dim max As Integer = params.Length Dim items As New List(Of Object ) items.Add(params(max - 1)) For i As Integer = 0 To max - 2 items.Add(params(i)) Next _modes.Add(items) End Sub Public Sub ChangeMode( ByVal mode As Integer ) For Each items As List(Of Object ) In _modes Dim c As Control = CType (items(0), Control) c.Enabled = CType (items(mode + 1), Boolean ) Next End Sub Private Sub RadioButton1_CheckedChanged( ByVal sender As System. Object , ByVal e As System.EventArgs) If sender Is RadioButton1 Then ChangeMode(0) ElseIf sender Is RadioButton2 Then ChangeMode(1) ElseIf sender Is RadioButton3 Then ChangeMode(2) End If End Sub Class STATMSG Public cont As Control Public msg As String End Class Private _status As New List(Of STATMSG) ''' <summary> ''' フォーカス時のメッセージを設定 ''' </summary> ''' <param name="c"></param> ''' <param name="msg"></param> ''' <remarks></remarks> Public Sub SETSTATUS( ByVal c As Control, ByVal msg As String ) Dim sm As New STATMSG() With {.cont = c, .msg = msg} _status.Add(sm) End Sub Public Sub InitStatusBar() SETSTATUS(Button1, "先頭のボタンです" ) SETSTATUS(Button2, "真ん中のボタンです" ) SETSTATUS(Button3, "一番舌のボタンです" ) SETSTATUS(ComboBox1, "項目を選択します" ) SETSTATUS(TextBox1, "名前を入力します" ) SETSTATUS(TextBox2, "年齢を入力します" ) SETSTATUS(TextBox3, "住所を入力します" ) End Sub Public Sub ChangeFocus( ByVal sender As Object , ByVal b As Boolean ) If b = False Then ToolStripStatusLabel1.Text = "" Else For Each cm In _status If cm.cont Is sender Then ToolStripStatusLabel1.Text = cm.msg End If Next End If End Sub Private Sub Button1_MouseEnter( ByVal sender As System. Object , ByVal e As System.EventArgs) ChangeFocus(sender, True ) End Sub Private Sub Button1_MouseLeave( ByVal sender As System. Object , ByVal e As System.EventArgs) ChangeFocus(sender, False ) End Sub End Class |
眠たいので、詳しい解説は後ほどやる…かもしれず。
メモ的に書いておくと、モードの設定のフォーマットがミソです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | ''' <summary> ''' 有効/無効を設定 ''' </summary> ''' <remarks></remarks> Public Sub InitEnableMode() Dim o As Boolean = True Dim x As Boolean = False '' Mode 1, 2, 3, コントロールの順で指定 SETMODE(o, o, o, Button1) SETMODE(o, o, x, Button2) SETMODE(o, x, x, Button3) SETMODE(o, x, x, ComboBox1) SETMODE(o, x, x, TextBox1) SETMODE(x, o, o, TextBox2) SETMODE(x, o, o, TextBox3) End Sub |
bool 値を「o」と「x」に割り当てているのは、こんな風に表形式で設定したいからです。かつて、VC++ の時に作ったノウハウです。その時には、define を使ったり外部ファイルを include したりしたのですが、vb ではできません。ture, false を使ってもいいのですが、visual studio が勝手にフォーマットしてしまうから、桁がずれるんです。なので、こんな風に「o」と「x」を使うわけです。
なんとなく分かり易いですね。
モードが増えた場合は、行を増やせばいい訳です。
同じようにステータスバーの切り替えの設定も書けます。
1 2 3 4 5 6 7 8 9 | Public Sub InitStatusBar() SETSTATUS(Button1, "先頭のボタンです" ) SETSTATUS(Button2, "真ん中のボタンです" ) SETSTATUS(Button3, "一番舌のボタンです" ) SETSTATUS(ComboBox1, "項目を選択します" ) SETSTATUS(TextBox1, "名前を入力します" ) SETSTATUS(TextBox2, "年齢を入力します" ) SETSTATUS(TextBox3, "住所を入力します" ) End Sub |
こんな風に、SETSTATUS 関数を作ります。クラスを作って new SetStatus() With { … } な形で書いてもよいのですが、new やらクラス名やらを設定するのが面倒ですよね。所詮、使い捨ての関数ですから、べたべたに書いてしまいます。
1 2 3 4 5 6 7 8 9 10 11 12 13 | ' イベントを追加 Dim items As New List(Of Control) items.Add(Button1) items.Add(Button2) items.Add(Button3) items.Add(ComboBox1) items.Add(TextBox1) items.Add(TextBox2) items.Add(TextBox3) For Each c In items AddHandler c.MouseEnter, AddressOf Button1_MouseEnter AddHandler c.MouseLeave, AddressOf Button1_MouseLeave Next |
マウスイベントも、こんな風にまとめて書いてしまいます。Handles に書いてもいいのですが、数が少ないときはいいけどこんな風に多くなると大変ですよね。なので、使い捨てのリストを使ってどしどしと追加します。
なんで、私がこんなコードを書くのかというと、
- 使い捨てのコードは、効率よりも分かり易く書く。
- 分かり易く書くと、あとからの変更がしやすい。
- コードを見て分かり易いと、テストを省略できる。
からです。
コントロールの有効/無効の処理なんかは、if 文と control 名を使ってずらずらと書き並べることはできるのですが、それをやってしまうと、
- 抜けがあると、何処が悪いのか分かりづらい。
- 抜けがでやすいので、テストする必要がある。
ってことが理由なのです。先のように(トリッキーではありますが)あたかも Excel で設定しているように x と o を使って桁を揃えていくと、抜けが明確になります。
コードを短くすると生産性が悪くなるという弊害がw出ますが、まぁ、タイピングするのが仕事ではないので、昔から短いコードをたくさん書きます。そう、プログラマの仕事はコードを書くことではなくて、動くプログラムを作ることですからね、ってことです。
<プログラマの仕事はコードを書くことではなくて、
<動くプログラムを作ることですからね
確かにタイピングするのが仕事じゃないですね。
現状、未熟な私は短いコードでその時、ウホ!できた!と喜ぶと・・・
その後修正でアレアレする私がいる(´・ω・)ス
いやぁ、タイピングを主にする「コーダー」とか「パンチャー」とか「タイピスト」なる方もいらっしゃいますから。ただ、無駄にたくさんのコードを書いている場合(自分も含めて)、
1.たくさんの行数ができる。
2.おお、たくさん仕事をやった(やってる)
で評価されるのが曲者で、自己満足も入っちゃう。これが困りものです。
短すぎるコードは、one liner とかw 究極的には、c とか c# は改行がいらないので、1行で書けるって荒業がありますけどね。1行だけど、ファイルの大きさは、1MB あるとか。
あと、オフレコですが(ここに公開しているけど)、
コーディングを外注するときに、行数を少なくするマクロを提供して、外注費用を減らすという技があります。大抵、コードの行数で見積もりを出すので、行数が減ると見積もり金額が減るというのを、逆手に利用するということで。