Шаг 312.
Создание внутрипроцессных серверов автоматизации. Создание и использование DLL. Немодальные формы в DLL

    На этом шаге мы рассмотрим отображение немодальных форм при статической загрузке 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;
Текст этого приложения вместе с DLL можно взять здесь (436,7 Кб).

    Результат работы приложения изображен на рисунке 1 (вариант отображения нескольких немодальных форм):


Рис.1. Результат работы приложения

    На следующем шаге мы продолжим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг