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に転送するなどの処理をするといいかも知れません。
| 固定リンク
「C/C++」カテゴリの記事
- コンピュータプログラミング言語調節可能おしゃれキャップ(2018.06.05)
- raspberry piでC++11を使えるようにする(2016.04.27)
- StrinToIntのような文字列を整数に変換する関数を実装してみる(2016.03.21)
- インライン化できない関数のラッパー関数などで関数呼び出しのオーバーヘッドを減らしたい(2016.03.03)
- C++ Builder/Delphiでフォーカスが別のコントロールにある時に強引にTEditに入力を戻す(2014.09.15)
この記事へのコメントは終了しました。
コメント
<a href=https://ndt.su/id/proyavitel-inspektor-ldn-aerozol-500ml-172.html>проявитель инспектор</a> - контактная жидкость для ультразвукового контроля, аналог хеллинг
投稿: Robertrisse | 2024-06-16 00:27
佐藤と申します、突然のメールをお許し下さい。
C++Builde6で楽天RSSに接続し、株価の自動取得する事を考えています。
しかし、接続法が分からず、ネットで検索していたところ貴殿のHPを見つけ
ました。 もしご存知でしたら教えて頂けませんか。
Excel では楽天RSSに接続可能ですが、現在使っているC++Builde6のアプリ
に追加して使いたいのでC++Builde6での接続にこだわっています。
よろしく願い致します。
投稿: 佐藤 秀夫 | 2015-07-01 20:10