Невидимые формы в EXE и DLL

К примеру, требуется, чтобы в EXE- или в DLL-проекте отсутствовали какие-либо формы или компоненты, хотя и так большинство компонентов (windows UI-элементов управления) не имеют смысла вне формы.

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

Для примера, процесс создания компонента TDatabase в DLL или EXE "ручками" выглядит примерно таким образом:

procedure XYZ;
var

DB: TDatabase;
begin
DB := TDatabase.Create( nil);
{ теперь используем это }
DB.Alias := 'test';
DB.Active := true;
DB.DoSomething
DB.DosomethingElse
{ теперь освобождаем экземпляр TDatabase }
DB.Free
end;

Для не-визуальных компонентов форма, сама по себе, не имеет никакого значения. Поскольку TForm является дальным наследником TComponent, то она может быть владельцем других компонентов, тем не менее эта характеристика не добавляет функциональности расположенным на ней компонентам. Так какое преимущество существует у компонентов, расположенных на форме? Удобное, но небольшое: при разрушении формы (или компонента), предварительно автоматически освобождаются все компоненты, владельцем которых она является (ссылки на них содержатся во внутреннем списке).

Какое преимущество дает форма для не-визуальных компонентов (TDatabase, TTable и пр.) кроме их автоматического освобождения при освобождении формы? Никакого. Только то, что при использовании визуального конструирования все компоненты, располагаемые на форме, становятся принадлежащими этой форме и позволяют изменить их свойства по умолчанию.

Флаг видимости, как и ожидалось, работает и в dll, и в exe, тем не менее вы должны знать, что некоторые функции, например, Application.Run, устанавливают для главной формы visible := true. Вы не сможете это корректно обойти, поскольку эта форма является главной формой приложения, а для запуска приложения вы вызываете Application.Run.

Если вы хотите сделать главную форму невидимой, замените строку Application.Run следующей конструкцией:

repeat
Application.HandleMessage;
until Application.Terminated;
Application.Destroying;
Application.DestroyComponents;

Если вы все еще имеете проблемы с невидимыми формами в DLL, дайте мне знать как вы это делаете.

 
« Предыдущая статья   Следующая статья »