我使用TObjectList来处理特定的标签列表.但是当我在Try Final中执行推荐的.Free时,它也会删除列表中的控件.
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;
Run Code Online (Sandbox Code Playgroud)
在这种情况下,当我执行此代码时,我最终缺少标签控件 - 它们从表单中删除,在调试中我看到控件是零.
我不应该.Free TObjectList?我如何免费使用TObjectlist并保持控件?
我有多个TTabSheeton TPageControl和on some action,用户点击一个按钮,我想OnResize在一个选定的上运行事件TTabSheet.问题是并非所有TTabSheet控件都OnResize创建了事件.
我在按钮上有这个代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
TTabSheet(PageControl1.ActivePage).OnResize(PageControl1.ActivePage);
end;
procedure TForm1.TabSheet1Resize(Sender: TObject);
begin
// actions on Resize
end;
Run Code Online (Sandbox Code Playgroud)
它在TabSheet1活动时有效.但是当TabSheet2它处于活动状态并且没有OnResize事件时我会收到错误:
Project Project1.exe引发异常类$ C0000005,并显示消息'access vialotion at 0x00000000:read of address 0x00000000'.
我试着检查nil,像这样:
If TTabSheet(PageControl1.ActivePage).OnResize(PageControl1.ActivePage) <> nil then...
Run Code Online (Sandbox Code Playgroud)
但它没有编译:
E2008不兼容的类型.
我发现的解决方法是每个TTabSheet控件都有空OnResize事件,只有注释,没有代码.
有没有比<> nil更好的检查,如果TTabSheet有OnResize事件,这不起作用?
谢谢