【发布时间】:2016-08-15 15:00:58
【问题描述】:
我在TPageControl 上有多个TTabSheet,并且在某些操作上,用户单击一个按钮,我想在选定的TTabSheet 上运行OnResize 事件。问题是并非所有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 引发异常类 $C0000005 并显示消息 '访问地址 0x00000000: 读取地址 0x00000000'.
我尝试检查 nil,如下所示:
If TTabSheet(PageControl1.ActivePage).OnResize(PageControl1.ActivePage) <> nil then...
但它不能编译:
E2008 不兼容类型。
我发现的解决方法是让每个TTabSheet 控件都有空的OnResize 事件,只有注释,没有代码。
如果TTabSheet 有OnResize 事件,有没有比 nil 更好的检查?
谢谢
【问题讨论】:
-
如果已分配(PageControl1.ActivePage.OnResize) 则 ....
-
如果我是你,我会尽量避免从代码中调用事件处理程序。
-
OnResize 改变了一些 TLabrl 和 TEdit 控件的显示方式。我也需要在单击按钮时执行它。我怎样才能避免调用它但被执行?
-
框架调用事件。如果您想对按钮单击和调整大小事件做出响应,我会执行以下操作: 1. 创建一个执行该操作的私有方法。 2. 从按钮单击处理程序调用该私有方法。 3. 从 resize 事件调用该私有方法。
-
完全不清楚您要解决什么问题。您是在 IDE 表单设计器中创建 Tabsheet2,还是在代码中创建?
标签: delphi