« Python CGIでウェブアプリを作ってみる その1 | トップページ | ブルーライトなどの光ダメージをケアする目薬サンテPCがすごい »

2014-09-15

C++ Builder/Delphiでフォーカスが別のコントロールにある時に強引にTEditに入力を戻す

バーコードを利用したアプリケーションなどでユーザーがコンピュータの扱いに慣れていないと、何かの拍子にフォーカスがTEditなどから外れていても、構わずにバーコードを読んでしまって、よく確認をしていないために入力した筈のデータが抜け落ちてしまうというような事が起こります。

色々と考えてみたのですが、TForm::KeyPreviewをtrueにして、すべてのキー入力をTEditに投げるという事も考えたのですが、ちょっと違う方法を取ってみた。

フォームにTEditとTRadioButtonを置いてテストしてみます。これは、入荷と出荷などモードを切り替える時によく使うと思うので、TRadioButtonにしてみました。

// TRadioButtonのOnKeyPressイベント
void __fastcall TForm1::RadioButton1KeyPress(TObject *Sender, wchar_t &Key)
{
    ActiveControl = Edit1;
    Edit1->Text = Edit1->Text + Key;
    Edit1->SelStart = Edit1->Text.Length();
}

こんな風に別のコントロール(ここではTRadioButton)のOnKeyPressイベントでActiveControlをTEditに変更してTEdit::Textの末尾に入力された文字を結合します。

次に入力される文字を適切な場所に入力させるには、入力した文字列の末尾にキャレットがある必要があるので、TEdit::SelStartに文字列長を指定します。

これでTRadioButtonのTabStopをtrueにしておきTRadioButtonをクリックするなり、タブで移動するなりしてアクティブにしておき、そのままの状態でキーを入力するとTEditに入力されます。

TRadioButtonはいくつかの選択肢の択一なので、TRadioButtonを複数用意してみましたが、RadioButton1を選択して、矢印キーの上下で選択肢を移動しても選択の動作には影響はありません。OnKeyPressは文字以外はVK_ESCAPE、VK_RETURNや'\t'(TAB)くらいしか捕捉しないので、矢印やCtrl、Alt、Shiftなどではイベントが発生しないので、それなりにうまく動くようです。

逆に言うと、文字やVK_RETURNを受け取る必要があるようなコントロールに対しては工夫が必要かもしれません。

ちょっとテストした感じでは上手く動作しているようです。必要なら文字単位でフィルターを掛けるなどして、数字だけをTEditに転送するなどの処理をするといいかも知れません。



|

« Python CGIでウェブアプリを作ってみる その1 | トップページ | ブルーライトなどの光ダメージをケアする目薬サンテPCがすごい »

C/C++」カテゴリの記事

コメント

佐藤と申します、突然のメールをお許し下さい。
C++Builde6で楽天RSSに接続し、株価の自動取得する事を考えています。
しかし、接続法が分からず、ネットで検索していたところ貴殿のHPを見つけ
ました。 もしご存知でしたら教えて頂けませんか。

Excel では楽天RSSに接続可能ですが、現在使っているC++Builde6のアプリ
に追加して使いたいのでC++Builde6での接続にこだわっています。

よろしく願い致します。

投稿: 佐藤 秀夫 | 2015-07-01 20:10

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: C++ Builder/Delphiでフォーカスが別のコントロールにある時に強引にTEditに入力を戻す:

« Python CGIでウェブアプリを作ってみる その1 | トップページ | ブルーライトなどの光ダメージをケアする目薬サンテPCがすごい »