Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Exports ShowAbout index 10; exports FreeAbout index 11;



Теперь переходим в модуль Unit1, где у нас находиться форма динамической библиотеки. Процедуру ShowAbout я превращаю в функцию, которая будет возвращать значение типа LongInt. В качестве возвращаемого значения будет идентификатор окна, по которому мы потом будет его закрывать.

Ещё нужно добавить процедуру FreeAbout с одним параметром типа LongInt.

function ShowAbout(Handle: THandle):LongInt;export;stdcall; procedure FreeAbout(FormRef: LongInt);export;stdcall;

Как я уже говорил, динамические библиотеки не могут хранить переменных. Именно поэтому после создания окна мы должны вернуть идентификатор основной программе, чтобы она хранила эту переменную. Когда нужно будет закрыть окно, мы передадим этот идентификатор библиотеке, и она освободит память, выделенную под окно.

Теперь посмотрим на реализацию функции ShowAbout:

function ShowAbout(Handle: THandle):LongInt;

begin Application.Handle:= Handle; Form1:= TForm1.Create(Application); Form1.Show; Result:=LongInt(Form1);

End;

Здесь всё осталось также, за исключением последней строчки. Если раньше мы освобождали память, то сейчас возвращаем окно Form1 приведённую к типу Integer. Если бы мы тут вызвали метод Free, то окно сразу же после появления закрылось бы.

Теперь посмотрим на процедуру FreeAbout:

procedure FreeAbout(FormRef: LongInt); begin if FormRef>0 then TForm1(FormRef).Free; end;

В этой процедуре мы сначала проверяем, если переменная FormRef (идентификатор окна) больше нуля, то окно можно уничтожать, иначе оно могло быть уже уничтожено. Во второй строке я вызываю метод Free нашего окна. Так как переменная FormRef – это числовая переменная и у неё нет методов, то мы должны перевести её обратно к объекту - TForm1(FormRef).

Теперь подкорректируем проект, который использует DLL файл. Для начала подправь объявления процедур библиотеки. Перед разделом type напиши следующее:

function ShowAbout(Handle: THandle):LongInt;stdcall; procedure FreeAbout(FormRef: LongInt);export;stdcall

В разделе var пишем следующее:

function ShowAbout;external 'ProjectDLL.dll' index 10; procedure FreeAbout;external 'ProjectDLL.dll' index 11;

Всё это уже должно быть знакомо и не должно вызывать вопросов. Теперь в разделе private объекта главной формы добавляем переменную f типа LongInt.

Подготовка закончено. Осталось только вызвать эти процедуры. Добавь на форму ещё одну кнопку. По нажатию первой, мы будем показывать окно:

procedure TForm1.Button1Click(Sender: TObject); begin f:=ShowAbout(Handle); end;

Здесь я вызываю функцию показа окна и сохраняю результат в переменной. По нажатию второй кнопки вызываем процедуру освобождения памяти:

procedure TForm1.Button2Click(Sender: TObject); begin FreeAbout(f); end;

Запусти пример и убедись, что всё работает корректно. Самое сложное здесь – определить, когда пользователь самостоятельно закрыл окно (например, кнопкой «Закрыть» в нашем окне «О программе»), чтобы мы вызвали процедуру FreeAbout. В качестве решения такой проблемы могу посоветовать следующее. При старте приложения присваивать переменной f значение 0. В этом случае, мы будем застрахованы от попадания в неё случайного числа. Перед созданием окна вызывать FreeAbout. В этом случае, сначала будет происходить проверка переменной f на ноль. Если переменная больше 0, то окно уже создавалось, но память не освободилась. Вот обновлённый код нажатия кнопки показа диалогового окна:

procedure TForm1.Button1Click(Sender: TObject); begin

if f>0 then





Дата публикования: 2014-11-28; Прочитано: 228 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...