onCreate 不是第一个事件

onCreate is not the first event

我使用带有 Jedi 的 JVWizard(3.50 版)的表格。我想在 oncreate 事件中做一些初始化工作,因为我认为这将是创建表单后的第一个事件 (like described here)。但我发现欢迎页面(页面列表中的第一页)事件的 onenterpage 事件在 oncreate 事件之前被触发。我想知道怎么了。

不能绝对保证表单的事件顺序。或者更确切地说,窗体的事件由窗体决定,但这并不能保证任何关于其他组件触发的事件。

窗体的 OnCreate 事件在构造窗体后调用,在该窗体上的任何和所有组件和控件本身都已初始化之后。

如果这些组件或控件触发任何事件,那么这些事件可能会在表单 OnCreate 事件本身之前发生。

在您的情况下,由于您使用的是 JvWizard 组件和控件,因此如果您在设计时将这些控件和组件放置在窗体上,那么它们的初始化会触发任何事件因为它们在 运行 加载和初始化,所以会在 Form.OnCreate 事件之前发生。

OnEnterPage 事件就是其中之一,由 JvWizard 在初始化并建立其第一页时触发。

如果不知道您尝试执行的确切初始化的详细信息,就不可能说出适合您的情况的正确解决方案。

稍后可能只是为了执行表单初始化,例如响应表单 OnShow 事件。

或者可能是将部分(或全部)初始化移动到向导 OnEnterPage 本身。

或者将您的初始化实现为虚拟 Create 构造函数的重写可能是合适的。

覆盖构造函数本身将使您能够在调用继承的构造函数之前执行一些初始化(以初始化表单内容并最终调用OnCreate) 和一些初始化 after 对继承的调用(这将 运行 在任何 Form OnCreate 事件处理程序之后)。

constructor TMyForm.Create(Owner: TComponent);
begin
  // Perform initialization BEFORE calling inherited and 
  //  BEFORE any components or controls have initialised and
  //  triggered any of their events.
  //
  // But remember:  At this point there are no form contents loaded!
  //  As a result the amount of useful initialization you can do
  //  here may be limited.

  // ..

  inherited Create(Owner);

  // Perform further initialization here ...
  //
  // At this point form contents (controls/components) have been
  //  loaded and any events have been triggered and handled,
  //  including FormCreate.  Any code here might even be better
  //  left to run in the FormCreate event handler.
end;

希望通过了解正在发生的事情,您将能够确定适合您的情况的方法。