2008-10-01 12 views
7

¿Cuál es la forma correcta de implementar el comportamiento "encontrar según escribe" en un componente descendiente de TComboBox cuyo estilo es csOwnerDrawFixed?Cómo implementarlo mientras escribe en un descendiente de TComboBox

+0

Depende, ¿solo desea implementar la parte "buscar mientras escribe", sin mostrar cualquier retroalimentación al usuario (por ejemplo, la forma en que Firefox lo hace en las listas largas), o ¿desea mostrar un pequeño subcontrol que muestre la cadena de búsqueda actual? – dguaraglia

Respuesta

1
  1. Utilice un TTimer (vamos a llamarlo timIncSearch). Establezca (en tiempo de diseño) las siguientes propiedades: Habilitado: = False;
    Intervalo: = 400; // encontrado empíricamente - es la demora utilizada en Windows Explorer

... y en OnTimer escribirá su motor de búsqueda. Asegúrese de que la primera línea aquí sea timIncSearch.Enabled: = False; Además, debido a que usa csOwnerDrawFixed, tal vez sea mejor aplicar un repintado de su control.

Como un lado, - simplemente adivinando porque no nos dio muchos detalles - quizás debe enganchar los eventos OnEnter y OnExit para abrir y cerrar la lista DropDown. (Normaly, esto se logra mediante el establecimiento de la propiedad AutoDropDown en consecuencia)

  1. En su ComboBox.KeyPress que voy a escribir

with timIncSearch do
begin
Enabled:=False;
Enabled:=True;
end;

... también tenga cuidado aquí, tal vez debe tener una construcción 'clave de caso' para manejar el número 13 por separado (o lo que sea).

Otros consejos:

  • dependiendo de su situación, tal vez, deberá conectar (también?) La OnKeyDown (si desea procesar las teclas especiales como por ejemplo Retroceso, Del, flechas, etc. - teniendo. teniendo en cuenta que el evento se repite mientras la tecla está presionada) y/o OnKeyUp (si desea hacer un procesamiento similar al anterior pero sin teniendo en cuenta la función de repetición automática de tecla del teclado).
0

Primero debe decidir si necesita la funcionalidad "* my_string *" o "my_string *", es decir, si debe buscar dentro de las cadenas o solo desde el principio. Cuando se haya dado cuenta de eso, tendrá que agregar el índice de todas las palabras ingresadas en el cuadro combinado y buscarlo después de cada pulsación de tecla. No creo que manejar OnTimer sea un enfoque correcto. Prefiero usar "OnChange" o similar. Puede hacerlo con TStringList ordenado (dupignore), o quizás construir el índice usando tablas hash (la implementación depende de usted). La arquitectura depende del número máximo de cadenas que su combo podría contener. Si es un número significativo de lo que podría usar tablas hash (un hash Cardinal apuntando a múltiples índices: array, TList ...)

Cuestiones relacionadas