Почему освобождение 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:-).

Другие вопросы по тегам