Перенаправление событий клавиатуры от одного элемента управления Windows к другому

В Delphi XE я пытаюсь реализовать функцию «мгновенного поиска» - такую, которая напоминает Firefox "поиск по мере ввода" несколько, но лучше это иллюстрируется аналогичной функцией в расширителе буфера обмена с открытым исходным кодом, То же :

Ditto search interface

Существует список элементов, которые обрабатывают типичные события навигации. Однако любые буквенно-цифровые клавиши, а также команды навигации и редактирования (стрелки вправо / влево, Shift + стрелки, возврат, удаление и т. Д. ) следует перенаправить в поле редактирования под списком. Событие OnChange окна редактирования инициирует обновление списка.

Суть пользовательского интерфейса состоит в том, что пользователю не нужно переходить на табуляцию или сдвигать табуляцию между элементами управления. Два элемента управления (список и поле редактирования) должны «ощущаться», как если бы они были одним элементом управления. Поведение пользовательского интерфейса поиска не должно зависеть от того, какой элемент управления находится в фокусе.

Похоже, мой лучший вариант - перенаправить определенные события клавиатуры из элемента управления списком (я использую TcxTreeList ) в поле редактирования и перенаправить несколько клавиш навигации из поля редактирования в поле редактирования. list. Как я могу этого добиться?

Примечания:

  1. TcxTreeList, конечно, поддерживает инкрементный поиск, но это не то, что мне нужно. Поиск идет в базу данных SQLite и ищет совпадения подстроки. В списке отображаются только совпадающие элементы из базы данных.

  2. Есть некоторое перекрытие, например, оба элемента управления обычно обрабатывают VK_HOME и VK_END, но это нормально - в этом случае ключи перейдут в список. Мне нужно будет решить, перенаправлять ли каждое отдельное нажатие клавиши или обрабатывать его в элементе управления, который его получил.

При редактировании: Один очевидный способ - вызвать соответствующие методы 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) также не имеет никакого эффекта.

5
задан Marek Jedliński 18 January 2011 в 18:14
поделиться