В Delphi XE я пытаюсь реализовать функцию «мгновенного поиска», которая несколько напоминает Firefox «поиск по мере ввода», но лучше иллюстрируется аналогичной функцией в расширителе буфера обмена с открытым исходным кодом, То же
Существует список элементов, которые обрабатывают типичные события навигации. Однако любые буквенно-цифровые клавиши, а также команды навигации и редактирования (стрелки вправо / влево, стрелки Shift + Backspace, Delete и т. Д.) Должны быть перенаправлены в поле редактирования под списком. Событие OnChange поля редактирования вызовет обновление списка.
Смысл интерфейса состоит в том, что пользователю не нужно вкладывать или сдвигать вкладку между элементами управления. Два элемента управления (список и поле редактирования) должны «ощущаться», как если бы они были единым элементом управления. Поведение интерфейса поиска должно , а не зависеть от того, какой элемент управления имеет фокус.
Похоже, мой лучший вариант - переслать определенные события клавиатуры из элемента управления списком (я использую TcxTreeList ) в поле редактирования и переслать несколько клавиш навигации из поле для редактирования списка. Как мне этого добиться?
Примечания:
TcxTreeList, конечно, поддерживает пошаговый поиск, но это не то, что мне нужно. Поиск идет по базе данных SQLite и ищет совпадения подстрок. В списке отображаются только соответствующие элементы из базы данных.
Есть некоторые совпадения, например оба элемента управления обычно обрабатывают 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) также не имеет никакого эффекта.