ボタンクリックでテキストボックスに文字入力 その1
フォーム上にボタンを配置して、マウスクリックでテキストボックスに入力したい。
今回は、このような希望をなるべくシンプルに実現する方法を考察してみます。
サンプルとして、テンキーをクリックして数式を入力して計算結果を表示する電卓を作成します。

ボタンクリックによる文字入力以外に、イベントの処理の共通化などのテクニックも参考になると思います。
難易度:
ボタンクリック
ボタンクリックで文字入力と言うことなので、コマンドボタンを利用するのが普通の考えですが、コマンドボタンだとクリック時にフォーカスがボタンに移動してしまいます。クリックしたら、すぐテキストボックスにフォーカスを戻せばいいのですが、フォーカスが行ったり来たりするのでちらついたりします。
そこで、ラベルをボタン代わりに使います。ラベルならクリックしてもフォーカスは移動しません。ラベルの「立体表示」を「浮き出し」にしておきます。
フォーム上にテキストボックス「Txt1」、ラベル「ラベル2」を配置します。
上記のコードで、テキストボックスのカーソル位置に"1"が挿入されます。SelTextに代入することで、カーソルが先頭へ移動してしまいますので、カーソル位置を覚えておいて、代入後に次の位置に移動させてます。
このままだとクリックしてもボタンらしくないので、マウスボタンクリック時に「くぼみ」にして、真数ボタン解放時に浮き出しに戻すとボタンらしく見えます。 さらに上余白で標題を下げるとさらにそれらくしなります。
イベント処理の共通化
ラベル一つではテンキーにならないので必要数分ラベルを追加して、ラベルの数だけ上記のイベントプロシージャを記述すればいいわけですが、同じようなコードを繰り返し記述するのも無駄な気がしますね。
共通化する方法として、「クラスモジュールを使う」または、「関数(Function)を使う」というのが考えられますが、前者はかなり高度で難易度が高いので、今回は、後者の方法を使います。
フォーム上にラベルを追加して、全部で10個配置します。標題は、それぞれ、0 ~ 9 までつけます。
上記のイベントプロシージャを下記のように、Functionに書きかえます。
ラベル2のプロパティシートのイベントタブの各イベント欄を下記のように設定します。
プロパティ | 設定値 |
---|---|
クリック時 | =lbl_Click([ラベル2]) |
マウスボタンクリック時 | =lbl_MouseDown([ラベル2]) |
マウスボタン解放時 | =lbl_MouseUp([ラベル2]) |
他のラベルも同様に設定します。関数内の[]の中はもちろん自分自身の名前にします。
これで、ラベルボタンをクリックするとテキストボックスに標題の文字が入力されます。

今回は、ここまで。次回で、数式電卓を完成させます。