Jak złapać ESC?

Odpowiedz Nowy wątek
2011-07-22 13:34
0

Jak sprawdzić czy został wciśnięty ESC??
Nie chodzi o Hooka, tylko zwczajnie na formie, żeby było jak najprościej.


char mander; bool basaur;
edytowany 1x, ostatnio: TomRiddle, 2011-07-22 13:35

Pozostało 580 znaków

2011-07-22 13:42
0

Może bez rozpisywania się podam od razu przykłąd:

procedure TForm1.FormKeyPress
   (Sender: TObject; var Key: Char) ;
begin
   if key = #27 then Close;
end;

Pozostało 580 znaków

2011-07-22 15:41
2
Gregory_Scot napisał(a)

Może bez rozpisywania się podam od razu przykłąd:

procedure TForm1.FormKeyPress
(Sender: TObject; var Key: Char) ;
begin
if key = #27 then Close;
end;

Nie wspomniałeś jeszcze o ustawieniu właściwości formy "KeyPreview" na true. Bez tego forma główna nie przechwyci wciśniętego klawisza Escape gdy na formie będzie co najmniej jedna kontrolka ("focus-owalna"), do której zostanie przekazany kod wciśniętego klawisza.

edytowany 1x, ostatnio: marogo, 2011-07-22 15:43
O, nie wiedziałem o tym.. dzięki. - TomRiddle 2011-07-23 20:49

Pozostało 580 znaków

2011-07-24 09:44
0

Albo taka metoda:

 
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;
 
type
  TForm1 = class(TForm)
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
    procedure OczekiwanieNaKlawisz(Sender: TObject; var Done: Boolean);  //Wymagany format procedury dla OnIdle
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.DFM}
 
{ TForm1 }
 
procedure TForm1.OczekiwanieNaKlawisz(Sender: TObject; var Done: Boolean);
begin
     //Ta funkcja wykonywana jest cyklicznie przez applikacje
     //Tu sprawdzamy klawisz PrintScreen! Jeśli go wcisnieto to Beeep!!!
     if GetAsyncKeyState(VK_SNAPSHOT) <> 0 then
          Windows.Beep(2000,50);
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
     //Podstawiamy procedure do cyklicznej petli obslugi stanu spoczynkowego applikacji!
     Application.OnIdle:=OczekiwanieNaKlawisz;
end;
 
end.
 

Pozostało 580 znaków

2011-07-24 10:25

odbieranie klawisza "Esc" poprzez FormKeyPress ma kilka znaczących wad
tu zamieszczam skuteczniejsze rozwiązanie

 
unit Unit1;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;
 
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
     procedure Komunikaty(var Msg: TMSG; var HAndled: Boolean);
  end;
 
var
  Form1: TForm1;
 
implementation
 
{$R *.dfm}
 
procedure TForm1.Komunikaty(var Msg: TMSG; var HAndled: Boolean);
begin
     Handled := False;
     case Msg.Message of
 
          //Komunikat otrzymywany tylko gdy nasze okno jest aktywne!!!
          WM_KEYDOWN:         begin
                                   if Msg.wParam = VK_ESCAPE  then    //Klawisz ESC
                                   begin
                                        Windows.Beep(300,300);
                                        Application.Minimize;
                                   end;
                              end;
 
          //Sprawdzamy czy komunikat dotyczy klawiszy Alt+F4
          WM_SYSKEYDOWN:      begin
                                   if Msg.wParam = VK_F4 then
                                   begin
                                         Handled := True; // brak reakcji na klawisze ALT-F4
                                   end;
                              end;
 
          //Sprawdzamy np. czy  komunikat dotyczy kółka myszki.
          WM_MOUSEWHEEL:      begin
                                   Handled := True; //Komunikat nie jest przekazywany dalej
                              end;
 
     end;
 
end;
 
procedure TForm1.FormCreate(Sender: TObject);
begin
     //Przypisujemy procedure odbierającą komunikaty
     Application.OnMessage:=Komunikaty;
end;
 
end.
 
Czy jeżeli jakiś TButton będzie zaznaczony, i tak to zadziała? - TomRiddle 2011-07-24 10:55
To działa niezależnie od kontrolek okna - tester_68k 2011-07-24 12:24
a z ciekawosci - jakie wady masz na mysli? - misiakufal 2011-07-24 13:34
Małe pytanie: Po co własnoręcznie obsługiwać komunikaty? Bierzesz na formie KeyPreview i już działa niezależnie od aktualnie zaznaczonego czegoś. Ale w końcu lepiej (?) jest zrobić własną pętlę komunikatów! - payl 2011-07-24 17:32
Co do wad... proponuje jako przykładzik jeden form kilka wątków wprowadzających zmiany np. w napisach na button'ach i nagle okazuje się ,że pomimo metody Synchronize coś się traci w FormKeyPress - tester_68k 2011-07-25 18:09

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0