К примеру, требуется, чтобы в 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, дайте мне знать как вы это делаете.
Успехов,
James Thorpe
Borland Australia.
[000596]