При работе с коллекциями в Delphi важно понимать, как работает механизм управления жизненным циклом объектов. В частности, когда мы используем TObjectList, необходимо быть внимательным, чтобы не удалить объекты, которые нам ещё понадобятся.
Проблема
Вопрос, поднятый пользователем, заключается в том, что при использовании TObjectList для обработки списка определённых меток, после вызова метода .Free для TObjectList в блоке finally, элементы управления (контролы) также удаляются. Это происходит из-за того, что по умолчанию TObjectList "владеет" объектами, которые он содержит, и при освобождении списка удаляет их.
Пример кода
Допустим, у нас есть три метки на форме, и мы хотим обработать их список:
procedure GetHeaderLabels(var aList: TObjectList<TLabel>);
begin
aList.Add(Form1.lblHeaderCars);
aList.Add(Form1.lblHeaderBrands);
aList.Add(Form1.lblHeaderModels);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
vHeaderLabelsList: TObjectList<TLabel>;
begin
vHeaderLabelsList := TObjectList<TLabel>.Create;
try
GetHeaderLabels(vHeaderLabelsList);
// ... обработка меток
finally
vHeaderLabelsList.Free;
end;
end;
При выполнении этого кода метки удаляются с формы, и в отладке они отображаются как nil.
Решение проблемы
Чтобы избежать удаления объектов при освобождении TObjectList, необходимо установить свойство OwnsObjects в False. Это можно сделать при создании списка:
При работе с `TObjectList` в Delphi необходимо быть внимательным, чтобы избежать случайного освобождения управляющих элементов, если они еще нужны.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.