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

Mat*_*mtj 2 delphi

我有多个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事件,这不起作用?

谢谢

Dav*_*nan 6

你可能会以错误的方式解决这个问题.您不应该在代码中调用事件处理程序.把它留给框架.而是像这样写:

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

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

procedure TForm1.TabSheet1Resize(Sender: TObject);
begin
  DoTabsheet1Resize;
end;
Run Code Online (Sandbox Code Playgroud)

DoTabsheet1Resize是您定义的私有方法.


Mic*_*lev 5

procedure TForm1.Button1Click(Sender: TObject); 
begin
  If Assigned(PageControl??1.ActivePage.OnResize??) 
    then PageControl??1.ActivePage.OnResize??(Sender);       
end;
Run Code Online (Sandbox Code Playgroud)

  • @Matej你能定义"空"和"非附件"吗?这些是什么东西?答案是没有这样的事情.如果事件处理程序是`nil`,那么`Assigned()`返回`False`并且没有附加事件处理程序.看到代码从外部调用事件处理程序仍然让我感到有点不舒服. (3认同)