Ошибка завершения кода Delphi с помощью анонимных методов

пожалуйста, создайте новое приложение 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 ответов


лучший способ избежать этого-создать свой код и окружить его 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;

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

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