OnShow-Event同时建设?

时间:2014-10-12 06:44:55

标签: delphi delphi-7

我有一个表格( fsMDIChild )。这是在TForm4.FormShow

的OnShow事件中
if targetDatabase.hasItems then

不幸 OnShow在实例化时间接调用:

  program Project1;

uses
  Forms,
  Unit1 in 'Unit1.pas' {Form1},
  Unit2 in 'Unit2.pas' {Form2},
  Unit3 in 'Unit3.pas' {Form3},
  Unit4 in 'Unit4.pas' {Form4};

{$R *.res}

begin
  Application.Initialize;
  Application.CreateForm(TForm1, Form1);
  Application.CreateForm(TForm2, Form2);
  Application.CreateForm(TForm3, Form3);
  Application.CreateForm(TForm4, Form4); // <-- calls TForm4.OnShow! Why?
  Application.Run;
end.

我在ShowForm-Handler里放了一个Breakpoint。这是我的Stack-View的输出:

  • TForm4.FormShow(???)
  • PROJECT1

我的问题是:

  • 为什么OnShow会调用fsMDIChild?

1 个答案:

答案 0 :(得分:2)

按照正常的方式,对于标准表格,你不会指望这种情况发生。很明显,项目中有一些代码会触发此行为。

作为一些一般性建议,您可以使用调试器找出发生这种情况的原因。

  1. 在项目选项中,选中 Debug DCUs 选项。
  2. OnShow事件处理程序中设置断点。
  3. 在调试器下运行程序。
  4. 当断点触发时检查调用堆栈。
  5. 通过启用调试DCU,您可以确保获得包含VCL中功能的完整调用堆栈。按照调用堆栈计算事件触发的原因。

    现在,额外的具体信息是有问题的表格是MDI儿童。它们不能隐形,因此立即显示。换句话说,您所观察到的行为是预期的。 MDI儿童始终可见。因此,OnShow事件在施工期间会发生火灾。