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

标签 delphi

我在 TPageControl 上有多个 TTabSheet 并且在某些操作上,用户单击一个按钮,我想在选定的按钮上运行 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;

它在 TabSheet1 处于事件状态时起作用。但是当 TabSheet2 处于事件状态并且它没有 OnResize 事件时,我得到错误:

Project Project1.exe raised exception class $C0000005 with message 'access vialotion at 0x00000000: read of address 0x00000000'.

我试着检查 nil,像这样:

If TTabSheet(PageControl1.ActivePage).OnResize(PageControl1.ActivePage) <> nil then...

但它不编译:

E2008 Incompatible type.

我发现的解决方法是让每个 TTabSheet 控件都有空的 OnResize 事件,只有注释,没有代码。

如果 TTabSheetOnResize 事件,是否有比 <> nil 更好的检查?

谢谢

最佳答案

您可能采用了错误的方式。您不应在代码中调用事件处理程序。将其留给框架。而是这样写:

procedure TForm1.DoTabsheet1Resize;
begin
  // actions on Resize
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  DoTabsheet1Resize;
end;

procedure TForm1.TabSheet1Resize(Sender: TObject);
begin
  DoTabsheet1Resize;
end;

这里 DoTabsheet1Resize 是您定义的私有(private)方法。

关于delphi - 如何检查是否在 TTabSheet 控件上创建了 OnResize 事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38957634/

相关文章:

delphi - 使用 VCL 样式时 TListview 标题中没有图像

delphi - 覆盖 TStringList.Delimiter

delphi - 如何与 TWebBrowser 控件中的 TAutoIntfObject 对象进行互操作?

delphi - 如何在jenkins节点上设置多个delphi版本?

c - 如何在 Pascal/Delphi 中调用以下 C 函数?

delphi - 计算邻域距离

delphi - 如何将Tiff图像与Delphi合并?

delphi - 将 Chrome 检测为与 Windows 中的 html 文件关联的浏览器

delphi - 如何在 2009 年之前的 Delphi 中解码包含日语字符的 url?

delphi - 使用 onmousedown、onmouseup 和 click 事件时无法捕获所有点击