Ошибка завершения кода 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 и у меня это!
Если вы поместите курсор в начале и не в конце строки, вы можете добавить новые пространства без завершения. Как решить эту проблему? Ну, я обнаружил, что проблема возникает, потому что есть этот код:
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;