Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Как прекратить выполнение события из продцедуры?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 48141

rgreat
Delphi 10.2, Release, Core i5-6500 3.2 GHz.

Delphi 2006, AMD ноутбук пятилетней давности 1Ггц.

Походу, они что-то сломали в RTL.

Posted via ActualForum NNTP Server 1.5

9 сен 19, 19:32    [21967232]     Ответить | Цитировать Сообщить модератору
 Re: Как прекратить выполнение события из продцедуры?  [new]
rgreat
Member

Откуда:
Сообщений: 5211
Dimitry Sibiryakov,

Не. Надо было не из под среды запускать. Она даже в релизе ошибки отлавливает оказывается.

Теперь все как у тебя.
  for i:=0 to 1000000 do begin

4047
62
9 сен 19, 19:40    [21967235]     Ответить | Цитировать Сообщить модератору
 Re: Как прекратить выполнение события из продцедуры?  [new]
goldmi45
Member

Откуда:
Сообщений: 1177
InterSky
То есть, цикл - это процедура внутри процедуры.
Если вместо комментария вы впишите текст программы и там встретится Exit, он сработает как Continue в циклах и завершит лишь внутреннюю процедуру "innerProc". По аналогии, встречающийся в цикле Break завершил бы внешнюю процедуру "outerProc".

Чта?
Всегда считал, что цикл - это конструкция, предназначенная для многократного выполнения. В паскале это for, while, repeat-until.
То, что вы привели, это последовательное выполнение процедуры.
И если в outerProc вы напишете Break без цикла, то будет ошибка компиляции. Потому что break должен находиться внутри цикла (for, while, repeat-until).
Код 1:
begin
  for i := 0 to 100 do
  begin
    writeln(Format('%d', [i]));
    if i = 9 then
      Exit;
  end;
  writeln('after loop');
end;

Код 2:
begin
  for i := 0 to 100 do
  begin
    writeln(Format('%d', [i]));
    if i = 9 then
      Break;
  end;
  writeln('after loop');
end;


Как вы думаете, есть разница между кодом 1 и 2?
10 сен 19, 08:02    [21967415]     Ответить | Цитировать Сообщить модератору
 Re: Как прекратить выполнение события из продцедуры?  [new]
Док
Member

Откуда: Казань
Сообщений: 6345
InterSky,

есть еще способ, если по твоим условиям позволено менять тип и кол-во параметров процедуры (изврат, конечно, но если сильно надо) :)
  { TForm1 }

  TForm1 = class(TForm)
    procedure FormDblClick(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: char);
  private
    FOutParam: Integer;
    FInParam: Integer;
  public
    procedure Proc1();
    procedure Proc2(out OutParam: Integer);

  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.FormDblClick(Sender: TObject);
begin
  Proc1();
end;

procedure TForm1.FormKeyPress(Sender: TObject; var Key: char);
begin
  if Key = chr(ord(VK_ESCAPE)) then FInParam:= 1;
end;

procedure TForm1.Proc1();
begin
  Proc2(FOutParam);
  if FOutParam <> 1
    then Self.Caption:= 'был exit'
    else Self.Caption:= 'не было exit''а';
end;

procedure TForm1.Proc2(out OutParam: Integer);
var n: Integer = 0;
begin
  FInParam:= 0;
  OutParam:= 1;
  while n < 10 do
  begin
    Application.ProcessMessages;
    if FInParam > 0 then
    begin
      OutParam:= 0;
      Exit;
    end;
    inc(n);
    Self.Caption:= IntToStr(n) ;
    Sleep(500);
  end;
end;  
10 сен 19, 09:24    [21967451]     Ответить | Цитировать Сообщить модератору
 Re: Как прекратить выполнение события из продцедуры?  [new]
Linux_64
Member

Откуда: Киев
Сообщений: 9
Попробуйте использовать вместо if then оператор выбора case или метку Label
13 сен 19, 17:18    [21970597]     Ответить | Цитировать Сообщить модератору
 Re: Как прекратить выполнение события из продцедуры?  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 30280

13.09.2019 17:18, Linux_64 пишет:
> Попробуйте использовать вместо if then оператор выбора case или метку Label

и шо?

Posted via ActualForum NNTP Server 1.5

13 сен 19, 18:11    [21970633]     Ответить | Цитировать Сообщить модератору
 Re: Как прекратить выполнение события из продцедуры?  [new]
Док
Member

Откуда: Казань
Сообщений: 6345
Linux_64
или метку Label

а go to почему не упомянул? :)
13 сен 19, 22:29    [21970754]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Delphi Ответить