Есть ли проблема с переопределением конструктора формы Delphi, _and_, используя событие OnCreate? - PullRequest
6 голосов
/ 21 апреля 2011

В справке Delphi говорится, что нужно либо переопределить конструктор формы, либо использовать событие OnCreate. Но не делай и того, и другого. В чем причина этого? Единственное, что я вижу, это то, что если в наследнике исключено наследование, то TCustomForm.Create не будет вызван Таким образом, OnCreate не будет вызываться в этом случае. Но если наследство не пропущено, я не вижу проблемы.

изменить: я должен добавить причину для моего вопроса. Я на самом деле не планирую использовать оба в одном классе. Но я рассматривал возможность переопределения конструктора в базовом классе, когда потомок уже использует OnCreate. Поэтому мне было интересно, был ли какой-то конфликт, о котором я не знал. Но у меня складывается впечатление, что все должно быть в порядке. Хотя я могу просто использовать OnCreate в базовом классе, чтобы сохранить его согласованность.

другое редактирование: Спасибо всем за помощь. Таким образом, похоже, что использование обоих методов на самом деле ничего не сломает, если вы сделаете это правильно. Но проблема в том, что это делает код трудным для понимания. И я думаю, что должен выбрать лучший ответ, но все, кажется, согласны. Так что я просто выберу тот, который был размещен первым.

Ответы [ 5 ]

4 голосов
/ 21 апреля 2011

Обе вызовут. Тем не менее, это разумный совет, поскольку использование обоих сбивает с толку читателей кода.

3 голосов
/ 21 апреля 2011

Учитывая ваши изменения, нет проблем в использовании их обоих.

Просто убедитесь, что вы написали свой переопределенный конструктор примерно так:

constructor TMyForm.Create(AOwner: TControl);
begin
  inherited;
  ....
  your new code here
end;

Также обратите внимание, что OnCreateобработчик будет вызываться до добавленного вами кода Create, так что имейте это в виду.Это может быстро запутать, поэтому руководство рекомендует против этого.

Предупреждение

Если вы переопределите класс, не используйте OnCreate, потому что это может заблокировать пользователейСобытие OnCreate от этого, просто сделайте свое дело в переопределенном конструкторе.Правило состоит в том, что вещи, которые должны быть одинаковыми при создании каждого экземпляра TMyForm, должны входить в конструктор переопределения.

Создать вещи, которые могут отличаться в зависимости от того, где используется TMyFormдолжен войти в обработчик OnCreate.

Если есть какие-либо зависимости с другими компонентами поблизости, то ваш код всегда должен идти в обработчик OnCreate.

2 голосов
/ 21 апреля 2011

Если есть несколько мест, вы можете сделать что угодно. Просто выберите один и придерживайтесь этого. Используйте другое место, только если это оправдано.

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

2 голосов
/ 21 апреля 2011

Вы можете в конечном итоге разместить идентичный или сложный код в двух разных местах. Я почти всегда использую событие OnCreate самостоятельно.

0 голосов
/ 22 апреля 2011

Я использую событие onCreate, когда это необходимо - я никогда не хочу переопределять конструктор по умолчанию в TForm - IMO, в какой-то момент вы непременно столкнетесь с осложнениями и путаницей.

Другие способы обработки этого, которые я предпочитаю, когда это возможно:

Добавьте метод 'initialize' в форму - вызовите его после создания, но до показывая это.Это похоже на то, что происходит с COM-объектами - конструкторы не имеют параметров, и вы занимаетесь бизнесом в вызове Initialize.

Также иногда целесообразно использовать переменные и функции в модуле формы, но вне класса формы - как Delphiсам постоянно делает.В связи с этим подходом рассмотрите возможность использования разделов инициализации и финализации вашего модуля формы - хотя и с БОЛЬШИМ УХОДОМ, особенно с COM-объектами или компонентами, где вы используете свойство Owner для очистки - вы, вероятно, столкнетесь спроблемы с AV при выключении и очистке.

...