Почему освобождение TObjectList также удаляет элементы управления?
Я использую TObjectList для обработки определенного списка меток. Но когда я делаю рекомендуемый.Free в Try Final, он также удаляет элементы управления из списка.
Простой пример с 3 метками:
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);
{... process Header Labels }
finally
vHeaderLabelsList.Free;
end;
end;
В этом случае, когда я выполняю этот код, я получаю отсутствующие элементы управления метками - они удаляются из формы, и при отладке я вижу, что элементы управления равны нулю.
Разве я не должен.Free TObjectList? Как я могу освободить TObjectlist и при этом сохранить контроль?
2 ответа
TObjectList
имеет OwnsObjects
свойство, которое по умолчанию True
, Если вы не измените это в какой-то момент перед тем, как освободить его, он освободит содержащиеся в нем объекты. Если вы не хотите этого, то установите OwnsObjects
в False
,
vHeaderLabelsList := TObjectList<TLabel>.Create(False);
Если вам не нужны объекты, принадлежащие (очищенные) TObjectList, лучше вместо этого просто использовать TList:
vHeaderLabelsList := TList<TLabel>.Create;
Вы наткнулись на разницу между TObjectList
а также TList<TObject>
,
TObjectList
"владеет" объектами в списке, что означает, что по умолчанию он уничтожит все содержащиеся в нем объекты, когда объект будет удален из списка или сам список уничтожен.
Если вы не хотите, чтобы это произошло, используйте TList<TObject>
или установить OwnsObjects
в false перед добавлением элементов в список.
Обычно это делается в конструкторе, но вы можете установить его и после этого.
Все это четко указано в документации.
Если запись принадлежит, когда объект записи удаляется из списка, объект записи освобождается.
Свойство OwnsObjects получает или устанавливает владение объектом.
Вы должны действительно проверить: http://docwiki.embarcadero.com/ когда что-то неожиданное происходит, прежде чем спешить на SO:-).