На этом шаге мы рассмотрим отображение немодальных форм при статической загрузке DLL.
Отображение немодальных форм традиционно осуществляется со статической загрузкой DLL. Типичный код для отображения немодальной формы в DLL выглядит следующим образом:
procedure ShowNonModalForm(AppHandle: THandle); stdcall; begin Application.Handle:=AppHandle; with TForm2.Create(Application) do Show; end;
Так же как и при отображении модальных форм, необходимо присвоить дескриптор (handle) окна главного приложения тому приложению, которое создается в DLL, - иначе на панели задач будут показаны две кнопки. Далее просто создается форма и вызывается ее метод Show. Данный способ отображения немодальных форм приводит к тому, что из главного приложения указанную функцию можно вызывать неоднократно, создавая тем самым несколько экземпляров формы. Зачастую это оправдано - формы одинакового типа могут содержать, например, разные документы. Но при таком способе отображения рекомендуется сделать обработчик события OnClose для TForm2 и параметру CloseAction присвоить значение caFree - иначе при закрытии формы она будет исчезать с экрана без освобождения системных ресурсов.
Для отображения единственного экземпляра немодальной формы следует немного изменить код:
procedure ShowSingleNonModalForm(AppHandle:THandle); stdcall; begin Application.Handle:=AppHandle; if Assigned(Form2) then Form2.Show else begin Form2:=TForm2.Create(Application); Form2.Show; end; end;
В приведенном выше фрагменте кода первоначально проверяется, создана ли уже эта форма, и если создана - то просто вызывается ее метод Show. В противном случае тот же метод вызывается после отработки конструктора. Вызов метода Show для уже созданного экземпляра формы имеет смысл потому, что пользователь может обратиться к команде отображения формы в тех случаях, когда уже имеющийся экземпляр перекрыт другими окнами и не заметен на экране - вызов метода Show ведет к "всплытию" формы. Переменная Form2 является глобальной.
Оба описанных выше способа вызова немодальных форм не требуют создания специальной процедуры для их разрушения - ресурсы будут корректно освобождены при закрытии приложения, так как приложение является владельцем форм. Код приложения для тестирования этих способов вызова выглядит следующим образом:
procedure ShowNonModalForm(AppHandle: THandle); stdcall; external 'FirstLib.dll' name 'ShowNonModalForm'; procedure ShowSingleNonModalForm(AppHandle: THandle); stdcall; external 'FirstLib.dll' name 'ShowSingleNonModalForm'; procedure TForm1.Button1Click(Sender: TObject); begin ShowNonModalForm(Application.Handle); end; procedure TForm1.Button2Click(Sender: TObject); begin ShowSingleNonModalForm(Application.Handle); end;
Результат работы приложения изображен на рисунке 1 (вариант отображения нескольких немодальных форм):
Рис.1. Результат работы приложения
На следующем шаге мы продолжим изучение этого вопроса.