我在TPageControl上有多个TPageControl,在某些操作上,用户单击一个按钮,我希望在选定的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事件时,我会得到错误:
Project1.exe引发异常类$C0000005,其消息'access vialotion at 0x00000000: read of address 0x00000000‘。
我试着检查一下没有,就像这样:
If TTabSheet(PageControl1.ActivePage).OnResize(PageControl1.ActivePage) <> nil then...但它没有编译:
E2008不兼容类型
我发现的解决方法是每个TTabSheet控件都有空的OnResize事件,只有一个注释,没有代码。
如果<>有OnResize事件的话,还有比TTabSheet 0更好的检查吗?
谢谢
发布于 2016-08-15 15:19:01
你可能走错路了。您不应该在代码中调用事件处理程序。那就交给框架吧。相反,用这样的方式写:
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是您定义的一个私有方法。
发布于 2016-08-15 19:31:02
从你的评论来看
我设置了OnResize事件,但没有为TabSheet2设置任何事件。因此,TabSheet2在对象检查器中有OnResize,而在unit1中没有代码。
我认为您可能对表单设计器的具体内容感到困惑,它是定义事件处理代码的术语。
试试这个:
Caption := 'TabSheet1.Resize';保存表单的单位。
TabSheet2.OnResize()将导致AV,因为其OnResize 属性的值为Nil。TabSheet1Resize作为列表中的单个条目。从列表中选择它,现在TabSheet1 2的OnResize属性的值与TabSheet1 1‘1相同,即过程TabSheet1Resize。步骤3和步骤6对于TabSheet1和TabSheet2具有相同的OnResize事件处理程序代码至关重要。
换句话说,您的注释似乎忽略了对象的事件处理程序属性(例如OnResize)之间的差异,在这种情况下,事件处理程序总是(这就是为什么OI向您显示事件处理程序属性)和事件处理程序过程(如果有的话)中为事件处理程序属性分配的代码之间的区别。
很抱歉,如果所有这些都是痛苦的显而易见的话,如果是的话,那么我误解了你的一些评论。
如果希望所有其他表都与TabSheet1具有相同的TabSheet1处理程序,则可以将其设置在例如FormCreate事件处理程序中,如下所示:
procedure TForm1.FormCreate(Sender: TObject);
var
i : integer;
begin
for i := 1 to PageControl1.PageCount - 1 do
PageControl1.Pages[i].OnResize := PageControl1.Pages[0].OnResize;
// PageControl1.Pages[0] will be equal to TabSheet1, if that's the first Tabsheet
// you created
end;https://stackoverflow.com/questions/38957634
复制相似问题