Delphi 2010は、Delphiにいくつかの優れたタッチとジェスチャーのサポートを導入しました。
詳細については、EDN Webサイトにアクセスして、CodeRage4のリプレイを探してください。SeppyBloomによる「VCLでのジェスチャーの実践」というタイトルのセッションがあります。また、CodeRage 5には、VesvolodLeonovによる「新しいアプリケーションと現在のプロジェクトのジェスチャー機能」というタイトルのセッションがあります。
MarcoCantuの「Delphi2010ハンドブック」の第6章では、Delphiでのタッチとジェスチャーについても説明しています。
最終的には、Chris Bensenのブログで、Delphiでのタッチとジェスチャーのサポートに関する紹介記事とデモソースコードを確認できます。
コンポーネントがフォーカスを取得したときに仮想キーボードを持ってきて、それを失ったときに非表示にすることさえできないようです。
Delphi 2010以降のバージョンでは、タッチ対応のキーボードコンポーネントがすでに利用可能です。フォーカスが変更されたときに表示または非表示にするには、CM_FOCUSCHANGED VCLメッセージを処理し、フォーカスを取得するコントロールが特定のクラスから派生した場合、または特定の条件を満たしている場合にキーボードを表示します。サンプルコードは次のとおりです。
type
TForm1 = class(TForm)
Edit1: TEdit;
Button1: TButton;
Memo1: TMemo;
TouchKeyboard1: TTouchKeyboard;
private
procedure ActivateVirtualKeyboard(Control: TWinControl; Keyboard: TTouchKeyboard);
procedure CmFocusChanged(var Msg: TCMFocusChanged); message CM_FOCUSCHANGED;
public
{ Public declarations }
end;
/// Implementation
procedure TForm1.ActivateVirtualKeyboard(Control: TWinControl; Keyboard: TTouchKeyboard);
var
APoint : TPoint;
begin
if Control is TCustomEdit then
begin
APoint := Control.ClientToScreen(Point(0,0));
APoint := Keyboard.Parent.ScreenToClient(APoint);
Keyboard.Left := APoint.X;
Keyboard.Top := APoint.Y + (Control.Height);
Keyboard.Visible := True;
end
else
Keyboard.Visible := False;
end;
procedure TForm1.CmFocusChanged(var Msg: TCMFocusChanged);
begin
ActivateVirtualKeyboard(Msg.Sender, TouchKeyboard1);
end;
上記のコードは、フォーカスが変更されるたびにActivateVirtualKeyboardを呼び出します。Msg.Senderは、注目を集めたコントロールです。ActivateVirtualKeyboardは、コントロールがTCustomEditの子孫であるかどうかを確認します(TEditやTMemoなどのコンポーネントはこのクラスの子孫です)。コントロールがTCustomEditから派生している場合は、仮想キーボードをコントロールのすぐ下に配置し、キーボードを表示します。それ以外の場合は、キーボードを非表示にします。
サンプルコードには、Form1に編集、メモ、ボタンがあります。Edit1とMemo1のキーボードは表示され、Button1にフォーカスがあると非表示になります。
画面上のキーボードの位置の計算はそれほど巧妙ではなく、フォーカスのあるコントロールがフォームの下端に非常に近い場合、キーボードが下がりすぎる可能性があります。とにかく、画面上にコントロールを配置することはあなたの質問の範囲外です。