Використання відкритих інтерфейсів середовища
програмування Delphi h2>
Однією
і найбільш сильних сторін середовища програмування Delphi є її відкрита
архітектура, завдяки якій Delphi допускає свого роду
метапрограмування, дозволяючи "програмувати середовище програмування". Такий
підхід переводить Delphi на якісно новий рівень систем розробки
додатків і дозволяє вбудовувати в цей продукт додаткові
інструментальні засоби, що підтримують практично всі етапи створення
прикладних систем. Настільки широкий спектр можливостей відкривається завдяки
реалізованої в Delphi концепції так званих відкритих інтерфейсів,
що є сполучною ланкою між IDE (Integrated Development Environment) і
зовнішніми інструментами. p>
Дана
стаття присвячена відкритим інтерфейсів Delphi і являє собою огляд
що представляються ними можливостей. У Delphi визначено шість відкритих інтерфейсів:
Tool Interface, Design Interface, Expert Interface, File Interface, Edit
Interface та Version
Control Interface. Навряд чи в рамках даної статті нам вдалося б
детально висвітлити і проілюструвати можливості кожного з них. Більше
грунтовно розібратися в розглянутих питаннях вам допоможуть вихідні тексти
Delphi, благо розробники забезпечили їх розгорнутими коментарями. Оголошення
класів, що представляють відкриті інтерфейси, що містяться у відповідних
модулях в каталозі ... DelphiSourceToolsAPI. Design Interface (модуль DsgnIntf.pas)
надає кошти для створення редакторів властивостей і редакторів
компонентів. p>
Редактори
властивостей і компонентів - це тема, гідна окремої розмови, тому
нагадаємо лише, що редактор властивості контролює поведінку Інспектори Об'єктів
при спробі змінити значення відповідного властивості, а редактор компонента
активізується при подвійному натисканні лівої кнопки миші на зображенні поміщеного
на форму компоненту. Version Control Interface (модуль VCSIntf.pas)
призначений для створення систем контролю версій. Починаючи з версії 2.0, Delphi
підтримує інтегровану систему контролю версій Intersolv PVCS, тому в
більшості випадків у розробці власної системи немає необхідності. З цієї
причини розгляд Version Control Interface ми також опустимо. File Interface
(модуль FileIntf.pas) дозволяє перевизначити робочу файлову систему IDE,
що дає можливість вибору власного способу зберігання файлів (в Memo-полях
на сервері БД, наприклад). Edit Interface (модуль EditIntf.pas) надає
доступ до буфера початкових текстів, що дозволяє проводити аналіз коду і
виконувати його генерацію, визначати і змінювати позицію курсора у вікні редактора
коду, а також керувати синтаксичним виділенням вихідного тексту. p>
Спеціальні
класи надають інтерфейси до поміщеним на форму компонентів (визначення
типу компонента, отримання посилань на батьківський і дочірні компоненти, доступ
до властивостей, передача фокусу, видалення і т.д.), до самої формі і до ресурсного
файлу проекту. Також Edit Interface дозволяє ідентифікувати так звані
модульні нотіфікатори, що визначають реакцію на такі події, як зміна
вихідного тексту модуля, модифікація форми, перейменування компонента,
збереження, перейменування або видалення модуля, зміна ресурсного файла
проекту і т. д. Tool Interface (модуль ToolIntf.pas) надає
розробникам засоби для отримання загальної інформації про стан IDE і
виконання таких дій, як відкриття, збереження та закриття проектів і
окремих файлів, створення модуля, отримання інформації про поточний проект
(число модулів і форм, їх імена і т. д.), реєстрація файлової системи,
організація інтерфейсів до окремих модулів і т.д. На додаток до модульних
нотіфікаторам Tool Interface визначає add-in нотіфікатори, повідомляючі про
такі події, як відкриття/закриття файлів і проектів, завантаження і збереження
desktop-файла проекту, додавання/виключення модулів проекту,
інсталяція/деінсталяція пакетів, компіляція проекту, причому на відміну від
модульних нотіфікаторов add-in нотіфікатори дозволяють скасувати виконання
деяких подій. p>
Крім
того, Tool Interface надає засоби доступу до головного меню IDE Delphi,
дозволяючи вбудовувати в нього додаткові пункти. Expert Interface (модуль
ExptIntf.pas) являє собою основу для створення експертів - програмних
модулів, що вбудовуються в IDE c метою розширення її функціональності. В якості
експерта прикладу можна навести що входить в Delphi Database Form Wizard,
виконує генерацію форми для перегляду та зміни вмісту таблиці БД.
Визначивши клас експерта, необхідно подбати про те, щоб Delphi "дізналася"
про наш експерта. Для цього його потрібно зареєструвати за допомогою дзвінка
процедури RegisterLibraryExpert, передавши їй як параметр примірник
класу експерта. Як ілюстрацію створимо простий експерт у стилі
esStandard, який при виборі відповідного йому пункту меню Delphi виводить
повідомлення про те, що він запущений. Як видно з вищенаведеної таблиці, стиль
esStandard зобов'язує перекрити шість методів: p>
Для
того щоб експерт був "приведений в дію", необхідно вибрати пункт меню
Component/Install Component ... , Вибрати в діалозі Browse модуль, що містить
експерт (у нашому випадку exmpl_01.pas), натиснути ОК, і після компіляції пакета
dclusr30.dpk в головному меню Delphi у розділі Help має з'явитися пункт Simple
Expert 1, при виборі якого з'являється інформаційне повідомлення "Standard
Expert started! ". Чому Delphi поміщає пункт меню експерта в розділ Help,
залишається загадкою. Якщо вам не подобається те, що пункт меню з'являється там, де
завгодно Delphi, а не там, де хочете ви, можливий наступний варіант: створити
експерт у стилі add-in, що виключає автоматичне створення пункту меню, а
пункт меню додати "вручну", використовуючи кошти Tool Interface. Це дозволить
задати місце розташування нового пункту в головному меню довільним чином. p>
Для
додати пункту меню використовується клас TIToolServices - основа Tool
Interface - і класи TIMainMenuIntf, TIMenuItemIntf, що реалізують інтерфейси до
головне меню, IDE і його пунктів. Примірник ToolServices класу TIToolServices
створюється самою IDE при її ініціалізації. Зверніть увагу на те, що
відповідальність за звільнення інтерфейсів до головного меню Delphi і його
пунктам цілком лягає на розроблювача. Попутно трохи ускладнимо
функціональне навантаження експерта: при активізації свого пункту меню він буде
видавати довідку про ім'я проекту, відкритого в даний момент в середовищі: У цьому
прикладі центральне місце займає функція AddIDEMenuItem, що здійснює
додавання пункту меню в головне меню IDE Delphi. Як параметри їй
передаються текст нового пункту меню, його ідентифікатор, ідентифікатор пункту,
перед яким вставляється новий пункт, символьне подання клавіші,
яка разом з клавішею Ctrl може використовуватися для швидкого доступу до
новому пункту, і обробник події, відповідного вибору нового пункту. Ми
додали новий пункт меню в розділ View перед пунктом Watches. p>
Тепер
познайомимося з нотіфікаторамі. Визначимо add-in нотіфікатор, що відслідковує
моменти закриття/відкриття проектів та коригуючий відповідним чином
поле, що зберігає ім'я активного проекту (реалізацію методів, не зазнали
змін у порівнянні з тпредидущім прикладом, для стислості опустимо): Для
реалізації нотіфікатора ми визначили клас TAddInNotifier, що є нащадком
TIAddInNotifier, і перекрили метод FileNotification. IDE буде викликати цей
метод кожного разу, коли відбувається подія, на яку здатна зреагувати
add-in нотіфікатор (кожна така подія позначається відповідною
константою типу TFileNotification). Поле Expert в класі TAddInNotifier служить
для зворотнього зв'язку з експертом (метод TAddInNotifier.FileNotification). У
деструктор експерта реєстрація нотіфікатора знімається, і нотіфікатор знищується.
А тепер проілюструємо використання модульних нотіфікаторов. Створимо add-in
експерт, що видає повідомлення про кожному акті збереження проектного файлу
(реалізацію вже знайомих нам методів для стислості не наводимо): В даному
прикладі add-in експерт відстежує події, відповідні відкриття/закриття
проектів. p>
При
кожному відкритті проекту реєструється модульний нотіфікатор, відповідний
файлу проекту. У плані реалізації модульні нотіфікатори схожі з add-in
нотіфікаторамі: ми визначаємо клас TModuleNotifier, що є нащадком
TIModuleNotifier і перекриваємо його методи Notify і ComponentRenamed. IDE
викликає метод Notify при виникненні певних подій, що мають відношення
до даного модулю; всередині цього методу і визначається реакція на те чи інше
подія. Метод ComponentRenamed викликається при зміні імені компонента,
що лежить на формі модуля. Зверніть увагу на те, що ми не використовуємо цей
метод, але зобов'язані його перекрити, інакше при зміні імені компоненту буде
відбуватися виклик абстрактного методу базового класу, що призводить до
непередбачуваних наслідків. p>
Реєстрація
модульного нотіфікатора є дещо більш складним процесом в порівнянні
з реєстрацією add-in нотіфікатора: спочатку ми отримуємо інтерфейс модуля
(TIModuleInterface), а потім за допомогою інтерфейсу модуля реєструємо
нотіфікатор. При закритті проекту реєстрація модульного нотіфікатора знімається
(знову з використанням TIModuleInterface), і нотіфікатор знищується. У
висновок покажемо, як можна визначати позицію курсора у вікні редактора коду.
Створимо експерт, що при виборі відповідного пункту меню видавав би
повідомлення, що містить ім'я активного файлу і позицію курсору в ньому (наведена
реалізація тільки суттєвих для даного прикладу методів): Для визначення
позиції курсору ми повинні отримати наступну послідовність інтерфейсів:
модульний інтерфейс (TIModuleInterface); вікно редактора коду
(TIEditorInterface); інтерфейс подання модуля в редакторі
(TIEditView). p>
Якщо
при виборі пункту меню експерта активним є файл з вихідним текстом
(*. pas), то видається повідомлення, що містить ім'я активного файлу і поточну
позицію курсору в ньому. Якщо активним є не pas-файл, то повідомлення не
видається. Для отримання імені активного файлу використовується метод GetCurrentFile
класу TIToolServices. На цьому завершимо розгляд способів використання
відкритих інтерфейсів. CD-ROM містить вихідні тексти всіх наведених
прикладів. На CD-ROM також міститься більш складний і розгорнутий приклад, що містить
add-in експерт, що дозволяє користувачеві робити закладки в початковому тексті
Delphi-модулів. Короткий посібник з встановлення та використання Експерта
Закладок міститься у файлі bkmrks97.htm. Отже, в даній статті в загальних рисах
розглянуті відкриті інтерфейси та наведені приклади їх використання. Ще раз
повторимо: завдяки наявності вихідних текстів відкритих інтерфейсів ви без праці
зможете розібратися в цікавлять вас деталях. Сподіваємося, що різноманіття
можливостей, які надає відкритими інтерфейсами, породить у вас не одну
сміливу і корисну ідею. p>
Список літератури h2>
Для
підготовки даної роботи були використані матеріали з сайту http://www.soch.imperium.by
p>