Delphi XEでは、「インスタント検索」機能を実装しようとしています。これは、Firefoxの「タイプすると検索する」と似ていますが、オープンソースのクリップボードエクステンダー、Ditto:キーボードのイベントをあるWindowsコントロールから別のWindowsコントロールに転送する
典型的なナビゲーションイベントを処理する項目のリストがあります。ただし、英数字キー、ナビゲーションおよび編集コマンド(右矢印または左矢印、シフト+矢印、バックスペース、削除など)は、リストの下にある編集ボックスに再ルーティングする必要があります。編集ボックスのOnChangeイベントは、リストのリフレッシュをトリガします。
UIのポイントは、ユーザーがコントロール間でタブまたはシフトタブを使用する必要がないことです。彼らは、単一のコントロールであるかのように2つのコントロール(リストと編集ボックス)「は、「感じるべき。制御する上でUIがは偶発的ではありません検索の動作がフォーカスを持っている。
それは私の最良の選択肢と思われますどのように私はそれを達成することができます。編集ボックスに(私はTcxTreeListを使用しています)、リストコントロールから前方特定のキーボードイベントにあり、そしてエディットボックスからリストへのナビゲーションキーの握りを転送する?
注:
TcxTreeListはもちろんインクリメンタルサーチをサポートしていますが、これは私が後にしたものではありません。検索はSQLiteデータベースに行き、部分文字列の一致を探します。このリストには、dbの一致する項目のみが表示されます。いくつかの重なりがあります。両方のコントロールは通常VK_HOMEとVK_ENDを処理しますが、これは問題ありません。この場合、キーはリストに移動します。個々のキー押下を転送するか、それを受け取ったコントロールで処理するかを決定する必要があります。編集上
:
type
THackEdit = class(TEdit);
procedure TMainForm.cxTreeList1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
THackEdit(edit1).KeyDown(Key, Shift);
end;
は残念ながら、これは効果がありません: 1つの明らかな方法はそうのように、エディットコントロールのそれぞれのKeyDown、keyUpイベントとKeyPressイベントメソッドを呼び出すように見えました。私の推測では、TEditは集中していない限り、キーイベントを処理しません。 SendMessage(THackEdit(edit1).Handle、WM_KEYDOWN、Key、0)を使用しても効果はありません。
Strangeですが、TEditのPerformメソッドを使用しても効果はありません。私のOPのSendMessageの例と同じです。バックスペースキー(エディットコントロールのテキストとキャレットの位置が> 0)を送信するなどの単純な操作を行っても、何もしません。edit1.Perform(WM_KEYDOWN、8、0); –
@mood - バックスペースのために 'edit1.Perform(WM_CHAR、VK_BACK、0);'を試してください。そのため、サンプルプロジェクトにWM_CHAR、WM_KEYDOWN、WM_KEYUPメッセージが含まれています。 –