小编Mat*_*mtj的帖子

为什么释放TObjectList也会删除控件?

我使用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并保持控件?

delphi tobjectlist delphi-10.1-berlin

3
推荐指数
2
解决办法
221
查看次数

如何检查是否在TTabSheet控件上创建了OnResize事件?

我有多个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更好的检查,如果TTabSheetOnResize事件,这不起作用?

谢谢

delphi

2
推荐指数
2
解决办法
195
查看次数

标签 统计

delphi ×2

delphi-10.1-berlin ×1

tobjectlist ×1