こんにちは。現場で泥臭い実装と向き合い、時にはコードの美学を追求するエンジニアです。
業務アプリケーションを開発していると、必ずぶち当たる壁があります。それは「数値入力のUX(ユーザー体験)と、視認性の両立」です。
入力中は「10000」と打ち込みたい。しかし、表示する時は「¥10,000」と見やすくしたい。このジレンマを解消するために、多くの初心者は複雑なフラグ管理やイベントのスパゲッティコードに悩まされます。
今日は、`TextBox`を継承し、「フォーカスがあるときは生データ、外れたら装飾データ」という魔法をかける、プロ品質のカスタムコントロールの作り方を伝授しましょう。
—
なぜ「継承」を使うのか?
ここがプロとアマの分かれ道です。多くの人は「TextBoxを貼り付けて、LostFocusイベントにロジックを書く」という方法をとります。しかし、これでは画面が10個あれば10回同じコードを書くことになり、修正が地獄になります。
`Inherits TextBox` を使うことで、TextBoxの全ての機能を持ちつつ、我々が「味付け」した機能だけを追加できるのです。これがオブジェクト指向の力です。
—
現場で使える「CurrencyTextBox」の設計図
以下のコードを、新規クラスファイルとしてプロジェクトに追加してください。
Imports System.Windows.Forms
Imports System.ComponentModel
‘ TextBoxを継承して、新しいコントロールを作成します
Public Class CurrencyTextBox
Inherits TextBox
‘ 通貨記号の設定(必要に応じてプロパティ化してください)
Private Const CurrencySymbol As String = “¥”
‘ 入力中かどうかを判定するフラグは不要です。
‘ フォーカスがあるかどうか(Me.Focused)で状態を判断するのが最も安全です。
‘ フォーカスが入った時:カンマと記号を消して「生の数値」に戻す
Protected Overrides Sub OnEnter(e As EventArgs)
MyBase.OnEnter(e)
‘ 書式を解除して生の数字のみにする
Me.Text = Me.Text.Replace(CurrencySymbol, “”).Replace(“,”, “”)
Me.SelectAll() ‘ 入力しやすくするために全選択
End Sub
‘ フォーカスが外れた時:カンマと記号をつけて「表示用」にする
Protected Overrides Sub OnLeave(e As EventArgs)
MyBase.OnLeave(e)
Dim val As Decimal
‘ 数値変換を試みる(エラー対策)
If Decimal.TryParse(Me.Text, val) Then
‘ 3桁カンマ区切り + 通貨記号
Me.Text = CurrencySymbol & val.ToString(“N0”)
End If
End Sub
End Class
—
コードのポイント:ここを理解すればマスターです
1. `Inherits TextBox`: これで、あなたのクラスはTextBoxのクローンになります。TextBoxが持つ全てのプロパティがそのまま使えます。
2. `Protected Overrides`: これは「元々持っている機能を、自分流に上書きする」という宣言です。`OnEnter`や`OnLeave`は、イベントハンドラをわざわざ書かなくても、コントロール内部で直接処理を横取りできる非常に効率的な方法です。
3. `Decimal.TryParse`: 数値変換の際に最も重要なテクニックです。もしユーザーが「あいうえお」と入力しても、エラーでアプリが落ちるのを防ぎます。
—
陥りやすい罠:なぜ「NumericUpDown」を使わないのか?
よく「NumericUpDownを使えばいいのでは?」と聞かれます。しかし、業務アプリでNumericUpDownを使うと、「いちいちマウスで矢印をクリックする手間」や「スクロールでの誤操作」がユーザーから不評を買うことが多々あります。
キーボードだけで高速に入力したい経理担当者にとって、TextBoxの軽快さは正義なのです。今回の設計は、その「入力速度」と「見た目の良さ」を両立させるための最適解です。
—
さあ、あなたのアプリで実装してみよう
コードを書いたら、一度プロジェクトを「ビルド(リビルド)」してください。そうすると、ツールボックスの一番上に「CurrencyTextBox」というアイコンが魔法のように出現します。
あとは、それを画面にドラッグ&ドロップするだけ。もう、イベントコードをコピペして回り回る日々とはおさらばです。
最後に
プログラムにおいて「何を書くか」よりも大切なのは、「いかに書かないか」です。今回のようにコントロールを部品化しておけば、保守コストはゼロに近づきます。
迷ったら、まずはこのコードを写経してみてください。動いた瞬間に、あなたのエンジニアとしての視界が少しだけ広がるはずです。何か分からないことがあれば、いつでもまた聞きに来てくださいね。応援しています!
