Эксперты в DELPHI, илиПрограммист, упроститесебежизнь
Имеющее множество достоинств и довольно популярное средство разработки Delphi позволяет расширять функциональные возможности среды разработчика. Речь идет не о косметических изменениях в интерфейсе и не о добавлении компонентов или их наборов, а о придании рабочему окружению программиста новых полезных возможностей, не предусмотренных его создателями. Для решения подобной задачи в Delphi можно воспользоваться так называемыми экспертами. Вспомните, как удобно, ответив на несколько вопросов, создать готовую форму для вывода содержимого таблиц. Или, щелкнув мышью на нужном элементе в списке New Items, получить “костяк” вашего будущего проекта (рис. 1).
Рис. 1. Многиевозможности Delphi реализуютсяспомощьюэкспертов
Чтоэто—стандартныевозможностирабочейсреды? Да, ноприменитьихможнолишьспомощьюэксперта. Отом, какэтосделать, ипойдетречьдалее.
Экспертыв Delphi —чтоэтотакое?
Еслинехватаетвозможностейсредыиликакие-тооперациикажутсслишкомгромоздкими, тоэксперты—именното, чтонужно. Спомощьюэкспертоввысловнопроникаетевнутрьсреды Delphi ибезтрудадополняетеее. Естественно, такоепроникновениедолжнобытьосторожнымиаккуратным, потомукакнеправильноеобращениесобъектамииинтерфейсамиможетвызватьсбоивработесредыилидажеееразрушение. Экспертымогутсуществоватьввидебиблиотек DLL либокомпилированныхмодулей DCU. Выбор“формыжизни”будущегоэкспертаостаетсязавами, ноимейтеввиду, чторасширениефайлаэкспертаопределяетспособегорегистрации. Оспособахрегистрациичутьдалее—спервадавайтерассмотримстилиэкспертов Delphi. Ихвсегочетыре, ивсеониприведенывтаблице.
Стилиэкспертов
Главноеотличиемеждустилямизаключаетсявспособевызоваэкспертапользователемвсреде Delphi. Каквидите, можноопределитьсамыйудобныйизних. Реализацияэкспертовпредполагаетиспользованиеинтерфейса Open Tools API —набораклассов, позволяющегообращатьскомножествуфункцийсреды Delphi. Вэкспертах Open Tools API можетиспользоватьсдля:
· | полученияинформацииопроекте; |
· | полученияинформацииомодулеилиформе; |
· | управлениямодулямипроекта (длоткрытия, закрытия, добавления, создания); |
· | управленияресурсамипроекта; |
· | модификациименю Delphi; |
· | регистрацииизмененийвпроекте; |
· | регистрацииизмененийвмодуле. |
Следуетзаметить, чтоинтерфейс Open Tools API доступентолькоизпрограмм, запущенныхкакчастьинтегрированнойсреды Delphi. Вследующемразделемырассмотримнесколькополезныхэкспертов.
Реализациякласса TIExpert
Длясозданияновогоэкспертанеобходимонаследоватьновыйклассоткласса TIExpert, переопределивприэтомчастьегометодов (таблица 2)
Возможностьпереопределениметодовэкспертовтехилииныхстилей
Вседевятьметодов (таблица 3) предоставляютинформациюобэкспертеиорганизуютеговзаимодействиесосредой. TIExpert —этоабстрактныйвиртуальныйкласссзаданными, нонереализованнымифункциональнымивозможностями. Отэтогоклассабудутпорожденыдругие, имеющиенеобходимыевозможности.
Определениекласса TIExpert приведенодалее.
Code: |
TIExpert = class(TInterface) public { Методы пользовательского интерфейса с экспертом } function GetName: string; virtual; stdcall; abstract; function GetAuthor: string; virtual; stdcall; abstract; function GetComment: string; virtual; stdcall; abstract; function GetPage: string; virtual; stdcall; abstract; function GetGlyph: HICON; virtual; stdcall; abstract; function GetStyle: TExpertStyle; virtual; stdcall; abstract; function GetState: TExpertState; virtual; stdcall; abstract; function GetIDString: string; virtual; stdcall; abstract; function GetMenuText: string; virtual; stdcall; abstract; { Запуск эксперта } procedure Execute; virtual; stdcall; abstract; end; |
Open Tools API
Open Tools API —этонаборинтерфейсов; онипредоставляютдоступксреде Delphi ипозволяютуправлятьфайламиипроектами. Основнойобъект Open Tools API — ToolServices —этоглобальнаяпеременная. Призапуске Delphi создаетсяэкземпляркласса TIToolServices, ипеременной ToolServices присваиваетсяссылкананего. Экспертымогутиспользовать ToolServices длдоступакфункциямсредыразработки.
Любойсервис, предоставляемый Open Tools API, прямоиликосвенновызываетсячерез ToolServices. Втаблицеприведенократкоеописание Open Tools API.
Переопределениеметодов—задачадовольнопростая; онапредполагаетнаписаниевсегонесколькихстроккода. Например, реализацияметода GetStyle врядлиотниметувасмноговремени:
Code: |
function MyExpert.GetStyle: TexpertStyle begin Result := [esStandard]; end; |
Регистрацияэкспертов
Зарегистрироватьэкспертможнооднимиздвухспособов. Первыйспособсводитсякопределениюэкспертакаккомпонентапутемвызовапроцедуры RegisterLibraryExpert изпроцедуры Register. Второйспособзаключаетсявсоздании DLL-библиотекиэксперта. Преимуществопервогоспособавтом, чтонеприходитсзакрыватьсреду Delphi привнесенииизмененийвэксперт—достаточноегоперекомпилировать. Сперварассмотримрегистрациюэкспертакаккомпонента. Необходимодобавитьвмодульэкспертапроцедуру Register:
Code: |
ProcedureRegister; Implementation{$R*.DFM} ProcedureRegister; Begin RegisterLibraryExpert (TPowerExpert. Create); // TpowerExpert — это класс регистрируемого эксперта End; |
Длярегистрацииэкспертакак DLLбиблиотекиследуетвыполнитьдвеоперации: реализоватьновыйпроект DLL иизменитьсодержимоесистемногореестра Windows. Итак, создаем DLL. Выполнитекоманду File р New, азатемукажите Delphi, чтонеобходимосоздать DLL. Врезультатепоявитсяновоеокномодуляснекимнаборомисходногокода. Послеэтогоследуетэкспортироватьфункцию InitExpert. Обратитевнимание, чтоэтафункцияэкспортируетсяспомощьюспециальнойконстанты ExpertEntryPoint, которую Delphi определяетдлявсехэкспертов, создаваемыхввиде DLL. Основноеназначениефункции InitExpert —возвратссылкинаобъект ToolServices длядальнейшегоиспользованияивызовапроцедуры RegisterProc, которая, собственно, ирегистрируетэксперт. Нижеприведенареализацияэтойфункции:
Code: |
Function InitExpert( ToolServices:ToolServices; RegisterProc:TexpertRegisterProc; var Terminate:TExpertTerminateProc): Boolean; export; stdcall; implementation procedure TerminateExpert; begin // завершение работы эксперта end; function InitExpert( ToolServices:ToolServices; RegisterProc:TExpertRegisterProc; var Terminate:TExpertTerminateProc): Boolean; export; stdcall; begin Result:=False; end; // проверка, является ли запущенное приложение единственным if (ToolServices=nil) or Assigned(ExptIntf.ToolServices) then Exit; ExptIntf.ToolServices:=ToolServices; //сохраняем указатель на ToolServices Application.Handle:= ToolServices.GetParentHandle; //сохраняем указатель на ToolServices для родительского окна Terminate:=TerminateExpert; //устанавливаем процедуру завершения RegisterProc(TGenericExpert.Create); //регистрация эксперта Result:=True; end; |
Когда DLL сэкспертомбудетготова, отваспотребуетсялишьизменитьсистемныйреестртак, чтобы Delphi “знала”расположениебиблиотекисэкспертомисмоглаеезагрузить. Дляэтогоспомощьюредакторареестра (regedit.exe) добавьтевреестртакуюзапись:
HKEY_CURRENT_USER\Software\Borland\ Delphi\4.0\Experts MyExpert=C:\MyExpertts\MyExpert.DLL
Длятогочтобысредазарегистрировала DLL, Delphi необходимоперезапустить. Вариантреализацииэкспертаввиде DLL кажетсавторуменееудобным: перезагрузкасредыотнимаетбольшевременипосравнениюсперекомпиляциейбиблиотекикомпонентов, чтоособенноощутимоприотладкеэксперта. Ещеоднапроблема—неполнасовместимостьэкспертовввиде DLL, которыебылисозданыискомпилированыдлядругихверсий Delphi. Авторнадеется, чтоэтастатьпоможетпрофессионалампоближепознакомитьсясэкспертами Delphi. Возможно, еепубликацияподтолкнетмногихпрограммистовкизучениютемы.
Некоторыеполезныеэксперты
Знаетеливы, чтов Internet естьпредостаточномест, гдеможнонайтиэкспертыдля Delphi. Одноизтакихмест—польскийсервер“Delphi Super Page” (https://sunsite.icm.edu.pl/delphi/). Тамвынайдетемножестворазличныхэкспертовиполезныхкомпонентов. Давайтерассмотримсамыйинтересный, помнениюавтора, наборэкспертов, предоставляющийвозможностьускоритьразработкуприложенийна Delphi. Егоможнозагрузитьпоадресу: https://sunsite.icm.edu.pl/delphi/ftp/d40free/myexp100.zip.
Рассмотримвкратцеэтималенькие“добавки”. Наборсодержитэксперт—редакторпрефиксовдляименкомпонентов. Послетого, каконбудетустановленвинспектореобъектов, напротивсвойства Name появитсякнопкасмноготочием. Этоговоритотом, чтоможновоспользоватьсредакторомдляизменениясвойства Name. Сегопомощьюможноуказыватьпрефиксдляданногоклассакомпонента. Строгоговоря, использованиепрефиксоввназванияхкомпонентов—этоправилохорошеготона. Вменю Tools теперьпоявляетсяновоеподменю Prefix list editor, спомощьюкоторогоможноизменятьидобавлятьтакиепрефиксы.
Какизвестно, некоторыекомпонентыявляютсяконтейнерамидлядругих (например, TPanel, TGroupBox, TScrollBox ит. п.). Установленныйнаборпозволитуправлятьвыравниваниемдочернихкомпонентов. Дляэтогодостаточнощелкнутьправойкнопкоймышиивыбратьвконтекстномменюпункт Align controls. В Delphi естьмастерсозданияэлементовуправления, работающихсданными.
Однаковрассматриваемомнабореимеетсяэксперт, благодарякоторомуможносоздаватькомпонентыдляработысданнымиболеесовершеннымспособом. Спомощьюэксперта, вызываемогокомандой Tools р Shortcut list editor, можноопределитьсвойнаборклавиатурныхэквивалентовдляглавногоменю Delphi. Кромевсегопрочего, послеустановкинаборавыобнаружите, чтопалитракомпонентов Delphi сталамногострочной (рисунок). Таквыполучитевозможностьпросматриватьбольшезакладок, чемранее.
Автор: ОлегГопанюк, ведущийпрограммистдепартамента "KM-Solution" корпорации "Квазар-Микро"
Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.
ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!