DataModule, созданный перед основной формой

Некоторые разработчики приложений баз данных предпочитают создавать модуль данных перед основной формой, редактируя исходный файл проекта следующим образом

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TDM, DM);
  Application.CreateForm(TMainForm, MainForm);
{...}
  Application.Run;
end.

Вопрос - почему? Какие плюсы и минусы?

6 ответов

Решение

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

В противном случае это не имеет значения.

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

Здесь действительно два лагеря, и оба верны.

Первый позволяет приложению управлять жизнью каждого модуля формы / данных. В этом случае, если основная форма использует модуль данных, его необходимо создать, прежде чем его можно будет использовать. Это хорошо работает для небольших приложений, но при загрузке больших приложений с несколькими формами возникают накладные расходы на загрузку... однако после загрузки приложения отображение формы происходит практически мгновенно, поскольку она уже создана в памяти. Поскольку каждая форма / ресурс уже создана, при запуске приложения также возникает большой объем памяти. Этот метод используется по умолчанию, и Delphi "ведет" вас, когда вы добавляете в приложение новые формы / модули данных. Если вы не используете модуль данных в OnCreate основной формы, то он может быть ниже в порядке создания, так как он не будет вызываться до тех пор, пока не будет запущен Application.Run.

Второй лагерь хочет обрабатывать создание и уничтожение каждого модуля формы / данных (обычно для всех форм, кроме MainForm). Преимущество этого метода заключается в том, что приложение будет загружаться быстрее и потреблять меньше памяти сразу после запуска. Обычно в этом сценарии это основная форма (или другие формы), которая полностью управляет жизненным циклом каждого модуля формы / данных, который они используют. Этот метод лучше всего подходит для больших приложений с множеством форм.

Просто потому, что это самый ленивый способ убедиться, что контент DataModule доступен для MainForm. Если у вас есть только один DataModule, проблем нет.

MainForm не отображается перед созданием всех других компонентов. Так что, в принципе, вы будете ждать в обоих случаях, сначала создается модуль данных о погоде или нет. Если ваша сетка находится в главной форме, то вы можете столкнуться с проблемами при попытке использовать что-то подобное из события таблицы (или запроса) таблицы модулей данных (после открытия):

cxGrid1DBTableView1.Controller.TopRowIndex :=0;
cxGrid1DBTableView1.DataController.FocusedRowIndex := 0;

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

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

Просто сделай это!

Другие вопросы по тегам