【入門編】Windows Formsにおけるカスタムコントロールの自社開発:UserControlの継承を活用した「和暦対応日付入力ボックス」の部品化 – Visual Basic (VB / VB.NET)解析バイブル

スポンサーリンク

現場で差がつく!「和暦対応日付入力ボックス」の自社開発:VB.NETで目指す脱・初心者

こんにちは。システム開発の現場で、長年VB.NETと向き合ってきたアーキテクトです。

「毎回、日付入力のたびに西暦と和暦の変換ロジックをコピペしている」
「画面ごとに日付のバリデーション(入力チェック)が微妙に違ってバグの温床になっている」

もしあなたがそう感じているなら、今日が「脱・マクロ・コピペ職人」の記念日です。今回は、Windows Formsにおいて最も強力な武器である「UserControlの継承」を使い、自分専用の「和暦対応日付入力ボックス」を部品化する方法を伝授します。

—

1. なぜ「部品化」が必要なのか?

初心者が陥りやすい最大の罠は、すべての処理をフォーム(画面)の中に書いてしまうことです。これでは、仕様変更があった時に全画面を修正しなければなりません。

「部品化(カスタムコントロール)」の本質は、「日付入力の責任を、画面から部品に委譲する」ことにあります。画面は「日付が欲しい」と頼むだけで、裏側でどう変換されているかを知る必要がなくなる。これが、堅牢なシステム設計の第一歩です。

—

2. 「和暦対応日付入力ボックス」の設計

まずは、`UserControl`を継承した新しいクラスを作ります。

1. Visual Studioのプロジェクトを右クリック > 追加 > ユーザーコントロール(Windows Forms)を選択。
2. 名前を `WarekiDatePicker.vb` とします。
3. フォーム上に `TextBox` を1つ配置してください。

コード実装:心臓部を書き込む

以下のコードを `WarekiDatePicker.vb` に記述しましょう。ポイントは「入力された値が西暦か和暦かを自動判定し、適切に変換する」点です。

.net
Imports System.Globalization

Public Class WarekiDatePicker
‘ 日本の元号を扱うためのカルチャ情報を設定
Private ReadOnly jpCulture As New CultureInfo(“ja-JP”)

Public Sub New()
InitializeComponent()
‘ 元号表示を強制的に和暦にする設定
jpCulture.DateTimeFormat.Calendar = New JapaneseCalendar()
End Sub

‘ プロパティ:外部から値を取得するための窓口
Public Property SelectedDate As Date?
Get
Dim result As Date
‘ 入力文字列を日付に変換(西暦・和暦両対応)
If Date.TryParse(TextBox1.Text, jpCulture, DateTimeStyles.None, result) Then
Return result
End If
Return Nothing
End Get
Set(value As Date?)
‘ 値を表示する際は和暦形式でセット
TextBox1.Text = value?.ToString(“gyy年MM月dd日”, jpCulture)
End Set
End Property

‘ フォーカスが外れた瞬間に自動変換をかける(イベント駆動の極意)
Private Sub TextBox1_Leave(sender As Object, e As EventArgs) Handles TextBox1.Leave
Dim d As Date
If Date.TryParse(TextBox1.Text, jpCulture, DateTimeStyles.None, d) Then
SelectedDate = d ‘ 正規化して再表示
Else
MessageBox.Show(“正しい日付形式で入力してください。”)
End If
End Sub
End Class

—

3. ここがポイント!初心者がつまずく「罠」

コードを書く際、以下の3点だけは必ず意識してください。これができると、一気にエンジニアとしての格が上がります。

  • カルチャ情報の指定: 単に `Date.Parse` を使うと、PCの環境設定に依存してエラーが出ます。「明示的に `ja-JP` を指定する」ことで、どのPCでも同じ挙動を保証できます。
  • イベントのライフサイクル: `Leave` イベントを使っているのは、ユーザーが入力し終えたタイミングを確実に捉えるためです。`TextChanged` で逐一チェックすると、入力中にエラーが出てしまいユーザーの体験を損ないます。
  • Nullable (Date?) の活用: `Date` 型は空(null)を許容しません。`Date?` とすることで、「まだ入力されていない状態」を安全に扱えるようになります。

—

4. 魔法のように「再利用」する

ここからが感動の瞬間です。一度ビルド(Ctrl + Shift + B)を行うと、Visual Studioの左側の「ツールボックス」に、あなたが作った `WarekiDatePicker` が出現します。

あとは、通常のボタンやテキストボックスと同じように、ドラッグ&ドロップで画面に配置するだけです。

  • 画面A: `WarekiDatePicker1.SelectedDate = DateTime.Now`
  • 画面B: `If WarekiDatePicker1.SelectedDate.HasValue Then …`

たったこれだけで、どの画面でも同じ品質の日付入力が実現できます。

—

最後に:エンジニアとしての心構え

「コピペ」は、その場をしのぐための応急処置です。「部品化」は、未来の自分を楽にするための投資です。

今回作成したコントロールは、さらに「カレンダーを表示するボタンを追加する」「祝日判定を追加する」など、いくらでも進化させることができます。VB.NETのオブジェクト指向機能を使えば、あなたは「画面を作る人」から「部品を組み合わせてシステムを構築する設計者」へと進化できるはずです。

まずはこのコードを写経し、自分の画面に配置してみてください。そこから見える景色が、きっと変わるはずです。応援していますよ!

タイトルとURLをコピーしました