Delphi: Cómo asignar un atajo de teclado Flecha arriba para Acción / Menultem, y Keep It Real para navegar por la lista de control (ListBox / VTV)?
Pregunta
Por favor, que me ayude:? Cómo asignar una combinación de teclas de flecha hacia arriba a la acción o elemento de menú, y mantenerlo real para navegar por la lista de control (por ejemplo ListBox / Vista de árbol virtual / otros), al mismo tiempo
Gracias!
Solución
comentario:
Y que tal el reproductor Winamp? Tiene Subir volumen / bajar volumen funciones asignadas a la tecla de flecha hacia arriba y hacia abajo tecla de flecha correspondiente .. Está bien, si eso imposible en Delphi, entonces ...
pero ciertamente es posible, simplemente no es una buena idea para hacerlo, y en contra de las directrices de la experiencia del usuario de Windows de interacción.
Pero si ya está listo en su aplicación, aquí es cómo. Reemplazar el método siguiente en su clase de formulario que contiene los componentes de la acción:
function IsShortCut(var Message: TWMKey): Boolean; override;
y en ella se puede prevenir la tecla Arriba y abajo de la activación de las acciones que sirven de acceso directo para:
function TWeirdForm.IsShortCut(var Message: TWMKey): Boolean;
begin
if (Message.CharCode in [VK_UP, VK_DOWN])
// insert test whether message needs to go to the focused control instead
and (...)
then begin
// insert calls to code that should be executed instead
Result := False;
exit;
end;
inherited;
end;
Tenga en cuenta que debe hacer la prueba para el estado de cambio correcto también, y comprobar que el código no se rompe cualquier otro usuario de comportamiento de las ventanas esperan, como la mudanza de la ventana con las teclas de flecha.
Otros consejos
En las propiedades de conjunto de formularios KeyPreview := true
A continuación, el evento KeyUp del evento de formulario de escritura para comprobar si está presionada, la tecla Arriba y hacer que se llama el elemento de menú (en este elemento de menú caso llamado Acción1):
procedure TForm1.FormKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if (Key = VK_UP) and (ActiveControl = ListBox1)then
Action11.Click;
end;
procedure TForm1.Action11Click(Sender: TObject);
begin
if ListBox1.ItemIndex >=0 then
ShowMessage(ListBox1.Items[ListBox1.ItemIndex]);
end;
Si necesita el Acción1 que se ejecutará aunque de control actual no es el cuadro de lista, retirar la parte de la declaración and
IF