Разгадка тайны создания экземпляра Application в Delphi и использовании VCL
Вопрос о том, где и когда создается экземпляр Application в Delphi, является важным для понимания жизненного цикла приложений, использующих VCL. В данном ответе мы рассмотрим, как происходит создание экземпляра TApplication, а также экземпляра TScreen, и где в коде это происходит.
Проблема: Разработчики, работающие с VCL в Delphi, сталкиваются с вопросом о том, в какой момент и в каком месте кода создается экземпляр Application. Поиск в разделе инициализации Forms или System не дает ответа, а в окне CPU перед вызовом Application.Initialize видно обращение к функции @_InitExe, которая, в свою очередь, вызывает _StartExe и множество ассемблерного кода. Однако, создается ли в этом месте экземпляр Application, остается неясным.
Решение: Чтобы выяснить, где создается TApplication, можно воспользоваться текстовым поиском по коду, например, с помощью функции "Find in Files" в IDE. Более простой способ — использовать отладчик. Для этого необходимо:
Включить отладку DCUs.
Установить точку останова в функции TApplication.Create.
Запустить программу.
Когда выполнение программы остановится на точке останова, следует посмотреть на стек вызовов. Оказывается, что TApplication создается из функции InitControls, которая находится в модуле Controls. Функция InitControls вызывается из раздела инициализации того же модуля Controls.
Полный стек вызовов для стандартного VCL-приложения выглядит следующим образом:
Аналогичным образом, если посмотреть на стек вызовов для TScreen.Create, можно увидеть, что экземпляр TScreen также создается в функции InitControls.
Альтернативный ответ: В коде модуля Vcl.Controls.pas в функции InitControls явно создается экземпляр Application с помощью TApplication.Create(nil);. Эта функция вызывается в разделе инициализации того же модуля.
Комментарии: Интересно отметить, что класс Application объявлен в модуле Forms, хотя сам Controls использует Forms, и наоборот. Это может показаться нелогичным, но TApplication должен быть объявлен выше, чем TForm, так как в интерфейсе TApplication есть ссылка на TForm.
Пример кода: Хотя в данном ответе мы не углубляемся в детали реализации, важно понимать, что в модуле Vcl.Controls.pas есть раздел инициализации, в котором вызывается функция InitControls, и именно там происходит создание экземпляра Application.
procedure InitControls;
begin
// Здесь может быть код инициализации
Application := TApplication.Create(nil);
// Дополнительный код
end;
initialization
// Инициализация модуля
InitControls;
// Дополнительные инициализации
Этот пример кода на Object Pascal (Delphi) демонстрирует ключевую часть процесса создания экземпляра Application. Разработчикам, работающим с VCL, важно понимать эти механизмы для корректного взаимодействия с компонентами VCL и создания надежных приложений на Delphi.
Разгадка тайны создания экземпляра `Application` в Delphi и использовании VCL заключается в том, что `TApplication` создается в функции `InitControls`, которая находится в модуле `Controls` и вызывается в его разделе инициализации.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.