VBのテキストボックスで擬似的に上書きを実装する

 月曜日と木曜日に出社している出先で、Visual Basicを使った新しいシステムを開発中。私は日常的な業務もこなしつつ、コンピュータについてほとんど知らない(使うことはできる)会社側とシステム会社との間に立って通訳のような事もやっている。

 現在のシステムはもうずいぶん前にCUIベースで作られたもので、全ての項目の入力モードが「上書き」(もちろんInsertキーを押す事で「挿入」に変更は出来る) しかし新しいシステムは「挿入」が基本。(一部数値項目のみ上書きを実装)
 「上書き」に慣れきっている社員の方々は、新しいシステムで「挿入」が基本になると非常に困るらしい。もちろんInsertキーを押せば「上書き」になるのだが、別の項目に移動すればまた「挿入」になってしまうし、いちいちInsertキーを押すのは確かにわずらわしい。

 そこでシステム会社にその旨を伝えたところ、「難しい」との回答が来た。Windowsそのものを上書きにする事が不可能ではないが、そうするとシステムを使っている間はどのアプリケーションを使っても(Excel等でも)上書きになってしまいます、という事だった。

 Windowsそのものについては正直よく分からないが、「Visual Basicで入力モードを「上書き」に変更できない事はないのでは?」と思ったので調査開始。


……


………


…………


……………


 うーん、確かにそれっぽい情報に行き着かなかった。
 だったら「プログラム的に無理やり「上書き」をエミュレートしてしまえ!」と思って書いたのが下記コード。
 汎用性もないし「とりあえず検証できればOK」と思って書いたのでいろいろ微妙な部分もあるのだが、とりあえずこれでシステム会社に「こういうコードで実装してくれませんか」と提案メールを送ってみた。

 せっかく書いたコードなので、ここでも公開しておく。

 このコードでは、「TextBox1」というテキストボックスがある事を想定している。
 実際に複数の画面、複数のテキストボックスにこれを反映させるのであれば、処理内容を別に切り出しておいてそれを呼び出すような形になるのではないかと。

Public Class Main
    Public insertFlg As Boolean    'エミュレートするかどうかのフラグ

    Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
    '文字、数字、記号の場合にフラグを立てる
        If Char.IsLetterOrDigit(e.KeyChar) = True Or _
           Char.IsSymbol(e.KeyChar) = True Or _
           Char.IsPunctuation(e.KeyChar) = True Then
            insertFlg = True
        End If

    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
    フラグが立っている場合に上書きをエミュレートする
        If insertFlg = True Then
            Dim ss = TextBox1.SelectionStart
            Dim result1 = Microsoft.VisualBasic.Left(TextBox1.Text, TextBox1.SelectionStart)
            Dim result2 = Microsoft.VisualBasic.Mid(TextBox1.Text, TextBox1.SelectionStart + 2)
            insertFlg = False
            TextBox1.Text = result1 & result2
            TextBox1.SelectionStart = ss
        End If
    End Sub
End Class