En Delphi XE, intento implementar una función de "búsqueda instantánea", que se asemeja algo a la "búsqueda mientras escribe" de Firefox, pero se ilustra mejor mediante una función similar en un extensor de código abierto portapapeles, Ditto:Reenvío de eventos de teclado de un control de Windows a otro
Hay una lista de elementos que maneja los eventos de navegación típicos. Sin embargo, todas las teclas alfanuméricas, así como los comandos de navegación y edición (flechas derecha/izquierda, desplazamiento + flechas, retroceso, eliminación, etc.) deben redirigirse al cuadro de edición debajo de la lista. Un evento OnChange del cuadro de edición activará una actualización de la lista.
El objetivo de la IU es que el usuario no tenga que tabular o desplazar la pestaña entre los controles. Los dos controles (la lista y el cuadro de edición) deberían 'sentirse' como si fueran un solo control. El comportamiento de la interfaz de usuario de búsqueda debe no depender de qué control tenga foco
Parece mi mejor opción es hacia adelante ciertos eventos de teclado de la lista de control (estoy usando TcxTreeList) al cuadro de edición, y remitirá un puñado de teclas de navegación desde el cuadro de edición de la lista. ¿Cómo puedo lograr eso?
Notas:
TcxTreeList admite la búsqueda incremental, por supuesto, pero esto no es lo que estoy buscando. La búsqueda va a una base de datos SQLite y busca coincidencias de subcadenas. La lista muestra solo los elementos coincidentes de db.
Existe cierta superposición, p. ambos controles manejarían normalmente VK_HOME y VK_END, pero eso está bien, en este caso las claves irían a la lista. Tendré que decidir si reenviaré cada pulsación de tecla individual o la manejaré en el control que la recibió.
En Editar: Una manera obvia parecía ser para invocar a los respectivos métodos KeyDown, KeyUp y KeyPress del control de edición, así:
type
THackEdit = class(TEdit);
procedure TMainForm.cxTreeList1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
THackEdit(edit1).KeyDown(Key, Shift);
end;
Desafortunadamente, esto no tiene ningún efecto . Supongo que TEdit no procesará eventos clave a menos que esté enfocado. El uso de SendMessage (THackEdit (edit1) .Handle, WM_KEYDOWN, Key, 0) tampoco tiene ningún efecto.
Extraño, pero usar el método Perform de un TEdit todavía no tiene ningún efecto, al igual que el ejemplo SendMessage en mi OP. Incluso intentar algo simple como siempre enviar una tecla de retroceso (donde el control de edición tiene texto y la posición de intercalación es> 0) no hace nada: edit1.Perform (WM_KEYDOWN, 8, 0); –
@mood - Pruebe 'edit1.Perform (WM_CHAR, VK_BACK, 0);' para el retroceso. Es por eso que se incluyeron los mensajes WM_CHAR, WM_KEYDOWN, WM_KEYUP en el proyecto de muestra. –