PDA

Ver la Versión Completa : Lanzar evento Keydown sin apretar la tecla (no, no es telekinesis)


papulo
21-09-2005, 10:14:16
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)

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:


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


para simular la tecla puedes usar PostMessage:


// 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:


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:

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
//Aqui la instruccion que me falta, que lance el evento que se inicia al apretar F5.

En esa línea coloca ésta:


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.