我在 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
事件,只有注释,没有代码。
如果 TTabSheet
有 OnResize
事件,是否有比 <> 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/