Создание и использование 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. Результат работы приложения

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий