Код созданного модуля приведите к следующему виду:
library PluginsDemo;
uses
Dialogs,
SysUtils,
Unit1 in 'Unit1.pas' {Form1};
procedure InitPlugin(PlugClass: TPluginInterface); begin
DemoInterface:=PlugClass;
Form1:=TForm1.Create(nil);
PlugClass.AddMenuItem('Показать Plug-in',Form1.ShowMe); PlugClass.AddMenuItem('Простой вызов',Form1.Button1Click); PlugClass.AddMenuItem('Добавить пункт',Form1.Button2Click); end;
exports
InitPlugin;
begin
end.
Самое основное здесь — это процедура InitPlugin. Это как раз та процедура, которая будет вызываться для инициализации дополнительного модуля. В первой строке сохраняется указатель на интерфейс взаимодействия между модулями в переменной DemoInterface. Данную переменную мы пока еще не описали, но сделаем это в ближайшее время. В следующей строке инициализируется форма Form1 , которую мы также сейчас создадим.
После этого, в меню основной программы создаются три пункта меню с помощью вызова метода AddMenuItem объекта PlugClass. В эти пункты передаются их названия и функции-обработчики, которые тоже еще предстоит написать.
Помимо того, что мы создали процедуру, ее нужно объявить как экспортируемую, чтобы внешние программы могли ее увидеть. Для этого процедура должна быть описана в разделе export. Это нужно сделать обязательно!!!
Теперь добавим в нашу библиотеку новую форму. Для этого нужно в меню File открыть подменю New и затем выбрать пункт Form. На новой форме разместим три кнопки:
- Показать диалоговое окно
- Добавить элемент
- Спрятать окно
Внешний вид формы вы можете увидеть на рисунке 7.8. Помимо кнопок на моей форме расположен еще и рисунок, но он использован только для украшения.
Теперь опишем внешний вид интерфейса, с помощью которого происходит взаимодействие между plug-in модулем и главной программой. Для этого в разделе type напишите следующее:
TPluginInterface = class public
function GetApplication: TApplication; virtual; stdcall; abstract;
procedure AddMenuItem(MenuItemCapt: string;
Proc: TNotifyEvent); virtual; stdcall; abstract;
procedure AddItem(Item: String); virtual; stdcall; abstract; end;
Это объявление похоже на то, что мы писали в основной программе. Единственная разница заключается в том, что после каждого имени метода стоит слово abstract. Это слово указывает на то, что метод не будет описан в этом модуле и является абстрактным. Это необходимо, потому что реализация всего объекта находиться в основной программе, а здесь мы делаем только описание, чтобы можно было пользоваться возможностями интерфейса.
В разделе var нужно объявить переменную DemoInterface, в которой будет сохраняться указатель на объект взаимодействия между модулями. Эту переменную мы уже использовали в процедуре InitPlugin, а здесь добавляем ее описание:
var
Form1: TForm1;
DemoInterface: TPluginInterface;
Теперь создадим обработчики события onclick для всех кнопок нашей формы. Для кнопки Показать диалоговое окно пишем следующий код:
procedure TForm1.Button1Click(Sender: TObj ect); begin
ShowMessage('Привет!'); end;
Здесь мы всего лишь отображаем стандартное окно сообщений с надписью "Привет!".
Для кнопки Добавить элемент вставимследующий код:
procedure TForm1.Button2Click(Sender: TObject); begin
DemoInterface.AddItem('Новый элемент'); end;
Здесь мы используем метод AddItem интерфейса для добавления из нашего модуля новой строки в компонент Memo главной программы.
В обработчике события нажатия кнопки Спрятать окно напишете:
begin Hide;
end;
Обратите внимание, что вызывается метод Hide, а не Close. С помощью этого метода окно закрывается, но не уничтожается. Если бы мы написали Close, то после первого закрытия окна оно уничтожилось бы, и в следующий раз мы не смогли бы его отобразить из главного окна. При первой же попытке появилась бы ошибка доступа к памяти.
Помимо этого, в разделе public нужно описать еще два метода, которые мы используем:
public
procedure ShowMe(Sender: TObject); procedure HideMe(Sender: TObj ect);
Реализация этих процедур будет выглядеть следующим образом: procedure TForm1.ShowMe(Sender: TObject); begin Show; end;
procedure TForm1.HideMe(Sender: TObject); begin hide (); end;
Скомпилированный dll-файл нужно поместить в поддиректорию Plugins основной программы. После этого, запустив основную программу и выбрав меню Plug-ins, вы должны увидеть пункты меню с возможностями, предоставляемыми дополнительным модулем (рис. 7.9)
Попробуйте поработать с этой программой, вызывая различные пункты меню. Вы должны понять, как работает основная программа и как она взаимодействует с plugin модулем.