我用的是一个来自绝地的JVWizard (3.50版)。我想在oncreate事件中做一些初始化工作,因为我认为它将是创建表单(就像这里描述的)之后的第一个事件。但是我发现欢迎电(页面列表中的第一页)事件的onenterpage事件是在oncreate事件之前触发的。我想知道是怎么回事。
发布于 2017-04-16 04:51:30
表单的事件序列不是绝对保证的。或者说,表单的事件是由表单决定的,但这并不保证与其他组件触发的事件有关。
表单的OnCreate事件是在表单上的任何和所有组件和控件被初始化后调用的。
如果这些组件或控件触发任何事件,则这些事件可能发生在表单OnCreate事件本身之前。
在您的情况下,由于您使用的是JvWizard组件和控件,那么如果在设计时将这些控件和组件放在窗体上,那么在运行时加载和初始化它们时触发的任何事件都将发生在该事件发生之前。
OnEnterPage事件就是其中之一,它在初始化和建立其第一页时由JvWizard触发。
如果不知道您正试图执行的初始化的细节,就不可能说出在您的情况下正确的解决方案是什么。
可能只是稍后执行窗体初始化,例如响应forms OnShow事件。
或者可能将部分(或全部)初始化移动到向导OnEnterPage本身。
或者,将初始化实现为虚拟创建构造函数的重写可能是适当的。
重写构造函数本身将使您能够在调用继承的构造函数(初始化表单内容并最终调用OnCreate)之前执行一些初始化,在调用继承(将在任何窗体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;希望通过了解正在发生的事情,您将能够确定适合您的情况下的方法。
https://stackoverflow.com/questions/43425736
复制相似问题