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, заключается в том, что создание модулей данных перед любыми другими формами - это просто хорошая практика. Многие люди пострадают, если они этого не сделают, и получат туманные нарушения доступа.
Просто сделай это!