![]() |
|
сделать стартовой | добавить в избранное |
![]() |
Использование открытых интерфейсов среды программирования Delphi |
Одной и наиболее сильных сторон среды программирования Delphi является ее открытая архитектура, благодаря которой Delphi допускает своего рода метапрограммирование, позволяя “программировать среду программирования”. Такой подход переводит Delphi на качественно новый уровень систем разработки приложений и позволяет встраивать в этот продукт дополнительные инструментальные средства, поддерживающие практически все этапы создания прикладных систем. Столь широкий спектр возможностей открывается благодаря реализованной в Delphi концепции так называемых открытых интерфейсов, являющихся связующим звеном между IDE (I egra ed Developme E viro me ) и внешними инструментами. Данная статья посвящена открытым интерфейсам Delphi и представляет собой обзор представляемых ими возможностей. В Delphi определены шесть открытых интерфейсов: ool I erface, Desig I erface, Exper I erface, File I erface, Edi I erface и Versio Co rol I erface. Вряд ли в рамках данной статьи нам удалось бы детально осветить и проиллюстрировать возможности каждого из них. Более основательно разобраться в рассматриваемых вопросах вам помогут исходные тексты Delphi, благо разработчики снабдили их развернутыми комментариями. Объявления классов, представляющих открытые интерфейсы, содержатся в соответствующих модулях в каталоге .DelphiSource oolsAPI. Desig I erface (модуль Dsg I f.pas) предоставляет средства для создания редакторов свойств и редакторов компонентов. Редакторы свойств и компонентов – это тема, достойная отдельного разговора, поэтому напомним лишь, что редактор свойства контролирует поведение Инспектора Объектов при попытке изменить значение соответствующего свойства, а редактор компонента активизируется при двойном нажатии левой кнопки мыши на изображении помещенного на форму компонента. Versio Co rol I erface (модуль VCSI f.pas) предназначен для создания систем контроля версий. Начиная с версии 2.0, Delphi поддерживает интегрированную систему контроля версий I ersolv PVCS, поэтому в большинстве случаев в разработке собственной системы нет необходимости. По этой причине рассмотрение Versio Co rol I erface мы также опустим. File I erface (модуль FileI f.pas) позволяет переопределить рабочую файловую систему IDE, что дает возможность выбора собственного способа хранения файлов (в Memo-полях на сервере БД, например). Edi I erface (модуль Edi I f.pas) предоставляет доступ к буферу исходных текстов, что позволяет проводить анализ кода и выполнять его генерацию, определять и изменять позицию курсора в окне редактора кода, а также управлять синтаксическим выделением исходного текста. Специальные классы предоставляют интерфейсы к помещенным на форму компонентам (определение типа компонента, получение ссылок на родительский и дочерние компоненты, доступ к свойствам, передача фокуса, удаление и т.д.), к самой форме и к ресурсному файлу проекта. Также Edi I erface позволяет идентифицировать так называемые модульные нотификаторы, определяющие реакцию на такие события, как изменение исходного текста модуля, модификация формы, переименование компонента, сохранение, переименование или удаление модуля, изменение ресурсного файла проекта и т.
д. ool I erface (модуль oolI f.pas) предоставляет разработчикам средства для получения общей информации о состоянии IDE и выполнения таких действий, как открытие, сохранение и закрытие проектов и отдельных файлов, создание модуля, получение информации о текущем проекте (число модулей и форм, их имена и т. д.), регистрация файловой системы, организация интерфейсов к отдельным модулям и т.д. В дополнение к модульным нотификаторам ool I erface определяет add-i нотификаторы, уведомляющие о таких событиях, как открытие/закрытие файлов и проектов, загрузка и сохранение desk op-файла проекта, добавление/исключение модулей проекта, инсталляция/деинсталляция пакетов, компиляция проекта, причем в отличие от модульных нотификаторов add-i нотификаторы позволяют отменить выполнение некоторых событий. Кроме того, ool I erface предоставляет средства доступа к главному меню IDE Delphi, позволяя встраивать в него дополнительные пункты. Exper I erface (модуль Exp I f.pas) представляет собой основу для создания экспертов — программных модулей, встраиваемых в IDE c целью расширения ее функциональности. В качестве примера эксперта можно привести входящий в Delphi Da abase Form Wizard, выполняющий генерацию формы для просмотра и изменения содержимого таблицы БД. Определив класс эксперта, необходимо позаботиться о том, чтобы Delphi “узнала” о нашем эксперте. Для этого его нужно зарегистрировать посредством вызова процедуры Regis erLibraryExper , передав ей в качестве параметра экземпляр класса эксперта. В качестве иллюстрации создадим простой эксперт в стиле esS a dard, который при выборе соответствующего ему пункта меню Delphi выводит сообщение о том, что он запущен. Как видно из вышеприведенной таблицы, стиль esS a dard обязывает перекрыть шесть методов: Для того чтобы эксперт был “приведен в действие”, необходимо выбрать пункт меню Compo e /I s all Compo e . , выбрать в диалоге Browse модуль, содержащий эксперт (в нашем случае exmpl 01.pas), нажать ОК, и после компиляции пакета dclusr30.dpk в главном меню Delphi в разделе Help должен появиться пункт Simple Exper 1, при выборе которого появляется информационное сообщение “S a dard Exper s ar ed!”. Почему Delphi помещает пункт меню эксперта в раздел Help, остается загадкой. Если вам не нравится то, что пункт меню появляется там, где угодно Delphi, а не там, где хотите вы, возможен следующий вариант: создать эксперт в стиле add-i , что исключает автоматическое создание пункта меню, а пункт меню добавить “вручную”, используя средства ool I erface. Это позволит задать местоположение нового пункта в главном меню произвольным образом. Для добавления пункта меню используется класс I oolServices — основа ool I erface — и классы IMai Me uI f, IMe uI emI f, реализующие интерфейсы к главному меню IDE и его пунктам. Экземпляр oolServices класса I oolServices создается самой IDE при ее инициализации. Обратите внимание на то, что ответственность за освобождение интерфейсов к главному меню Delphi и его пунктам целиком ложится на разработчика. Попутно немного усложним функциональную нагрузку эксперта: при активизации своего пункта меню он будет выдавать справку об имени проекта, открытого в данный момент в среде: В этом примере центральное место занимает функция AddIDEMe uI em, осуществляющая добавление пункта меню в главное меню IDE Delphi.
В качестве параметров ей передаются текст нового пункта меню, его идентификатор, идентификатор пункта, перед которым вставляется новый пункт, символьное представление клавиши, которая вместе с клавишей C rl может использоваться для быстрого доступа к новому пункту, и обработчик события, соответствующего выбору нового пункта. Мы добавили новый пункт меню в раздел View перед пунктом Wa ches. Теперь познакомимся с нотификаторами. Определим add-i нотификатор, отслеживающий моменты закрытия/открытия проектов и корректирующий соответствующим образом поле, хранящее имя активного проекта (реализацию методов, не претерпевших изменений по сравнению с тпредыдущим примером, для краткости опустим): Для реализации нотификатора мы определили класс AddI o ifier, являющийся потомком IAddI o ifier, и перекрыли метод File o ifica io . IDE будет вызывать этот метод каждый раз, когда происходит событие, на которое способен среагировать add-i нотификатор (каждое такое событие обозначается соответствующей константой типа File o ifica io ). Поле Exper в классе AddI o ifier служит для обратной связи с экспертом (метод AddI o ifier.File o ifica io ). В деструкторе эксперта регистрация нотификатора снимается, и нотификатор уничтожается. А теперь проиллюстрируем использование модульных нотификаторов. Создадим add-i эксперт, выдающий сообщения о каждом акте сохранения проектного файла (реализацию уже знакомых нам методов для краткости не приводим): В данном примере add-i эксперт отслеживает события, соответствующие открытию/закрытию проектов. При каждом открытии проекта регистрируется модульный нотификатор, соответствующий файлу проекта. В плане реализации модульные нотификаторы схожи с add-i нотификаторами: мы определяем класс Module o ifier, являющийся потомком IModule o ifier и перекрываем его методы o ify и Compo e Re amed. IDE вызывает метод o ify при возникновении определенных событий, имеющих отношение к данному модулю; внутри этого метода и определяется реакция на то или иное событие. Метод Compo e Re amed вызывается при изменении имени компонента, лежащего на форме модуля. Обратите внимание на то, что мы не используем этот метод, но обязаны его перекрыть, иначе при изменении имени компонента будет происходить вызов абстрактного метода базового класса, что приводит к непредсказуемым последствиям. Регистрация модульного нотификатора является несколько более сложным процессом по сравнению с регистрацией add-i нотификатора: сначала мы получаем интерфейс модуля ( IModuleI erface), а затем с помощью интерфейса модуля регистрируем нотификатор. При закрытии проекта регистрация модульного нотификатора снимается (снова с использованием IModuleI erface), и нотификатор уничтожается. В заключение покажем, как можно определять позицию курсора в окне редактора кода. Создадим эксперт, который при выборе соответствующего пункта меню выдавал бы сообщение, содержащее имя активного файла и позицию курсора в нем (приведена реализация только существенных для данного примера методов): Для определения позиции курсора мы должны получить следующую последовательность интерфейсов: модульный интерфейс ( IModuleI erface); интерфейс редактора кода ( IEdi orI erface); интерфейс представления модуля в окне редактора ( IEdi View).
Первый вариант предпочтительнее, так как многие компиляторы выдают несколько более эффективный код, когда использован крайний левый базовый класс[1]. Использование указателей интерфейса СОМ Программисты C++ должны использовать методы IUnknown явно, потому что перевод модели СОМ на язык C++ не предусматривает использования среды поддержки выполнения (runtime layer) между кодом клиента и кодом объекта. Поэтому IUnknown можно рассматривать просто как набор обещаний, которые все программисты СОМ дают друг другу. Это дает преимущество программистам C++, так как C++ может создавать код, который потенциально более эффективен, чем языки, которые требуют такого динамического слоя при работе с СОМ. При работе на Visual Basic и Java, в отличие от C++, программисты никогда не видят QueryInterface, AddRef или Release. Для этих двух языков детали IUnknown надежно скрыты за поддерживающей эти языки виртуальной машиной. На Java QueryInterface просто отображается в приведение типа: public void TryToSnoreAndIgnore(Object obj) { IPug pug; try { pug = (IPug)obj; // VM calls QueryInterface // VM вызывает QueryInterface pug.Snore(); } catch (Throwable ex) { // ignore method or QI failures // игнорируем сбой метода или QI } ICat cat; try { cat = (ICat)obj; // VM calls QueryInterface // VM вызывает QueryInterface cat.IgnoreMaster(); } catch (Throwable ex) { // ignore method or QI failures // игнорируется сбой метода или QI } } Visual Basic не требует от клиентов приведения типов
1. Программирование на Object Pascal в среде Delphi
3. Экономическая сказка-реферат "НДС - вражья морда" или просто "Сказка про НДС"
4. Несколько рефератов по культурологии
5. Реферат по научной монографии А.Н. Троицкого «Александр I и Наполеон» Москва, «Высшая школа»1994 г.
10. Записная книжка на Delphi 7
11. Учебник по Delphi 7 для начинающих
12. Реферат по технологии приготовления пищи "Венгерская кухня"
13. Несколько рефератов по Исламу
14. "Камю", "Сартр", "Шопенгауэр", "Ясперс", "Фромм" (Рефераты, доклады по философии)
15. Реферат по информационным системам управления
16. Семь чудес света - древний мир, средние века и наше время (история цивилизации, реферат)
17. Реферат по книге Н. Цеда Дух самурая - дух Японии
18. Окно в мир евангельских истин. Пословицы и притчи в поэме Гоголя "Мертвые души"
19. Обзорный реферат по творчеству Ф.И. Тютчева
20. Космический телескоп GALEX – новое окно во Вселенную
21. Окно души и тела
25. Реферат монографии А.А. Смирнова Проблемы психологии памяти
27. Реферат кондитерское изделие
28. Реферат по статье Гадамера Неспособность к разговору
29. Реферат Евро
30. Реферат о прочитаной на немецком языке литературы
31. Реферат для выпускных экзаменов
33. ДЫХАНИЕ - реферат за 9-й класс
36. Визуальное программирование в Delphi
37. Разработка DLL в Borland Delphi
42. Управление проектом Delphi
45. Программирование с помощью Delphi
48. Delphi или Visual C++ - вот в чем вопрос
49. OpenGL и Delphi на практике
52. Географические наименования — окна в прошлое
58. Программирование на Delphi с алгоритмами и кодами
59. Работа с окнами
60. Работа с окнами приложений
62. Середовище програмування Borland Delphi
63. Современные операционные системы и системное программирование в Delphi
64. Создание программы на языке Delphi 7.0
65. Створення таблиць за допомогою SQL-запитів в середовищі DELPHI
66. Типы данных в Object Pascal
67. Языка программирования Delphi. Разработка практических заданий
68. Реферат Политико-правовые взгляды М.М. Сперанского и Н.М. Карамзина
69. Особенности системы мотивации персонала ООО "Окна Саратова"