Обидва описаних вище способу виклику немодального форм не вимагають створення спеціальної процедури для їх руйнування. Ресурси будуть коректно звільнені при закритті програми, так як програма є власником форм. Код додатку для тестування цих методів виглядає наступним чином:
procedure ShowNonModalForm (AppHandle: THandle); stdcall; 'NMStat.dll' name 'ShowNonModalForm'; ShowSingleNonModalForm (AppHandle: THandle); stdcall; 'NMStat.dll' name 'ShowSingleNonModalForm';
TForm1.Button1Click (Sender: TObject); (Application.Handle);;
TForm1.Button2Click (Sender: TObject); (Application.Handle);;
Іноді виникає необхідність показу немодального форм з динамічно завантажуваних DLL, наприклад при рідкісному використанні в додатку немодального форм для економії ресурсів. Якщо реалізувати код так само, як і при показі модальних діалогів, то форма буде створена і, може бути, навіть показана на екрані. Але після цього відбудеться вивантаження DLL, а потім негайно послідують винятку, оскільки в пам'яті комп'ютера буде відсутній код для роботи з елементами управління форми. Традиційне рішення цієї проблеми виглядає наступним чином: завантажується динамічна бібліотека, в якості одного з параметрів передається адреса методу головного додатки, який буде викликаний при закритті немодального форми - звичайно в обробнику події OnDestroy. Цей метод повинен інформувати головне додаток про необхідність вивантаження DLL з пам'яті комп'ютера, але DLL повинна вивантажуватися після завершення його роботи (і, отже, після завершення роботи деструктора форми) - інакше можливе виключення через відсутність коду в пам'яті комп'ютера. Вивантаження DLL після завершення роботи програми [U7] досягається з використанням асинхронної розв'язки - посилки повідомлення методом PostMessage якомусь вікна програми, зазвичай головній формі. Наведемо код реалізації даної технології в DLL:
= procedure; stdcall;
TForm1 = class (TForm): TMemo; FormDestroy (Sender: TObject); FormClose (Sender: TObject; var Action: TCloseAction);
{Private declarations}
{Public declarations}: TNotifyClose;;
: TForm1;
{$ R *. DFM}
TForm1.FormDestroy (Sender: TObject); Assigned (FNC) then FNC;;
DynNonmodal (AppHandle: THandle; NC: pointer); stdcall; export;. Handle: = AppHandle; Assigned (Form1) then Form1.Show else begin: = TForm1.Create (Application);. FNC : = TNotifyClose (NC);
Form1.Show;;;
Додаток, що використовує цю DLL, має наступний код (WM_DLLUNLOAD визначена як константа в секції interface модуля):
type = procedure (AppHandle: THandle; NC: pointer); ...