I use TObjectList to process specific list of labels. But when I do the recommended .Free in Try Final, it also deletes the controls from the list.
Simple example with 3 labels:
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;
In this case when I execute this code I end up with missing label controls - they are deleted from the form and in debug I see that controls are nil.
Am I not supposed to .Free TObjectList? How can I Free TObjectlist and still keep the controls?
TObjectListhas anOwnsObjectsproperty, which by default isTrue. If you don't change that at some point before you free it, it will free the objects it contains. If you don't want that, then setOwnsObjectstoFalse.If you don't need the objects owned (cleaned up) by the TObjectList, it would be better to simply use TList instead: