Ошибка 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.