Delphi и OpenToolsAPI. Начало.
Однажды я задал себе вопрос: а возможно ли вносить изменения в среду программирования Delphi? Сначала я подумал, что для этого нужно ломать всю его структуру. И на разных форумах Интернета начал задавать подобные вопросы. В результате, наткнулся на такую замечательную вещь, как Open Tools API (OTA). Open Tools API - это набор функций, предназначенных для управления средой программирования. Насколько мне известно, такие функции есть только в Delphi и присутствуют в ней с самого основания.
Итак, на чём же основана эта технология?
Любой программист delphi наверняка устанавливал или разрабатывал компоненты. Компонент - это класс, который добавляется на Palette Components в Delphi. А ведь установка компонента - это тоже изменения, внесённые в среду программирования. Программист разрабатывает Пакет (Package), в него добавляет Юнит, иначе Модуль, в котором описан класс или несколько классов. Также в юните есть загадочная процедура Register. Эта процедура выполняется, когда мы нажимаем кнопку "Установить" в менеджере проектов. То есть, внутри этой процедуры должны содержаться инструкции о том, что нужно делать, чтобы установить данный пакет. Если мы устанавливаем компонент, то мы пишем в этой процедуре только одну функцию: RegisterComponents(вкладка, класс), которая добавляет компонент на палитру. Очевидно, что для того, чтобы внести изменения в среду, нужно работать с этой процедурой. Итак, приступим.
Создаём новый пакет (File - New - Package Delphi). В менеджере проектов выбираем для него подходящее имя. При выборе имени нужно быть внимательным: в системе не должно быть установлено два пакета с одним именем. После этого нажимаем правой кнопкой на строку Requires, в открывшемся меню выбираем пункт Add Reference. В открывшемся окне в поле Package Name пишем designide. Нажимаем OK. Теперь в requires'ах появился новый пункт - designide.dcp. Далее добавим в пакет юнит. Для этого нажимаем правой кнопкой на Contains - Add new - Unit. Юниту тоже нужно дать имя. После этих действий сохраните проект.
Теперь приступаем непосредственно к кодингу. Функции, необходимые для доступа к DelphiAPI находятся в модуле ToolsAPI. Подключите его в раздел uses. Также нам понадобится модуль dialogs.
Теперь нам нужно создать особый класс, который и будет непосредственно вносить изменения. Назовём его TWizard.
type TWizard = class(TNotifierObject, IOTAMenuWizard, IOTAWizard) end;
Теперь поговорим о методах, которые он должен реализовывать.
Первый метод:
function GetMenuText: string;
Эта функция должна возвращать текст пункта меню. По умолчанию наш мастер добавляется в главное меню IDE в подпункт Help. Во второй части мы рассмотрим, как работать с другими пунктами меню.
Второй метод:
function GetName: string;
Функция должна возвращать имя мастера.
Третий метод:
function GetAuthor: string;
Функция должна возвращать имя разработчика.
Четвёртый метод:
function GetIDString: string;
Функция должна возвращать идентификационную строку. Она также не должна повторяться. Обычно эта строка содержит имя автора, и через точку - имя мастера.
Пятый метод:
function GetState: TWizardState;
функция возвращает множество, на основе которого система определяет, каким образом пункт в меню будет отображаться. Будет ли он доступен [wsEnabled], будет ли на нём галочка [wsChecked].
Шестой метод:
procedure Execute;
В этой процедуре описываются действия, которые система должна выполнять, когда пользователь щёлкнул на наш мастер в меню.
Вот что должно получиться:
unit Unit1; interface uses ToolsAPI, dialogs; type TWizard = class(TNotifierObject, IOTAMenuWizard, IOTAWizard) public function GetIDString: string; function GetName: string; function GetState: TWizardState; procedure execute; function GetMenuText: string; end; implementation {TWizard} procedure TWizard.execute; begin ShowMessage('HelloWorld!'); end; function TWizard.GetIDString: string; begin result := 'Darth_Vaider.FirstWizard'; end; function TWizard.GetMenuText: string; begin result := 'Wizard'; end; function TWizard.GetName: string; begin result := 'Darth_Vaider'; end; function TWizard.GetState: TWizardState; begin result := [wsEnabled]; end; end.
То есть, наш мастер появится в меню Help, пункт будет называться Wizard, при нажатии на него выползет сообщение Hello World!
Теперь пора зарегистрировать наш мастер. Как я уже говорил, для этого нужна процедура register. Её следует объявить в разделе interface и реализовать в разделе implementation.
procedure register; begin RegisterPackageWizard(TWizard.Create); end;
Теперь можно установить наш пакет. При удачной установке вы увидите новый пункт в меню Help. Удачи!
Литература. Данный пример можно найти на многих интернет-ресурсах. И на этом почти везде заканчивается. В иностранных источниках можно найти более подробные примеры. Но часто они не работают, возможно, не подходят к моему Delphi XE. Наиболее полную информацию я нашёл на сайте http://www.gexperts.org/
| Вложение | Размер |
|---|---|
| example.zip | 854 байта |
- Darth_Vaider's блог
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
- 1463 просмотра



Комментарии
12 комментария(ев)Дата: Втр, 25/10/2011 - 02:42
А чем это дело отличается от плагинов?
Дата: Втр, 25/10/2011 - 03:33
Я ни разу не встречал фразы "Плагины для делфи". А по запросу гугл выдаёт как вообще делаются плагины.
А по существу - это в принципе и есть плагин. Увеличивает возможности программы.
Дата: Втр, 25/10/2011 - 04:11
Ну раз это похоже на плагин, почему вы тогда пишите что это только в Дельфи? По моему к любой более менее уважающей себя среде, можно писать плагины.
Дата: Втр, 25/10/2011 - 02:44
Т.е. можно выбирать между
function GetAuthor: string;и
function GetIDString: string;??? Брать любой из них? Что будет если оба метода прописать?
Дата: Втр, 25/10/2011 - 03:41
Нет, это я ошибся. Поправил
Реализованы должны быть все методы.
Дата: Втр, 25/10/2011 - 04:09
А почему в тексте кода всего 5 методов вместо шести?
Дата: Втр, 25/10/2011 - 03:44
Судя по этой фразе, автор топика не знаком с MS Visual Studio
Дата: Втр, 25/10/2011 - 04:05
Нет, с Visual Studio я знаком, но о подобных функциях не слышал.
Дата: Втр, 25/10/2011 - 04:17
]]>http://msdn.microsoft.com/ru-ru/library/esk3eey8.aspx]]>
]]>http://visualstudiogallery.msdn.microsoft.com/]]>
Дата: Втр, 25/10/2011 - 05:04
Для VS есть куча плагинов, ReSharper например
Дата: Втр, 25/10/2011 - 15:33
...хотелось-бы увидеть продолжение материала в контексте интеграции системы контроля версий в IDE с помощью OTA.
Дата: СР, 26/10/2011 - 02:59
Насколько мне известно, эта возможность была добавлена недавно. Если мне удастся найти и переварить этот материал, я обязательно его опубликую.