子供がローマ字の学習をするアプリをつくりたいのですが、実際のキーボードからではアルファベット順ではないので、学習に集中することができません。
そこで、仮想キーボードをつくって、そこからテキストボックスに文字を入力(IMEに渡す)するには、どのようにすればいいのでしょうか?
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 は入力フォーカスを持たない
ので、この場合は便利です。
Halbowさん、早速のご回答有り難うございます。
こんなに簡単だとは思わず、ビックリしました。
ところで、調べてみるとkeybd_eventは大文字と小文字を区別できないとのこと。私としましては大文字小文字で別々のボタンを用意して、押したままを入力させたいのです。具体的には、「a」〜「z」「A」〜「Z」「、」「。」「'」「^」「スペース(漢字へ変換)」「消す(Delete)」ボタンを用意したいのです。大人ならばともかく、使うのは小学校4年生でパソコンは初めてという子が多く、アルファベットも完全に覚えていない子もいるからです。
何かいい別案はないでしょうか?
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 です。
> 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 ボタンがへこんでいるときに大文字になります。
すみません、上記コードは SpeedButton7 ではなく SpeedButton6 です。
Halbow です。
>「、」「。」「'」「^」「スペース(漢字へ変換)」「消す(Delete)」ボタンを用意したいのです。
Tag に設定すべき数値は、仮想キーコードの数値です。これを定義より見つけることも
できますが、実際にキーを押してみて取得することもできます。新規で Form1 に
Label1 だけを置いてください。そして
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
Label1.Caption := IntToStr(Key);
end;
としてください。キーを押して表示される値が、Tag に設定すべき数値です。
Halbowさん、にしのさん、有り難うございました。
お二人の解答を参考にして、何とかうまく作ることが出来ました。
また何かありましたら、よろしくお願いいたします。
ツイート | ![]() |