Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   capturar ESC+F4 (https://www.clubdelphi.com/foros/showthread.php?t=46930)

Lonidas 14-08-2007 05:06:12

capturar ESC+F4
 
Hola, estoy queriendo capturar las teclas Esc+F4 osea que al presionarlas juntas realice una acción, he buscado en el foro y encontré varios hilos interesantes pero ninguno me ayuda con mi problema, hay soluciones para cuando uno quiere presionar dos teclas con alt,shift,ctrl…. Pero no con Escape.
Si detecto las teclas por separado no hay problema en el Onkeydown funciona perfecto pero al querer capturar ambas no hay caso.
He probado asi

Código Delphi [-]
if (key=vk_escape) and (key=vk_f4) then
{lo que quiera hacer}




Lo probé en el Onkeydown, Onkeypress, Onkeyup y nada esto lo estoy probando en un Dbgrid y en un Dbedit, y de tanto probar y ver en los hilos relacionados en el foro me encontré con otro problema el mendigo Escape funciona como cancelación de acción, ósea que si estoy en el dbedit y doy escape me borra lo que escribí osea que cuando lo quiero capturar primero me borra el contenido y luego ejecuta mi código, de igual manera en el dbgrid, me cancela toda la fila con valores que había cargado.
En síntesis primero creo que debo solucionar el tema de que hay algo que captura el Escape antes que el Onkeypress y ahí estoy perdido porque no sabría que seria.
Si me pudiesen dar una mano les agradecería…
Como datos extras les digo que el form tiene la propiedad keypreview=false para que el from no trate de capturar las teclas, todos los botones que posee el formulario tienen la
propiedad default=false para que no ejecuten ninguna acción al enter o al escape como he leido en otro hilos

No escribo los otro codigo que encontre en los hilos porque ya se hace muy larga mi explicación…:p

Lonidas 14-08-2007 05:13:40

yo de nuevo
 
me pasaron este codigo y solucione lo del esc+f4

if (HiWord(GetKeyState(VK_escape)) <> 0)and(HiWord(GetKeyState(VK_f4)) <> 0) then

:)
pero aun no puedo solucionar lo de evitar la accion del escape osea que no me cancele o borre nada:o

marcoszorrilla 14-08-2007 12:46:40

Como has encontrado la solución, lo que procede es dejarlo, no borrarlo, así otros usuarios tendrán acceso a esa solución.

Un Saludo.

ArdiIIa 14-08-2007 13:07:55

A ver si esto te resulta útil:


Código Delphi [-]
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, AppEvnts;

type
  TForm1 = class(TForm)
    ApplicationEvents1: TApplicationEvents;
    procedure ApplicationEvents1Message(var Msg: tagMSG;
      var Handled: Boolean);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  lEscape : Boolean;

implementation

{$R *.dfm}

procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;  var Handled: Boolean);
begin

 Handled := False;
      if  (Msg.Message = WM_KEYDOWN) then
      BEGIN
        if Msg.wParam = VK_ESCAPE then
            Begin
            lEscape := True;
            Handled := True ;
            Exit;
            End;
        if (Msg.wParam = VK_F4 ) And lEscape then
            Begin
            lEscape := False;
            Handled := True ;
            ShowMessage('Se ha pulsado la combinación correcta');
            End;
      END;



end;

end.


Código:

object Form1: TForm1
  Left = 359
  Top = 278
  Width = 299
  Height = 190
  Caption = 'Demostración de pulsacion de teclas'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object ApplicationEvents1: TApplicationEvents
    OnMessage = ApplicationEvents1Message
    Left = 96
    Top = 48
  end
end


Lonidas 14-08-2007 17:50:28

interesante aporte Ardilla lo voy a probar:)

ArdiIIa 14-08-2007 18:19:45

Date cuenta, que el procedimiento en sí, no comprueba que ambas estén pulsadas, sino que comprueba que la secuencia sea precisamente esa.

Se puede optimizar un poco para comprobar que a sido correcta la secuencia. Es decir, tal cual está, se puede pulsar ESC, A y F4 y saltaría, por lo que cambiando el estado de la variable en el caso de que no sea esa la secuencia, se vuelve a "iniciar" la variable.

Código Delphi [-]
      if  (Msg.Message = WM_KEYDOWN) then
      BEGIN
        if Msg.wParam = VK_ESCAPE then
            Begin
            lEscape := True;
            Handled := True ;
            Exit;
            End;
        if (Msg.wParam = VK_F4 ) And lEscape then
            Begin
            lEscape := False;
            Handled := True ;
            ShowMessage('Se ha pulsado la combinación correcta');
            End;
            lEscape := False;
      END;


También se podría comprobar la secuencia distinta por ejemplo F4-ESC, solamente hay que jugar con las variables........


La franja horaria es GMT +2. Ahora son las 13:22:57.

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