首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查是否在OnResize控件上创建了TTabSheet事件?

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

Stack Overflow用户
提问于 2016-08-15 15:00:58
回答 2查看 295关注 0票数 2

我在TPageControl上有多个TPageControl,在某些操作上,用户单击一个按钮,我希望在选定的TTabSheet上运行OnResize事件。问题是,并非所有TTabSheet控件都创建了OnResize事件。

我在按钮上有这个代码:

代码语言:javascript
复制
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‘。

我试着检查一下没有,就像这样:

代码语言:javascript
复制
If TTabSheet(PageControl1.ActivePage).OnResize(PageControl1.ActivePage) <> nil then...

但它没有编译:

E2008不兼容类型

我发现的解决方法是每个TTabSheet控件都有空的OnResize事件,只有一个注释,没有代码。

如果<>有OnResize事件的话,还有比TTabSheet 0更好的检查吗?

谢谢

EN

回答 2

Stack Overflow用户

发布于 2016-08-15 15:19:01

你可能走错路了。您不应该在代码中调用事件处理程序。那就交给框架吧。相反,用这样的方式写:

代码语言:javascript
复制
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是您定义的一个私有方法。

票数 6
EN

Stack Overflow用户

发布于 2016-08-15 19:31:02

从你的评论来看

我设置了OnResize事件,但没有为TabSheet2设置任何事件。因此,TabSheet2在对象检查器中有OnResize,而在unit1中没有代码。

我认为您可能对表单设计器的具体内容感到困惑,它是定义事件处理代码的术语。

试试这个:

  1. 在新创建的空白表单上,删除一个TPageControl,PageControl1,右键单击它并在其中创建两个TabSheets,TabSheet1和TabSheet2。
  2. 在OI中,单击TabSheet1,在OI中单击其Events选项卡,并单击OnResize事件属性中的下拉按钮。你会发现下拉列表是空的。
  3. 现在双击Tabsheet1 1的OnResize事件。这样做会导致OI在表单的代码中创建一个空的事件处理过程TabSheet1Resize。它还将分配给 OnResize property of TabSheet1,TabSheet1Resize。此时不要保存表单,否则IDE将检测到此过程不包含代码(或注释)并将其删除。
  4. 在TabSheet1Resize中添加以下代码 Caption := 'TabSheet1.Resize';

保存表单的单位。

  1. 现在,在OI中选择TabSheet2 2的事件选项卡,在OnResize事件中选择OnResize。此时,TabSheet2 2的OnResize属性没有分配给任何过程,因此试图调用TabSheet2.OnResize()将导致AV,因为其OnResize 属性的值为Nil。
  2. 现在,在TabSheet2 2的OnResize中,单击下拉按钮,您将看到TabSheet1Resize作为列表中的单个条目。从列表中选择它,现在TabSheet1 2的OnResize属性的值与TabSheet1 1‘1相同,即过程TabSheet1Resize。

步骤3和步骤6对于TabSheet1和TabSheet2具有相同的OnResize事件处理程序代码至关重要。

换句话说,您的注释似乎忽略了对象的事件处理程序属性(例如OnResize)之间的差异,在这种情况下,事件处理程序总是(这就是为什么OI向您显示事件处理程序属性)和事件处理程序过程(如果有的话)中为事件处理程序属性分配的代码之间的区别。

很抱歉,如果所有这些都是痛苦的显而易见的话,如果是的话,那么我误解了你的一些评论。

如果希望所有其他表都与TabSheet1具有相同的TabSheet1处理程序,则可以将其设置在例如FormCreate事件处理程序中,如下所示:

代码语言:javascript
复制
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;
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38957634

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档