Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.09.2010, 10:10
boobonick boobonick вне форума
Прохожий
 
Регистрация: 24.09.2010
Сообщения: 29
Репутация: 10
По умолчанию Прерывание программы по ESC

Здравствуйте, помогите, пожалуйста, разобраться, как мне сделать так, чтобы при нажатии кнопки ESC программа останавливалась? Вот код:
Цитата:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin
if key =#27 then
begin

key_esc:=1;


end;

end;

procedure TForm1.Button1Click(Sender: TObject);
begin
while(key_esc=0) do
begin
sleep(3000);
SetCursorPos(pt.x * 0 + i, pt.y * 0 +j );
i:=i+10;
end;

Последний раз редактировалось boobonick, 26.09.2010 в 10:13.
Ответить с цитированием
  #2  
Старый 26.09.2010, 10:23
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Application.ProcessMessages;
Ответить с цитированием
  #3  
Старый 27.09.2010, 12:10
boobonick boobonick вне форума
Прохожий
 
Регистрация: 24.09.2010
Сообщения: 29
Репутация: 10
По умолчанию

Спасибо огромное!
Ответить с цитированием
  #4  
Старый 27.09.2010, 15:43
Asinkrit Asinkrit вне форума
Местный
 
Регистрация: 29.10.2009
Сообщения: 446
Репутация: 271
По умолчанию

Вместо Sleep лучше использовать следующий механизм., не будет подвисаний.
Код:
procedure _Delay(dwMilliseconds: Longint);
 var
   iStart, iStop: DWORD;
 begin
   iStart := GetTickCount;
   repeat
     iStop := GetTickCount;
     Application.ProcessMessages;
   until (iStop - iStart) >= DWORD(dwMilliseconds);
end;
Ответить с цитированием
  #5  
Старый 27.09.2010, 16:14
einstein einstein вне форума
Начинающий
 
Регистрация: 02.09.2010
Адрес: Город
Сообщения: 143
Репутация: -4653
По умолчанию

загрузка процессора на 100% будет выглядеть не красиво
Ответить с цитированием
  #6  
Старый 05.10.2010, 10:41
boobonick boobonick вне форума
Прохожий
 
Регистрация: 24.09.2010
Сообщения: 29
Репутация: 10
По умолчанию

Не получается у меня, с Application.ProcessMessages; - это осуществимо вообще или лучше здесь потоки использовать? По коду у меня получается, что крутится бесконечный цикл, который должен прерваться при нажатии кнопки Esc.
Ответить с цитированием
  #7  
Старый 05.10.2010, 10:55
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Button1: TButton;
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

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

procedure TForm1.Button1Click(Sender: TObject);
begin
  while Tag=0 do
  begin
    Label1.Caption:=IntToStr(Label1.Tag);
    Label1.Tag:=Label1.Tag+1;
    Application.ProcessMessages;
  end;
  Close;
end;

end.
http://data.cod.ru/70222
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #8  
Старый 05.10.2010, 11:34
boobonick boobonick вне форума
Прохожий
 
Регистрация: 24.09.2010
Сообщения: 29
Репутация: 10
По умолчанию

Спасибо за ответы, долго ломал голову, приду домой и обязательно загоню)

Последний раз редактировалось boobonick, 05.10.2010 в 12:27.
Ответить с цитированием
  #9  
Старый 05.10.2010, 20:25
boobonick boobonick вне форума
Прохожий
 
Регистрация: 24.09.2010
Сообщения: 29
Репутация: 10
По умолчанию

Если я делаю так, то Esc не срабатывает :

PHP код:
var
  
Form1TForm1;
  
Tagchar;
  
i,j:integer;
  
ptTpoint;
implementation

{$R *.dfm}

procedure TForm1.FormKeyPress(SenderTObject; var KeyChar);
begin

if Key=#27 then Tag:=1;

end;

procedure TForm1.Button1Click(SenderTObject);
begin

  
while Tag do

  
begin

   sleep
(3000);

   
SetCursorPos(pt.ipt.+);
   
Mouse_event(MouseEventf_LeftDown,480,200,0,0); 
   
Mouse_event(MouseEventf_LeftUp,480,200,0,0);

   
i:=i+10;
   
Application.ProcessMessages;

  
end;

  
Close;


end;

end


Но стоит убрать
PHP код:
Mouse_event(MouseEventf_LeftDown,480,200,0,0); 
   
Mouse_event(MouseEventf_LeftUp,480,200,0,0); 


И кнопка срабатывает. Как я понимаю это связано с функцией, но как это исправить не понимаю, разъясните, если возможно, пожалуйста

Последний раз редактировалось boobonick, 05.10.2010 в 21:24.
Ответить с цитированием
  #10  
Старый 05.10.2010, 21:35
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Все правильно, и все работает, только поставь у формы (или в design time или в run time) свойство KeyPreview := True;

Это означает, что все события клавы сначала обрабатывает форма, а уж потом все остальные компоненты...
__________________
Помогаю за Спасибо
Ответить с цитированием
  #11  
Старый 05.10.2010, 21:58
boobonick boobonick вне форума
Прохожий
 
Регистрация: 24.09.2010
Сообщения: 29
Репутация: 10
По умолчанию

Так у меня KeyPreview := True;, но вот курсор перемещается, но Escape не срабатывает почему-то и программа не останавливается
Ответить с цитированием
  #12  
Старый 05.10.2010, 22:10
Аватар для v1s2222
v1s2222 v1s2222 вне форума
Продвинутый
 
Регистрация: 07.09.2010
Сообщения: 726
Репутация: 26711
По умолчанию

Код:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin

if Key=#27 then Tag:=1;

end;

...
button1click...
begin
  while(tag=0) do begin// перемещаю курсор
  Sleep(3000); // ВНИМАНИЕ! если ты ставишь слип на 3 сек, то даже если человек нажмет esc, то выход произойдет через 3секунды...
  ...

  end;
 ....
__________________
Помогаю за Спасибо
Ответить с цитированием
  #13  
Старый 06.10.2010, 02:27
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,026
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

а что, Actions уже отменили?
создешь Action, ставишь ему горячую клавишу Esc и вперед.
Ответить с цитированием
  #14  
Старый 06.10.2010, 09:10
boobonick boobonick вне форума
Прохожий
 
Регистрация: 24.09.2010
Сообщения: 29
Репутация: 10
По умолчанию

Цитата:
Сообщение от v1s2222
Код:
procedure TForm1.FormKeyPress(Sender: TObject; var Key: Char);
begin

if Key=#27 then Tag:=1;

end;

...
button1click...
begin
  while(tag=0) do begin// перемещаю курсор
  Sleep(3000); // ВНИМАНИЕ! если ты ставишь слип на 3 сек, то даже если человек нажмет esc, то выход произойдет через 3секунды...
  ...

  end;
 ....


Правильно, все-таки, будет исходник скинуть, когда домой приду, т.к. дело не в sleep. Я вот думаю (как дилетант), а может она в функциях зацикливается:

Mouse_event(MouseEventf_LeftDown,480,200,0,0);
Mouse_event(MouseEventf_LeftUp,480,200,0,0);
Ответить с цитированием
  #15  
Старый 06.10.2010, 20:18
boobonick boobonick вне форума
Прохожий
 
Регистрация: 24.09.2010
Сообщения: 29
Репутация: 10
По умолчанию

Вот, если есть возможность, подсобите, пожалуйста)
http://data.cod.ru/70357
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 13:44.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter