Сбой завершения Delphi-кода анонимными методами - PullRequest
0 голосов
/ 24 сентября 2018

Пожалуйста, создайте новое приложение FMX, добавьте кнопку и памятку, чтобы запустить этот пример.У меня есть этот код:

procedure TForm1.Button1Click(Sender: TObject);
begin
  TTask.Run(procedure
            var
              client: TIdHTTP;
              result: string;
            begin
              client := TIdHTTP.Create(nil);
              try
                try
                  client.ReadTimeout := 4000;
                  client.ConnectTimeout := 4000;
                  result := client.Get('a valid url here just as test');
                  TThread.Synchronize(nil, procedure
                                           begin
                                             Memo1.Lines.Add(result);
                                           end);
                except
                  on E: Exception do
                    begin
                      TThread.Synchronize(nil, procedure
                                           begin
                                             Memo1.Lines.Add(E.Message);
                                           end);
                    end
                end;
              finally
                client.Free;
              end;
            end);
end;

Он работает, как я ожидаю, но проблема в IDE.Если я поместлю курсор где-нибудь в теле анонимной функции, я получу закрытие оператора finally автоматически.

Как я могу это исправить?


Сначала я здесь

enter image description here

Затем я нажимаю Enter и у меня есть это!

enter image description here

Если вы поместите курсор в начало, а не в конец строки, вы можете добавить новые пробелы без завершения.Как решить эту проблему?Ну, я обнаружил, что проблема возникает, потому что есть этот код:

TThread.Synchronize(nil, procedure
                         begin
                           Memo1.Lines.Add(result);
                         end);

Если вы удалите этот код, проблема больше не будет возникать.Это ошибка в IDE?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Это ошибка в IDE?

Да.Это дефект.Пожалуйста, отправьте отчет на портал качества.

0 голосов
/ 24 сентября 2018

Это ошибка в IDE?

Да, это ошибка в IDE.Ваш код синтаксически действителен.

Как я могу это исправить?

Лучший способ избежать этого - создать свой код и окружить его try...except... для обработкилюбое исключение:

  try
    MyClass := TComponent.Create(Self);
    try

    finally
      MyClass.Free;
    end;
  except on E: Exception do
  end;

Таким образом, ваш код будет:

  TTask.Run(procedure
            var
              client: TIdHTTP;
              result: string;
            begin
              try
                Client := TIdHTTP.Create(nil);
                try
                  client.ReadTimeout := 4000;
                  client.ConnectTimeout := 4000;
                  result := client.Get('a valid url here just as test');
                  TThread.Synchronize(nil, procedure
                                           begin
                                             Memo1.Lines.Add(result);
                                           end);
                finally
                  Client.Free;
                end;
              except on E: Exception do
                begin
                  TThread.Synchronize(nil, procedure
                                           begin
                                             Memo1.Lines.Add(E.Message);
                                           end);
                  end;
              end;
            end;
...