ボタンを押してテキストボックスに文字を入力するには?

解決


yoshi-kun  2003-08-08 00:32:46  No: 4359

子供がローマ字の学習をするアプリをつくりたいのですが、実際のキーボードからではアルファベット順ではないので、学習に集中することができません。
そこで、仮想キーボードをつくって、そこからテキストボックスに文字を入力(IMEに渡す)するには、どのようにすればいいのでしょうか?


Halbow  URL  2003-08-08 07:37:16  No: 4360

Halbow です。

Edit1 と SpeedButton を5つ配置してください。
オブジェクトインスペクタで以下のようにセットしてください。

SpeedButton1.Caption := 'A';
SpeedButton1.Tag := 65;

SpeedButton1.Caption := 'B';
SpeedButton1.Tag := 66;

SpeedButton1.Caption := 'C';
SpeedButton1.Tag := 67;

SpeedButton1.Caption := 'D';
SpeedButton1.Tag := 68;

SpeedButton1.Caption := 'E';
SpeedButton1.Tag := 69;

最後に、この五つの SpeedButton をマウスで同時に選択し、
オブジェクトインスペクタのイベントタブのところの OnClick
イベントのところをダブルクリックして自動生成されたハンドラで
以下のようにします。

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  C:Byte;
begin
  C := TSpeedButton(Sender).Tag;
  keybd_event(C, 0, 0, 0);
  keybd_event(C, 0, KEYEVENTF_KEYUP, 0);
end;

実行して、Edit1 にフォーカスがあるとき、各スピードボタンを
押すと、キーボード入力と同じ文字が入力されます。IME が On
でもうまくいきます。SpeedButton は入力フォーカスを持たない
ので、この場合は便利です。


yoshi-kun  2003-08-09 22:39:50  No: 4361

Halbowさん、早速のご回答有り難うございます。
こんなに簡単だとは思わず、ビックリしました。
ところで、調べてみるとkeybd_eventは大文字と小文字を区別できないとのこと。私としましては大文字小文字で別々のボタンを用意して、押したままを入力させたいのです。具体的には、「a」〜「z」「A」〜「Z」「、」「。」「'」「^」「スペース(漢字へ変換)」「消す(Delete)」ボタンを用意したいのです。大人ならばともかく、使うのは小学校4年生でパソコンは初めてという子が多く、アルファベットも完全に覚えていない子もいるからです。
何かいい別案はないでしょうか?


にしの  2003-08-09 23:04:43  No: 4362

Shiftのときには、
    keybd_event(VK_SHIFT, 0, 0, 0);//Shiftキーダウン
    keybd_event(C, 0, 0, 0);
    keybd_event(C, 0, KEYEVENTF_KEYUP, 0);
    keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);//Shiftキーアップ
とすればよいかと思います。


Halbow  URL  2003-08-09 23:32:49  No: 4363

Halbow です。

> keybd_eventは大文字と小文字を区別できないとのこと

すでに、にしのさんの回答がありますが念のため。

前回のコードに、SpeedButton6 は横長に追加して、オブジェクトインスペクタ
で以下のように設定します。イベントは設定しません。

SpeedButton6.Caption := 'Shift';
SpeedButton6.AlowAllUp := true;
SpeedButton6.GroupIndex := 1;

これで、一度おすと押されたままになり、もう一度おすと元に戻ります。
そして、

procedure TForm1.SpeedButton1Click(Sender: TObject);
var
  C:Byte;
begin
  C := TSpeedButton(Sender).Tag;
  if SpeedButton7.Down then keybd_event(VK_SHIFT, 0, 0, 0);
  keybd_event(C, 0, 0, 0);
  keybd_event(C, 0, KEYEVENTF_KEYUP, 0);
  if SpeedButton7.Down then keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0);
end;

のようにすると、Shift ボタンがへこんでいるときに大文字になります。


Halbow  2003-08-09 23:34:49  No: 4364

すみません、上記コードは SpeedButton7 ではなく SpeedButton6 です。


Halbow  URL  2003-08-09 23:48:47  No: 4365

Halbow です。

>「、」「。」「'」「^」「スペース(漢字へ変換)」「消す(Delete)」ボタンを用意したいのです。

Tag に設定すべき数値は、仮想キーコードの数値です。これを定義より見つけることも
できますが、実際にキーを押してみて取得することもできます。新規で Form1 に
Label1 だけを置いてください。そして

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  Label1.Caption := IntToStr(Key);
end;

としてください。キーを押して表示される値が、Tag に設定すべき数値です。


yoshi-kun  2003-08-11 23:28:48  No: 4366

Halbowさん、にしのさん、有り難うございました。
お二人の解答を参考にして、何とかうまく作ることが出来ました。

また何かありましたら、よろしくお願いいたします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加