Эксперты в DELPHI, илиПрограммист, упроститесебежизнь

Имеющее множество достоинств и довольно популярное средство разработки Delphi позволяет расширять функциональные возможности среды разработчика. Речь идет не о косметических изменениях в интерфейсе и не о добавлении компонентов или их наборов, а о придании рабочему окружению программиста новых полезных возможностей, не предусмотренных его создателями. Для решения подобной задачи в Delphi можно воспользоваться так называемыми экспертами. Вспомните, как удобно, ответив на несколько вопросов, создать готовую форму для вывода содержимого таблиц. Или, щелкнув мышью на нужном элементе в списке New Items, получить “костяк” вашего будущего проекта (рис. 1).

clip0248

Рис. 1. Многиевозможности Delphi реализуютсяспомощьюэкспертов

Чтоэтостандартныевозможностирабочейсреды? Да, ноприменитьихможнолишьспомощьюэксперта. Отом, какэтосделать, ипойдетречьдалее.

Экспертыв Delphi чтоэтотакое?

 

 

Еслинехватаетвозможностейсредыиликакие-тооперациикажутсслишкомгромоздкими, тоэкспертыименното, чтонужно. Спомощьюэкспертоввысловнопроникаетевнутрьсреды Delphi ибезтрудадополняетеее. Естественно, такоепроникновениедолжнобытьосторожнымиаккуратным, потомукакнеправильноеобращениесобъектамииинтерфейсамиможетвызватьсбоивработесредыилидажеееразрушение. Экспертымогутсуществоватьввидебиблиотек DLL либокомпилированныхмодулей DCU. Выбор“формыжизни”будущегоэкспертаостаетсязавами, ноимейтеввиду, чторасширениефайлаэкспертаопределяетспособегорегистрации. Оспособахрегистрациичутьдалееспервадавайтерассмотримстилиэкспертов Delphi. Ихвсегочетыре, ивсеониприведенывтаблице.

Стилиэкспертов

clip0249

Главноеотличиемеждустилямизаключаетсявспособевызоваэкспертапользователемвсреде Delphi. Каквидите, можноопределитьсамыйудобныйизних. Реализацияэкспертовпредполагаетиспользованиеинтерфейса Open Tools API набораклассов, позволяющегообращатьскомножествуфункцийсреды Delphi. Вэкспертах Open Tools API можетиспользоватьсдля:

· полученияинформацииопроекте;
· полученияинформацииомодулеилиформе;
· управлениямодулямипроекта (длоткрытия, закрытия, добавления, создания);
· управленияресурсамипроекта;
· модификациименю Delphi;
· регистрацииизмененийвпроекте;
· регистрацииизмененийвмодуле.

Следуетзаметить, чтоинтерфейс Open Tools API доступентолькоизпрограмм, запущенныхкакчастьинтегрированнойсреды Delphi. Вследующемразделемырассмотримнесколькополезныхэкспертов.

Реализациякласса TIExpert

Длясозданияновогоэкспертанеобходимонаследоватьновыйклассоткласса TIExpert, переопределивприэтомчастьегометодов (таблица 2)

Возможностьпереопределениметодовэкспертовтехилииныхстилей
clip0250

Вседевятьметодов (таблица 3) предоставляютинформациюобэкспертеиорганизуютеговзаимодействиесосредой. TIExpert этоабстрактныйвиртуальныйкласссзаданными, нонереализованнымифункциональнымивозможностями. Отэтогоклассабудутпорожденыдругие, имеющиенеобходимыевозможности.

clip0251

Определениекласса 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 длдоступакфункциямсредыразработки.

clip0252

Любойсервис, предоставляемый 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 сталамногострочной (рисунок). Таквыполучитевозможностьпросматриватьбольшезакладок, чемранее.

clip0253

 Автор: ОлегГопанюк, ведущийпрограммистдепартамента "KM-Solution" корпорации "Квазар-Микро"

Добавить комментарий

Не использовать не нормативную лексику.

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

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить