我有多个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更好的检查,如果TTabSheet有OnResize事件,这不起作用?
谢谢
你可能会以错误的方式解决这个问题.您不应该在代码中调用事件处理程序.把它留给框架.而是像这样写:
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是您定义的私有方法.
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)