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

Ошибка `AddObject` в `TStringList` на Android: сегментационный сбой и пути решения

Delphi , Компоненты и Классы , Списки

Ошибка AddObject в TStringList на Android: сегментационный сбой и пути решения

При работе с компонентом TStringList в приложениях для Android, созданных с помощью RAD Studio XE-5, может возникнуть проблема, связанная с использованием метода AddObject. В частности, при попытке добавить объект в список строк через TStringList.AddObject, пользователи могут столкнуться с сегментационным сбоем (segmentation fault), который проявляется при работе под Android.

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

Пример кода, который вызывает исключение:

procedure TMainForm.FormCreate(Sender: TObject);
var
    list: TStrings;
begin
    list := TStringList.Create;
    list.AddObject('Joe', TObject(1)); // Здесь возникает исключение
    list.AddObject('Hans', TObject(2));
end;

Этот код работает корректно при выполнении под 32-битной целевой платформой Windows, но вызывает ошибку сегментации при отладке на устройстве Nexus 7. Если приложение запускается без отладчика, оно просто закрывается.

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

Проблема заключается в том, что компилятор Android использует автоматическое управление ресурсами (ARC), и поэтому нельзя обращаться с целыми числами как с объектами, как это было возможно в Win32/64. Решение заключается в обертке целых чисел в классы, что позволяет корректно работать с ними в контексте TStringList на Android.

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

Современные подходы в Delphi, такие как использование безопасных типов и генерализованных контейнеров, рекомендуются для решения подобных задач. Вместо TStringList следует использовать типизированные контейнеры, например, из namespace Generics.Collections.

type
  TMyItem = record
  public
    Name: string;
    Age: Integer;
  end;

function NewMyItem(const Name: string; const Age: Integer): TMyItem;
begin
  Result.Name := Name;
  Result.Age := Age;
end;

var
  List: TList<TMyItem>;
begin
  List := TList<TMyItem>.Create;
  List.Add(NewMyItem('Joe', 1));
  List.Add(NewMyItem('Hans', 2));
end;

Решение с использованием ListBox

Если задача связана с использованием ListBox и необходимо сохранить идентификатор для каждого элемента, можно использовать кастомный класс элемента списка или свойство Tag у элементов ListBox, если они устанавливаются на этапе проектирования.

Заключение

Для корректной работы с TStringList в приложениях для Android, необходимо использовать классы для обертки примитивных типов и следовать современным практикам программирования на Delphi, таким как использование генерализованных контейнеров. Это позволит избежать проблем, связанных с ARC и обеспечит стабильную работу приложений на Android.

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

Пользователь столкнулся с ошибкой `AddObject` в `TStringList` при разработке приложений для Android в RAD Studio XE-5, которая приводит к сегментационному сбою и требует адаптации к особенностям Android, включая автоматическое управление ресурсами (ARC)


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

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




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


:: Главная :: Списки ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-05-09 08:02:09/0.0057761669158936/0