Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2017, 00:03   #1
Ispol1n
Новичок
Джуниор
 
Регистрация: 02.05.2017
Сообщений: 1
По умолчанию Остановка цикла по нажатию клавиши

Только начал осваивать эту задачу, может код и корявый, но не пойму, почему он не работает, мне нужно остановить процедуру start когда я захочу, вернее когда я нажму Esc , я жму Esc , но не робит. Помогите.

Код:
unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  fl:boolean;
  procedure start(k: integer; memo1: TMemo);
  procedure stop;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var k:integer;
begin
start(k,memo1);
end;

procedure start(k: integer; memo1: TMemo);
begin
fl:=false;
for k:=1 to maxint do
 begin
 memo1.Lines.add(inttostr(k));
 if fl=true then break;
 end;
end;

procedure stop;
begin
 fl:=true;
end;

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
if key=27 then
 stop;
end;

end.
Ispol1n вне форума Ответить с цитированием
Старый 03.05.2017, 08:45   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Вы заняли UI поток своим циклом, поэтому он не может вызвать обработчик нажатия.

Почитайте про потоки (TThread) и вынесите в отдельный поток.

Еще есть костыли типа Application.ProcessMessages.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 03.05.2017, 10:04   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

хочу чуток пояснить абсолютной верный ответ Alex11223 про "костыль".
иногда можно и его использовать.

суть состоит в том, чтобы в цикле давать Windows возможность обработать очередь сообщений (в которой и стоит сообщение о нажатой клавише).
попробуйте:
Код:
procedure start(k: integer; memo1: TMemo);
begin
fl:=false;
for k:=1 to maxint do
 begin
 memo1.Lines.add(inttostr(k));
 Application.ProcessMessages;
 if fl=true then break;
 end;
end;
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
остановка цикла Emperator12 Общие вопросы Delphi 2 06.10.2012 12:49
Остановка/Возобновление цикла Зод Общие вопросы Delphi 9 13.09.2012 21:25
Delphi выход из цикла по нажатию клавиши Фиалка001 Помощь студентам 4 16.10.2011 16:01
Как выйти из цикла по нажатию горячей клавиши? suslik_ Помощь студентам 2 06.07.2011 16:20
остановка цикла dgoc Помощь студентам 7 28.06.2011 02:18