Главная » Delphi » Отображение немодальных форм из библиотек DLL

0

Для  иллюстрации  размещения  в  библиотеке  DLL  немодальных  форм  вновь  вос

пользуемся формой с календарем из предыдущего раздела.

Для отображения из библиотеки немодальных форм  такая  DLL должна  содержать две функции. На первую возлагается задача создания и отображения формы, а на вто рую — ее освобождения. В листинге 6.4 представлен исходный код, иллюстрирующий вывод немодальной формы функциями DLL.

Листинг 6.4. Немодальная форма в библиотеке  DLL

unit DLLFrm;interface

uses

SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics,

Controls, Forms, Dialogs, Grids, Calendar;

type

TDLLForm = class(TForm)

calDllCalendar: TCalendar;

end;

{ Объявление экспортируемых функций }

function ShowCalendar(AHandle: THandle;

ACaption: String): Longint; stdcall;

procedure CloseCalendar(AFormRef: Longint); stdcall;

implementation

{$R *.DFM}

function ShowCalendar(AHandle: THandle;

ACaption: String): Longint;

var

DLLForm: TDllForm;

begin

// Копирование дескриптора приложения в объект TApplication

// библиотеки DLL.

Application.Handle := AHandle;

DLLForm := TDLLForm.Create(Application);

Result := Longint(DLLForm);

DLLForm.Caption := ACaption;

DLLForm.Show;

end;

procedure CloseCalendar(AFormRef: Longint);

begin

if AFormRef > 0 then

TDLLForm(AFormRef).Release;

end;

end.Данный пример содержит два метода:  ShowCalendar() и CloseCalendar(). Ме тод ShowCalendar() похож  на одноименную функцию из примера с модальной фор мой тем,  что  дескриптор вызывающего приложения присваивается свойству  Handle объекта приложения функции DLL, после  чего  создается сама форма. Но  вместо  вы зова метода  ShowModal() эта функция вызывает метод Show() и при  этом не освобо ждает форму.  Обратите внимание на то, что она возвращает значение типа  longint, в роли  которого выступает экземпляр DLLForm. Все дело в том, что ссылка на создан ную форму  должна  быть  сохранена, поэтому  забота  о сохранении ссылки  на форму поручается вызывающему приложению. Подобная забота распространяется на все эк земпляры формы, связанные с любыми  приложениями, вызывающими эту функцию библиотеки DLL и создающими собственные экземпляры данной формы.

В  процедуре  CloseCalendar() просто  проверяется  корректность  ссылки   на форму  и вызывается ее метод  Release(). Здесь  вызывающее приложение должно передать обратно ту же самую ссылку, которая была ранее получена от функции ShowCalendar().

При использовании такого подхода нужно иметь в виду, что библиотека DLL нико

гда не  освобождает форму.  Если  предпринять подобную  попытку  (например попы таться   вернуть  значение caFree функции  CanClose()),  то  обращение к функции CloseCalendar() приведет к возникновению аварийной ситуации.

Демонстрационные примеры модальной и немодальной форм  находятся  на  при

лагаемом компакт диске (см. также www.williamspublishing.com).

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии