我在Jedi(版本3.50)上使用带有JVWizard的表单。我想在oncreate事件中做一些初始化的事情,因为我认为它将是创建表单(like described here)后的第一个事件。但我发现在oncreate事件之前触发了welcomepage(页面列表中的第一页)事件的onenterpage事件。我想知道出了什么问题。
答案 0 :(得分:4)
表单的事件序列并非绝对保证。或者更确切地说,表单的事件由表单确定,但这并不保证与其他组件触发的事件有关。
在构建表单之后,在该表单上的任何组件和控件都已初始化之后,将调用表单的 OnCreate 事件。
如果这些组件或控件触发任何事件,那么这些可能会在表单 OnCreate 事件本身之前发生。
在您的情况下,由于您使用的是 JvWizard 组件和控件,因此如果您在设计时将这些控件和组件放置在表单上,那么在加载时将初始化时触发的任何事件和在运行时初始化将在表单。 OnCreate 事件之前发生。
OnEnterPage 事件就是其中之一,由 JvWizard 触发,因为它初始化并建立了第一页。
如果不知道您正在尝试执行的确切初始化的细节,则无法说明您的案例中的正确解决方案。
可能只是稍后执行表单初始化,例如响应表单 OnShow 事件。
或者可能是将部分(或全部)初始化移动到向导 OnEnterPage 本身。
或者可能适合将初始化实现为虚拟创建构造函数的覆盖。
覆盖构造函数本身可以让你在调用继承的构造函数之前执行一些初始化(初始化表单内容并最终调用 OnCreate )和一些初始化 对继承的调用之后(将在任何 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;
希望通过了解正在发生的事情,您将能够确定适合您案例的方法。