Delphi XEでは、「インスタント検索」機能を実装しようとしています。これは、Firefoxの「入力時に検索」に似ていますが、オープンソースのクリップボードエクステンダーであるDittoの同様の機能によってよりよく示されています。
一般的なナビゲーションイベントを処理するアイテムのリストがあります。ただし、英数字キーとナビゲーションおよび編集コマンド(右/左矢印、Shift +矢印、バックスペース、削除など)は、リストの下の編集ボックスに再ルーティングする必要があります。編集ボックスのOnChangeイベントは、リストの更新をトリガーします。
UIのポイントは、ユーザーがコントロール間でタブまたはShiftキーを押しながらタブを押す必要がないことです。2つのコントロール(リストと編集ボックス)は、単一のコントロールであるかのように「感じる」必要があります。検索UIの動作は、どちらのコントロールにフォーカスがあるかによって決まることはありません。
私の最善の選択肢は、特定のキーボードイベントをリストコントロール(TcxTreeListを使用しています)から編集ボックスに転送し、いくつかのナビゲーションキーを編集ボックスからリストに転送することです。どうすればそれを達成できますか?
ノート:
TcxTreeListはもちろんインクリメンタルサーチをサポートしていますが、これは私が求めているものではありません。検索はSQLiteデータベースに行き、部分文字列の一致を探します。リストには、データベースから一致するアイテムのみが表示されます。
いくつかの重複があります。たとえば、両方のコントロールは通常VK_HOMEとVK_ENDを処理しますが、それは問題ありません。この場合、キーはリストに移動します。個々のキー押下を転送するか、それを受け取ったコントロールで処理するかを決定する必要があります。
編集時: 1つの明白な方法は、次のように、編集コントロールのそれぞれのKeyDown、KeyUp、およびKeyPressメソッドを呼び出すことであるように思われました。
type
THackEdit = class( TEdit );
procedure TMainForm.cxTreeList1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
THackEdit( edit1 ).KeyDown( Key, Shift );
end;
残念ながら、これは効果がありません。私の推測では、TEditは、フォーカスされていない限り、主要なイベントを処理しません。SendMessage(THackEdit(edit1).Handle、WM_KEYDOWN、Key、0)を使用しても効果はありません。