Несмотря на то, что DLL не имеет собственной формы, с ее помощью можно вызывать формы из связанных с библиотекой модулей. Для этого в библиотеке используется ссылка uses на связанные модули-формы и объявляются экспортируемые из DLL подпрограммы, в которых реализуется вызов соответствующих форм.
В следующем примере иллюстрируется техника включения в DLL формы и использования ее в вызывающей программе.
Текст DLL
library DLLWithForm; uses SysUtils, Classes, DLLFormU in 'DLLFormU.pas' {DLLForm}; {$R *.RES} exports ShowModalForm, ShowForm, FreeForm; begin end. Текст формы в DLL
// Закрыть форму procedure TTestMain.Button3Click(Sender: TObject); begin FreeForm; Button1.Enabled := True; Button2.Enabled := True; Button3.Enabled := False; end;
// Сообщение из формы DLL о ее закрытии procedure TTestMain.WMUser(var Msg: TMessage); begin Buttons.Click end;
end. Модуль формы DLLForm, помещенной в DLL, ссылается на стандартный модуль Forms и таким образом получает свой глобальный объект Application, который ничего “не знает” о глобальном объекте вызывающей программы (см. гл. 21). В режиме модального вызова это не имеет особого значения, т. к. модальное окно блокирует работу вызывающей программы. В режиме немодального вызова следует синхронизовать действия объектов, в противном случае минимизация главного окна, например, не приведет к минимизации окна DLL. Синхронизация достигается тем, что дескриптор объекта Application DLL заменяется на соответствующий дескриптор вызывающей программы.
При показе формы в немодальном режиме она может быть закрыта щелчком по собственной системной кнопке закрыть. В этом случае она должна каким-то образом известить вызывающую программу об этом событии. Для этого используется стандартный механизм посылки вызывающей форме Windows-сообщения. Сообщение должно иметь адрес, в роли которого используется дескриптор окна, получающего это сообщение. Вот почему вторым параметром обращения к функции ShowForm в DLL передается и в поле CallForm: запоминается дескриптор вызывающего окна. Обработчик события enclose формы проверяет это поле и, если оно определено, посылает вызывающему окну сообщение с индексом wm_user. В вызывающей программе предусмотрен обработчик этого сообщения, в котором реализуются необходимые действия.