Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Проблемы с try..except в Delphi 10.3 при разработке для MacOS Big Sur: Как решить "Access Violation"

Delphi , Синтаксис , Ошибки и Исключения

Проблемы с try..except в Delphi 10.3 при разработке для MacOS Big Sur

Разработчики, использующие Delphi для создания приложений под MacOS, иногда сталкиваются с трудностями при работе с обработкой исключений. В частности, в Delphi 10.3 пользователи могут столкнуться с ситуацией, когда конструкция try..except не работает корректно, и вместо обработки исключения происходит бесконечный цикл из-за возникновения нового исключения "Access Violation".

Описание проблемы

Проблема заключается в том, что при возникновении исключения в коде, написанном на Object Pascal в среде Delphi 10.3 для 64-битной версии MacOS Big Sur, конструкция try..except не выполняется. Вместо этого, RTL (Runtime Library) генерирует ошибку при поднятии исключения, что приводит к новому исключению "Access Violation", входящему в бесконечный цикл.

Пример кода, вызывающего проблему

unit Unit8;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls;

type
  TForm8 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
  public
  end;

  function Str2Float(str: String): Extended;

var
  Form8: TForm8;

implementation

{$R *.fmx}

procedure TForm8.Button1Click(Sender: TObject);
var
  f: Extended;
begin
  f := Str2Float('10,7');
  ShowMessage('Resultat : ' + FloatToStr(f));
end;

function Str2Float(str: String): Extended;
var
  dec: Char;
begin
  result := 0;
  if Length(str) > 0 then begin
    dec := FormatSettings.DecimalSeparator;
    FormatSettings.DecimalSeparator := '.';
    try
      result := StrToFloat(str);
    except
      on E: Exception do begin
        FormatSettings.DecimalSeparator := ',';
        try
          result := StrToFloat(str);
        except
          on E: Exception do
            result := 0;
        end;
      end;
    end;
    FormatSettings.DecimalSeparator := dec;
  end;
end;

end.

При вызове функции Str2Float с параметром '10,7' возникает исключение, так как используется запятая в качестве разделителя десятичных долей, в то время как StrToFloat ожидает точку. В коде предусмотрена попытка изменить разделитель десятичных долей на точку, но это не приводит к ожидаемому результату из-за ошибки в RTL.

Подтвержденный ответ

Чтобы решить проблему с обработкой исключений в Delphi 10.3 для MacOS, рекомендуется использовать функцию TryStrToFloat вместо StrToFloat. Это позволит избежать необходимости изменения глобальных настроек формата и упростит код. Также полезно использовать конструкцию try..finally для сохранения и восстановления настроек разделителя десятичных долей.

function Str2Float(str: String): Extended;
var
  localFormatSettings: TFormatSettings;
begin
  localFormatSettings := TFormatSettings.Create(FormatSettings);
  try
    localFormatSettings.DecimalSeparator := '.';
    Result := TryStrToFloat(str, localFormatSettings);
  finally
    localFormatSettings.Free;
  end;
end;

Альтернативный ответ

В случае, если предложенный выше метод не решает проблему, стоит обратить внимание на то, что в документации RAD Studio упоминается отсутствие поддержки структурированного обработчика исключений в MacOS, если исключение возникает вне RTL/Delphi классов. Это документировано в разделе "Differences between Windows and macOS". В таком случае, разработчикам следует искать альтернативные способы обеспечения выполнения кода очистки при возникновении исключений.

Заключение

При разработке приложений для MacOS с использованием Delphi 10.3 важно быть внимательным к особенностям обработки исключений. Использование TryStrToFloat и локальных настроек формата может помочь избежать распространенных проблем. В случае возникновения сложностей, рекомендуется тщательно изучить документацию и искать решения, учитывая специфику платформы MacOS.

Создано по материалам из источника по ссылке.

Разработчики столкнулись с проблемами в обработке исключений в Delphi 10.3 при работе над приложениями для MacOS Big Sur.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Ошибки и Исключения ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 12:58:25/0.0051839351654053/1