Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Lanzar evento Keydown sin apretar la tecla (no, no es telekinesis) (https://www.clubdelphi.com/foros/showthread.php?t=25377)

papulo 21-09-2005 10:14:16

Lanzar evento Keydown sin apretar la tecla (no, no es telekinesis)
 
Quiero ver como puedo hacerlo, para lanzar lo que seria un evento de OnKeyDown, ya definido en otra parte del codigo, desde otra funcion.

Algo asi como: (Y ante todos ustedes, mi primer esquema de DELPHI)
Código Delphi [-]
  procedure TForm1.cLenguajes.OnChange;
  begin
   Showmessage('Pero que pacha, trooooooon!!!'); //Lo que sea que haga antes
 sLang := cLenguajes.Text; //Modifico la variable de turno
   VK_F5; //Aqui quiero que refresque la pantalla y las operaciones calculada, que equivale a presionar F5
  end;

¿Me he explicado?

epuigdef 21-09-2005 11:02:12

En lugar de "tocar" tenas de eventos, te recomiendo lo siguiente:


Pasa el código que ejecutas cuando pulsas el F5 a un procedimiento aparte
En el onkeydown, si pulsan F5 llamas a este procedimiento
Y en la función que comentas, pues también llamas a este procedimiento

Espero que te sirva.

Edu

papulo 21-09-2005 11:18:04

No me interesa lanzar procesos a parte para presionar las teclas, ya lo tengo todo muy claro y limpio, como para hacer procesos a parte.

¿Tan complicado es decirle al programa "Haz como si pulsara F5, chavalote" y dejar que haga lo que le toca?

De todas formas, gracias por la respuesta, siempre es un detalle que la gente responda tan rapido.

Neftali [Germán.Estévez] 21-09-2005 11:34:35

Si en tu evento tienes algo "parecido" a esto:

Código Delphi [-]
   if (key = vk_F5) then begin
     MessageDlg('keyDown F5', mtWarning, [mbOK], 0);
   end;

para simular la tecla puedes usar PostMessage:

Código Delphi [-]
   // Debes enviarlo a un control, form,...  (en éste caso sería a un Memo)
   PostMessage(Memo1.Handle, WM_SYSKEYDOWN, VK_F5, 0);

papulo 21-09-2005 12:27:51

Mi evento apretando F5 es exactamente este:

Código Delphi [-]
 procedure TFiller.FormKeyDown(Sender: TObject; var Key: Word;
   Shift: TShiftState);
 begin
 case Key of
 VK_F5 : case iStatus of
             0 : exit;
             else
             wKeyPress:= VK_F5;
             Lanzar_Consulta;
         end;
 VK_ESCAPE : case iStatus of
 ...
El otro evento que tendria que lanzar una orden como si apretara F5 seria este:
Código Delphi [-]
 procedure TFiller.cIdiomaChange(Sender: TObject);
 begin
 cLang.ItemIndex := cIdioma.ItemIndex;
 sLang := cLang.Text;
 //Aqui la instruccion que me falta, que lance el evento que se inicia al apretar F5.
 end;

Dicho queda.

Sobre lo que tu me dices, aun me suena a chino, soy un pez aun.

epuigdef 21-09-2005 12:29:05

Cuestión de gustos. A mi me parece incluso más limpio con un simple procedimiento que creando mensajes de teclado, pero bueno, funciona de las dos formas!

Un saludo

Edu

Neftali [Germán.Estévez] 21-09-2005 12:58:13

Cita:

Empezado por papulo
//Aqui la instruccion que me falta, que lance el evento que se inicia al apretar F5.

En esa línea coloca ésta:

Código Delphi [-]
      PostMessage(Self.Handle, WM_SYSKEYDOWN, VK_F5, 0);

papulo 21-09-2005 13:01:02

CopyPasteado. ¿Me puedes explicar que es lo que he hecho? Retengo mejor las cosas cuando las entiendo.

Gracias.

Neftali [Germán.Estévez] 21-09-2005 13:39:57

Resumiendo mucho, lo que has hecho es utilizar la función de la API PostMessage para enviar un mensaje a un control (en éste caso el form).

-------------------------------------------------------------------------------
API HELP:
The PostMessage function places (posts) a message in the message queue associated with the thread that created the specified window and then returns without waiting for the thread to process the message.
-------------------------------------------------------------------------------

Cuando se presiona una tecla, internamente se gestiona utilizando diferentes mensajes. En éste caso, cuando pulsas una tecla (Down) se utiliza el mensaje WM_SYSKEYDOWN que le llega al formulario con el valor -en este caso- VK_F5 (que es la constante que define el F5).

La API anteriormente citada sirve para añadir un nuevo mensaje a la cola de mensajes y lo que has hecho es algo así como: "Añadir a la cola un nuevo mensaje para el Formulario -Self.Handle-, del tipo WM_SYSKEYDOWN y con el valor VK_F5".

papulo 22-09-2005 11:17:07

Me va a las 1000 maravillas. Gracias miles, de verdad, de la buena.


La franja horaria es GMT +2. Ahora son las 02:58:43.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi