RUS  ENG 

Пример плагина на Delphi (Пошаговый)

24 ноября 2015

Пример плагина на Delphi (Пошаговый)

Данный пример иллюстрирует внедрение плавающей панели ActiveForm в Zulu.

Шаг 0 - Создание формы

На этом нулевом шаге создадим костяк пользовательской формы, которую в дальнейшем подключим к Zulu. Для примера, новая форма будет показывать список станций Петербургского метрополитена.

  • В среде разработки Delphi выбираем пункт меню "File|New|Other...". В открывшейся панели "New Items" переключаемся на закладку ActiveX, выбираем пункт ActiveForm и нажимам кнопку OK.
  • В появившемся мастере создания ActiveForm, в поле New ActiveX Name указыжем имя нового элемента ActiveX, представляющего данную форму. В нашем случаев впишем SamplePlugin. Остальные поля оставим без изменений. После чего нажимаем кнопку OK.
  • Мастер ActiveForm создал новый проект SamplePluginProj1.dpr, который содержит заготовку для нашей формы, представленную юнитом SamplePluginImpl1.pas.
  • На только что созданную форму помещаем компоненты TTable, TDataSource и TDBGrid.
  • Замечание: В архиве исходных текстов данного примера есть директория StepsData, которая содержит файлы слоя "Станции метрополитена" (Metro.b00) и таблицу Station.db с названиями станций.
  • В компоненте Table1 устанавливаем в свойстве TableName путь к таблице "Stations.db". После чего, эти компоненты связываем, установив свойство DataSet у DataSource1 как Table1, а свойство DataSource у DBGrid1 как DataSource1.

В итоге получаем форму, содержащую таблицу станций Петербургского метрополитена. После того, как проект скомпилирован, можно проверить возможность внедрения нашего элемента, например на форму Delphi.

Шаг 1 - Подключение к Zulu

Теперь, имея проект ActiveForm, сделаем так, чтобы эта форма возникала при вызове команды в Zulu. Для этого сделаем следующее:

  • Для того, чтобы иметь возможность работать с объектной моделью Zulu, нужно импортировать библиотеки типов. В меню Project выберем пункт "Import Type Library..." и списке библиотек вкладки "Import Type Library" выберем "Zulu 7.0 Application" и нажмем кнопку "Create Unit". Dephi создаст два модуля Zulu_TLB и сопутствующий ZuluLib_TLB, которые мы включим в проект.
  • Добавим в наш элемент SamplePlugin два метода связи с Zulu: ConnectZuluPlugin и DisconnectZuluPlugin. Откроем редактор библиотеки типов (меню View | Type Library) и добавим методы в интерфейс ISamplePlugin:
    function ConnectZuluPlugin( Conn: IUnknown): Integer;
    и
    procedure DisconnectZuluPlugin;
    Параметр метода ConnectZuluPlugin - объект связи с Zulu, IPluginConnector. Для получения доступа к нему просто запросим этот интерфейс у Conn и сохраним в переменной FConnector:
    Conn.QueryInterface( IID_IPluginConnector, FConnector);
    В дальнейшем этот объект освободим в методе DisconnectZuluPlugin:
    FConnector := nil;
  • Далее добавим метод, который будет выполняться при  команды при вызове команды модуля из Zulu. Назовем этот метод PluginMethod1. Т.о. метод будет выглядеть как:
    function PluginMethod1: Integer;
  • Теперь откроем Редактор Реестра regedit.exe и найдем раздел HLOCAL_MACHINE\Software\Zulu\Plug-Ins (для 64-разрядной Windows раздел будет таким: HLOCAL_MACHINE\Software\Wow6432Node\Zulu\Plug-Ins).
  • Создадим новый ключ, дочерний от Plug-Ins и назовем его SamplePlugin. Это мнемоническое имя нашего модуля. Значение по умолчанию зададим, например, как "Пример плагина на Delphi".
  • Далее задаем, что модуль должен подсоединяться как COM-объект. Для этого добавляем дочерний от SamplePlugin ключ ProgID и его значение по умолчанию указываем как "SamplePluginProj1.SamplePlugin".
  • Для того, чтобы модуль подключался к Zulu, укажем дополнительную команду, по которой это будет происходить. Команда будет звучать, например, как "Открыть форму "Станции метро". Поэтому добавим ключ Commands, дочерний от SamplePlugin, а от него дочерним добавим ключ Open, - это мнемоническое имя нашей команды. Значение по умолчанию ключа Open зададим как "Открыть форму "Станции метро"".
  • Теперь укажем метод нашей ActiveForm, который должен выполняться при вызове команды "Открыть форму "Станции метро"": добавляем ключ Method, дочерний от Open, и задаем ему значение по умолчанию "PluginMethod1".

