Delphi - Combinacion de Teclas

 
Vista:

Combinacion de Teclas

Publicado por Luck Ibarra (78 intervenciones) el 20/03/2002 20:17:59
Mi pregunta es la siguiente quiero por decir que en mi aplicacion al presionar no se..... mmmmmm CTRL + F2 me aparesca otro form como hago para detectar esa convinacion de teclas??

Gracias..
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Combinacion de Teclas

Publicado por joselito (177 intervenciones) el 21/03/2002 08:16:24
Utiliza este procedimiento.... En vez de VK_f5, pon, como dices tu...mmmmmm......F2, y en vez de VK_Control, pon ...... mmmmmm.... VK_Alt, que creo que es la suya....
Importante, pon en el Form1.KeyPreview := True; ¿ok? ... Avisame si te funciona. Salu2.


1
2
3
4
5
6
7
8
9
procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if ( (GetKeyState(VK_CONTROL) and 128)=128 ) and
     ( (GetKeyState(VK_F5)      and 128)=128 ) and
     ( (GetKeyState(ord('8'))   and 128)=128 )
    then
      ShowMessage('CTRL+F5+8 Pulsado');
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Combinacion de Teclas

Publicado por Alejandro (3 intervenciones) el 24/05/2020 18:29:24
Hola a todos!!
Ese código no me funciona. Lo he probado de todas las maneras posibles. Aquí te paso mi pedazo de churre :D para que lo veas:

1
2
3
4
5
6
7
8
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
 if ( (GetKeyState(VK_CONTROL) and 128)=128 ) and
      ( (GetKeyState(111111) and 128)=128 )
 then
    ShowMessage('CTRL+1*6 Pulsado');
end;

Yo tengo en mi Form: 4 ComboBox y 2 RadioGroup con 3, 5, 8, 9, 2 y 3 Items respectivamente. Lo que quiero lograr es que si el usuario pulsa, digamos: CTRL + 1 + 4 + 8 + 3 + 5 + 1 se activen los Items 1, 4, 8, 3, 5 y 1 en esos componentes... llevo días peleando con esto y sólo me encuentro con puros ejemplos de "todas las teclas a la vez" que no es mi caso sino que es: DEJAS PRESIONADO CTRL y pulsas una cadena de 6 números... y entonces ocurre algo.

Así que aquí estoy yo, desde Panamá, 18 años después en medio del coronavirus... pidiendo ayuda digital... Vaya pedazo de chiste!!!! LOL
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Combinacion de Teclas

Publicado por Nacho (19 intervenciones) el 24/05/2020 20:51:31
Lo que quieres es interceptar la pulsación de una tecla, mensaje WM_KEYDOWN, y eso lo hace el evento FormKeyDown. Si está pulsada una tecla control, alt o la que sea te lo da el TShiftState.

Fíjate lo que se apaña.
The TShiftState type is used by key-event and mouse-event handlers to determine the state of the Alt, Ctrl, and Shift keys and the state of the mouse buttons when the event occurs. It is a set of flags that indicate the following:
Value

Meaning
ssShift The Shift key is held down.
ssAlt The Alt key is held down.
ssCtrl The Ctrl key is held down.
ssLeft The left mouse button is held down.
ssRight The right mouse button is held down.
ssMiddle The middle mouse button is held down.
ssDouble The mouse was double-clicked.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Combinacion de Teclas

Publicado por Alejandro (3 intervenciones) el 24/05/2020 21:18:54
Si amigo, pero cuando ejecuto ese código lo que ocurre es que el programa va a estar pendiente de que todas las teclas se ejecuten a la misma vez. Mi caso es ligeramente diferente...

Yo lo que necesito hacer es lo siguiente:

CTRL (pulsada permanentemente)

+ 1 (El ComboBox1.ItemIndex := 0)
+ 3 (El ComboBox2.ItemIndex := 2)
+ 6 (El ComboBox3.ItemIndex := 5)
+ 9 (El RadioGroup1.ItemIndex := 8)
+ 2 (El RadioGroup2.ItemIndex := 1)
+ 2 (El ComboBox4.ItemIndex := 1)

Y entonces suelto libero la tecla CTRL.

