If f>0 then

FreeAbout(f);

f:=ShowAbout(Handle); end;

Здесь идёт проверка, если f больше нуля, то надо освободить память от старого окна, а потом пытаться создавать новое.

По событию OnClose для главной формы тоже не помешает вызвать процедуру освобождения памяти. Если программа закрывается, то окно из библиотеки уж точно уже не понадобится, значит, переменную f можно проверять на 0 и если там большее значение, то освобождать память.

На компакт диске находится пример, в котором уже реализовано всё сказанное и ты можешь увидеть этот код своими глазами и проверить его в действии.

На компакт диске, в директорииПримерыГлава 18NoModalты можешь увидеть пример этой программы.

 

18.6. Явная загрузка библиотек.

 

редыдущие примеры хороши тем, что они просты, но у них есть недостаток – динамическая библиотека загружается автоматически при старте программы. В этом есть два недостатка. Во-первых, загрузка программы немного теряет в

скорости (не сильно, но всё же), а функции из библиотеки могут вообще не понадобиться за всё время выполнения программы. Во-вторых, тебе может понадобиться поставлять программу в укороченном варианте без некоторых функций (без каких-либо dll файлов), но это не получиться, потому что программа на этапе загрузке будет выдавать ошибку о том, что библиотека не найдена.

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

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

Итак, загружай приложение, написанное в прошлой части, которое использует динамическую библиотеку. В основном модуле убирай объявления функции ShowAbout, чтобы ничего не осталось. Теперь в разделе typeпиши объявление нового типа:

ShowA=function (Handle: THandle):LongInt;stdcall;

Здесь я объявляю новый тип ShowA, который равен функции с параметрами фкнуции ShowAbout из динамической библиотеки. Параметры должны быть точными, как при объявлении, иначе могут возникнуть проблемы.

Всё, этого достаточно. Теперь нужно переходить к обработчику события OnClick для первой кнопки, где мы показывали окно. Подкорректируй уже имеющийся код до следующего:

procedure TForm1.Button1Click(Sender: TObject);

var dllHandle:THandle; sa:ShowA;

begin if f>0 then FreeAbout(f);

dllHandle:=LoadLibrary('ProjectDLL.dll');