Замечание: в папках Step1 - Step3 содержится файл регистрации SamplePlugin.reg. Чтобы вручную не повторять операции по редактированию реестра, достаточно импортировать этот файл в Редакторе реестра, либо дважды щелкнуть по нему в Проводнике, чтобы добавить информацию в реестр.

Теперь все готово, чтобы проверить работу ActiveForm в Zulu. Запустим Zulu и выберем пункт меню Сервис|Выполнить|Операцию. В списке дополнительных команд выбираем "Открыть форму "Станции метро" и нажимаем OK. Наша форма появится в плавающей панели.

Шаг 2 - Выполнение команд Zulu

Теперь, когда форма успешно внедряется в Zulu, сделаем так, чтобы при выборе в таблице названии станции метро, соответствующая станция мигала на карте. Для этого проделаем следующее:

В нашей форме заведем обработку события OnDataChange у компонента DataSource1. Текст метода обработки этого события приведен ниже:

procedure TSamplePlugin.DataSource1DataChange(Sender: TObject; Field: TField); var Document: IDocument; Map: IMapDoc; Layer: ILayer; begin // Получаем активный документ в Zulu Document := FConnector.Zulu.ActiveDocument; // Проверяем является ли этот документ картой if Assigned(Document) and (Document.Type_ = eMapDoc) then begin // Получаем интерфейс непосредственно на карту Map := IMapDoc(Document.NativeDoc); // Получаем интерфейс на слой "Схема метрополитена" Layer := Map.Layers.Active; if Assigned( Layer) then begin // Устанавливаем мигающий объект Layer.CurrentID := Table1.Fields[0].AsInteger; end; end; end;

После этого проверим работу нашего модуля. В карту Zulu загружаем слой "Станции метрополитена", который находится в директории StepsData, и делаем его активным. Теперь вызываем команду Открыть форму "Станции метро", как это делали на шаге 1. В появившейся форме будем перемещаться с записи на запись, - соответствующие станции метро будут "загораться" на карте.

Шаг 3 - Обработка событий от Zulu

Расширим возможности нашей формы тем, что при выборе станции на карте будет отображать ее название в таблице. Для этого добавим

  • В редакторе библиотеки типов добавим в интерфейс ISamplePlugin метод:
    function OnZuluEvent( EventID: Integer; Source: IUnknown; Param1, Param2, Param3: OleVariant): Integer;
  • В методе подключения ConnectZuluPlugin установим наш элемент как приемник событий:
    FConnector.SetEventSink( IDispatch(ISamplePlugin(self)));
  • Соответственно в методе отключения DisconnectZuluPlugin будем отключать элемент от приема событий:
    FConnector.SetEventSink( nil);

Теперь при возникновении события от Zulu будет вызываться метод нашей формы OnZuluEvent. Остается добавить текст обработки события evMapCurIDChanged, возникающего при изменении текущего мигающего объекта, как показано во фрагменте программы ниже:

function TSamplePlugin.OnZuluEvent(EventID: Integer; const Source: IUnknown; Param1, Param2, Param3: OleVariant): Integer; var options: TLocateOptions; begin if EventID = evMapCurIDChanged then begin Table1.Locate( 'Sys', Param2, options ); end; end;

Здесь Param1 содержит строку имени слоя, а Param2 - ключ мигающего элемента.

После того как проект будет скомпилирован и элемент будет зарегистрирован, проверим новую возможность. Добавим в карту слой Станции метрополитена и вызовем нашу форму командой Сервис|Выполнить|Операцию. Теперь при выборе "мышью" станций метро на карте, название этой карты будет выделяться в таблице формы Станции метро.


Скачать пример (7.92 МБ)


Возврат к списку

Последнее обновление — 25.11.2015 11:41:39