Es que esta es una aplicación que genera un texto en un Memo que se va formando según las opciones presentes en esos componentes y quiero optimizarlo para poder "teclear" el código de estas opciones. Esa manera de "teclear" un ShortCut no lo he logrado hacer todavía. Lo del CTRL+F5+V (pulsadas a la vez como el Copiar y Pegar de Windows, por ejemplo) lo tengo ganado ya... pero no es eso lo que necesito... no sé si me logro hacer entender.

PD: Yo no soy programador. Empecé a programar como hobby desde el año 1997 cuando conocí el Turbo Pascal. Eso significa que sólo programo esporádicamente cuando necesito hacerme una herramienta para mi trabajo (porque soy muy vago como para escribir lo mismo una y otra vez :D )

Gracias por tu respuesta.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Combinacion de Teclas

Publicado por Nacho (19 intervenciones) el 24/05/2020 21:27:41
Ya sé lo que quieres hacer. Lo que quieres hacer se hace con lo que te he dicho. No estés pensando en si te entiendo yo a ti y piensa en si me entiendes tú a mí. Yo sí soy programador, y no programo esporádicamente, más bien estoy harto ya de programar, y eso que quieres hacer lo tengo funcionando en un programa desde hace casi 25 años, así que si quieres voy a decirle de tu parte a los que siguen usándolo que eso no funciona.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Combinacion de Teclas

Publicado por Alejandro (3 intervenciones) el 24/05/2020 21:38:25
Tienes toda la razón... soy yo el que no estoy entendiendo.

Este es el código que estoy usando como prueba:

1
2
3
4
5
6
7
8
9
procedure TForm2.ComboBox1KeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if ( (GetKeyState(VK_CONTROL) and 128)=128 ) and
     ( (GetKeyState(ord('8'))   and 128)=128 ) and
     ( (GetKeyState(ord('8'))   and 128)=128 )
    then
      ShowMessage('CTRL+8+8 Pulsado');
end;

Lo tengo puesto en el evento OnKeyDown de un ComboBox porque es que el foco del programa sólo está en estos componentes que estoy usando. Ahora bien, te describo el resultado de esto: El ShowMessage se ejecuta inmediatamente después de pulsar CTRL+8. Ni tan siquiera espera a llegar al segundo 8. ¿Qué estoy omitiendo?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Combinacion de Teclas

Publicado por Nacho (19 intervenciones) el 24/05/2020 22:47:47
Estás omitiendo todo.

GetKeyState es una función del windows que devuelve un short con el bit de más peso a uno si está pulsada la tecla que le pases como parámetro, así que si quieres comprobar ese bit tendrás que hacer un and 32768.

GeyKeyState se usa para comprobar si una tecla está pulsada en un código fuera de un evento keydown. Dentro no hace ninguna falta, pues no va a decirte nada que no te den los parámetros del delegado.

Si quieres comprobar pulsación de teclas usa en delegado keydown del form, no de componentes.

El OnKeyDown pasa como parámetros Key, con la tecla pulsada y un TShiftState, que es un conjunto con las teclas especiales que estén pulsadas.

Así que lo que quieres hacer es tan sencillo como
1
2
3
4
5
6
if (ssCtrl in Shift) then
case Key of
49:
50:
51:
.......
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Combinacion de Teclas

Publicado por Pei (1 intervención) el 31/08/2020 12:45:10
En definitiva, y siguiendo las instrucciones de Nacho, creo que lo que Alejandro necesitaba era mas o menos esto:

1
2
3
4
5
6
7
8
9
10
11
12
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (ssCtrl in Shift) then begin     //Tecla Control pulsada
    case key of
      49: ComboBox1.ItemIndex := 1;      //49: código de la tecla 1
      50: ComboBox1.ItemIndex := 2;      //50: código de la tecla 2
      //  ....
    else
      ComboBox1.ItemIndex := -1;         // Cntrl+Tecla no prevista: Ningun item seleccionado
    end;
  end;
end;

Gracias Nacho, no se si le sirvió a Alejandro, pero a mi sí
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Combinacion de Teclas

Publicado por Nacho (19 intervenciones) el 01/09/2020 10:12:03
Y se puede optimizar.
1
2
3
4
5
6
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
  if (ssCtrl in Shift) then     //Tecla Control pulsada
    if Key > 48 and Key < ComboBox1.Items.Count then  ComboBox1.ItemIndex := Key-48;
    else  ComboBox1.ItemIndex := -1;         // Cntrl+Tecla no prevista: Ningun item seleccionado
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar