onCreate не первое событие

Я использую форму с JVWizard от Jedi (версия 3.50). Я хочу выполнить некоторые действия по инициализации в событии oncreate, потому что я думал, что это будет первое событие после создания формы (как описано здесь). Но я обнаружил, что событие onenterpage события welcomepage (первая страница в списке страниц) запускается до события oncreate. Мне интересно, что не так.


person Christine Ross    schedule 15.04.2017    source источник


Ответы (1)


Последовательность событий для формы не гарантируется абсолютно. Вернее, события формы определяются самой формой, но это ничего не гарантирует в отношении событий, запускаемых другими компонентами.

Событие OnCreate формы вызывается после создания формы, после инициализации всех и всех компонентов и элементов управления в этой форме.

Если эти компоненты или элементы управления инициируют какие-либо события, то они могут произойти до самого события формы OnCreate.

В вашем случае, поскольку вы используете компоненты и элементы управления JvWizard, тогда, если эти элементы управления и компоненты размещены в вашей форме во время разработки, тогда любые события, вызванные их инициализацией, когда они загружаются и инициализируются во время выполнения произойдет перед событием Form.OnCreate.

Событие OnEnterPage является одним из них, инициируемым JvWizard, когда он инициализирует и устанавливает свою первую страницу.

Не зная подробностей того, какую именно инициализацию вы пытаетесь выполнить, невозможно сказать, каким может быть правильное решение в вашем случае.

Вы можете просто выполнить инициализацию формы позже, например, в ответ на событие формы OnShow.

Или это может быть перенос части (или всей) инициализации на сам мастер OnEnterPage.

Или вместо этого может быть уместно реализовать вашу инициализацию как переопределение виртуального конструктора Create.

Переопределение самого конструктора позволит вам выполнить некоторую инициализацию до вызова унаследованного конструктора (для инициализации содержимого формы и, в конечном итоге, вызова OnCreate) и некоторую инициализацию после вызов inherited (который будет выполняться после любого обработчика события 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;

Надеюсь, с пониманием того, что происходит, вы сможете определить подходящий подход в вашем случае.

person Deltics    schedule 16.04.2017
comment
Я не знал, что компоненты инициализируются перед созданием, очень ценная информация. - person Christine Ross; 16.04.2017