Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Выход из цикла


Автор: NewDima 2.3.2006, 08:01
Нужно предусмотреть выход из цикла при движении мышью или нажатии на любую клавишу smile
Repeat
...
...
...
Until ???.
Как это сделать?

Автор: Ozzя 2.3.2006, 09:40
Break (procedure)
Terminates a for, while, or repeat statement.


Remarks:

Causes the innermost enclosing for, while, or repeat statement to be exited
immediately.

Is similar to a goto statement addressing a label just after the end of the
innermost enclosing repetitive statement.

The compiler will report an error if a call to Break is not enclosed by a
for, while, or repeat statement.

Автор: Dian 2.3.2006, 09:41
Код

Repeat
...
...
...
Until Flag

Флаг ставишь по нажатию на кнопку и т.п.
Обрати внимание, что поток, выполняющий цикл будет занят. Если он единственный, то некому будет обрабатывать сообщения. Один из вариантов - явно вызывать Application.ProcessMessages в цикле

Автор: Ozzя 2.3.2006, 10:45
Dian,
Для цикла repeat .. until есть нюанс - сначала выполняется тело цикла, и затем проверяется условие окончания цикла.
В данном случае, при выходе по флажку, может случиться так, что в координатах мыши (переменной, в которую будет занесено значение_нажатой_клавиши) окажутся последующие значения.
Добавлено @ 10:46
break же приводит к немедленному выходу из цикла.

Автор: Snowy 2.3.2006, 11:48
Код
var
  LastInput: TLastInputInfo;
  dwTime:    dword;
begin
  GetLastInputInfo(LastInput);
  dwTime := LastInput.dwTime;
  repeat
    ....
    GetLastInputInfo(LastInput);
  until LastInput.dwTime <> dwTime;

end;

Автор: Демо 2.3.2006, 14:06
Автору ведь надо обрабатывать движение мыши.
Вот только что за цикл такой, который нужно прерывать при обращении пользователя к графическому интерфейсу.

Мне кажется, что такой цикл было бы логичнее вынести в Application.OnIdle. Например:

Код

unit Unit1;

interface

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

type

  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    procedure FormCreate(Sender: TObject);
    procedure IdleHandler(Sender: TObject; var Done: Boolean);
    procedure Button1Click(Sender: TObject);
  private
    Flag: Boolean;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;


implementation

{$R *.dfm}

procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
begin
  if Flag then
  begin
    Form1.Tag := Form1.Tag + 1;
    Label1.Caption := IntToStr(Form1.Tag);
  end;
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  Flag := False;
  Application.OnIdle := IdleHandler;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
  Flag := not Flag;
end;

end.


Автор: Snowy 2.3.2006, 14:28
Цитата(Демо @ 2.3.2006, 14:06 Найти цитируемый пост)
Автору ведь надо обрабатывать движение мыши.
В моем варианте ничего обрабатывать не нужно.
Система сама скажет, трогал юзер мышу или клаву или нет.
Остальное нам не интересно.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)