Включение в библиотеку формDelphi , Файловая система , DLL и PlugInsНесмотря на то, что DLL не имеет собственной формы, с ее помощью можно вызывать формы из связанных с библиотекой модулей. Для этого в библиотеке используется ссылка uses на связанные модули-формы и объявляются экспортируемые из DLL подпрограммы, в которых реализуется вызов соответствующих форм. В следующем примере иллюстрируется техника включения в DLL формы и использования ее в вызывающей программе. Текст DLL library DLLWithForm; uses SysUtils, Classes, DLLFormU in 'DLLFormU.pas' {DLLForm}; {$R *.RES} exports ShowModalForm, ShowForm, FreeForm; begin end. Текст формы в DLL unit DLLFormU; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, Buttons; type TDLLForm = class(TForm)BitBtnl: TBitBtn; BitBtn2: TBitBtn; procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } CallForm: THandle; //Дескриптор вызывающей формы public { Public declarations } end; // Объявление экспортируемых подпрограмм function ShowModalForm: Integer; procedure ShowForm(aHandle: THandle); procedure FreeForm; var DLLForm: TDLLForm; implementation {$R *.DFM} // Модальный вызов function ShowModalForm: Integer; begin DllForm := TDllForm.Create(Application); Result := DLLForm.ShowModal; DLLForm.Free; end; // Немодальный вызов procedure ShowForm(Appl, Form: THandle); begin Application.Handle := Appl; // Замена объекта Application DllForm := TDllForm.Create(Application); // Запоминаем дескриптор вызывающего окна для посылки // ему сообщения о закрытии CallForm := Form; DLLForm.Show end; // Уничтожение формы procedure FreeForm; begin DLLForm.Free end; procedure TDLLForm.FormClose(Sender: TObject; var Action: TCloseAction); begin if CallForm > O then SendMessage(CallForm, wm_User, 0, 0) end; end. Текст вызывающей программы unit TestMainU; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TTestMain = class(TForm) Buttoni: TButton; // Открыть в модальном режиме Button2: TButton; // Открыть в немодальном режиме Button3: TButton; // Закрыть окно label I: TLabel; procedure ButtonlClick(Sender: TObject); procedure Button2Click(Sender: TObject); procedure ButtonSClick(Sender: TObject); private { Private declarations } public { Public declarations } procedure WMUser(var Msg: TMessage); message WM_USER; end; var TestMain: TTestMain; implementation {$R *.DFM} function ShowModalForm: Integer; external 'DLLWithForm'; procedure ShowForm(Appl, Form: THandle); external ' DLLWithForm'; procedure FreeForm; external 'DLLWithForm'; // Модальный вызов procedure TTestMain.ButtonlClick(Sender: TObject); begin Button2.Enabled := False; label1.Caption := 'ModalResult = ' + IntToStr(ShowModalForm); label1.Show; // Показываем результат вызова Button2.Enabled := True end; // Немодальный вызов procedure TTestMain.Button2Click(Sender: TObject); begin Buttoni.Enabled := = False; Button2.Enabled := False; Buttons.Enabled := True; label 1. Hide; ShowForm(Application.Handle, Self.Handle); end; // Закрыть форму procedure TTestMain.Button3Click(Sender: TObject); begin FreeForm; Button1.Enabled := True; Button2.Enabled := True; Button3.Enabled := False; end; // Сообщение из формы DLL о ее закрытии procedure TTestMain.WMUser(var Msg: TMessage); begin Buttons.Click end; end. Модуль формы DLLForm, помещенной в DLL, ссылается на стандартный модуль Forms и таким образом получает свой глобальный объект Application, который ничего “не знает” о глобальном объекте вызывающей программы (см. гл. 21). В режиме модального вызова это не имеет особого значения, т. к. модальное окно блокирует работу вызывающей программы. В режиме немодального вызова следует синхронизовать действия объектов, в противном случае минимизация главного окна, например, не приведет к минимизации окна DLL. Синхронизация достигается тем, что дескриптор объекта Application DLL заменяется на соответствующий дескриптор вызывающей программы. При показе формы в немодальном режиме она может быть закрыта щелчком по собственной системной кнопке закрыть. В этом случае она должна каким-то образом известить вызывающую программу об этом событии. Для этого используется стандартный механизм посылки вызывающей форме Windows-сообщения. Сообщение должно иметь адрес, в роли которого используется дескриптор окна, получающего это сообщение. Вот почему вторым параметром обращения к функции ShowForm в DLL передается и в поле CallForm: запоминается дескриптор вызывающего окна. Обработчик события enclose формы проверяет это поле и, если оно определено, посылает вызывающему окну сообщение с индексом wm_user. В вызывающей программе предусмотрен обработчик этого сообщения, в котором реализуются необходимые действия. В статье описывается способ включения форм из DLL-библиотеки в вызывающую программу и синхронизации ее работы с объектом Application. Комментарии и вопросыПолучайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта. :: Главная :: DLL и PlugIns ::
|
||||
©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007 |