АндрейСемак

Введение

Рано или поздно каждому профессиональному разработчику программного обеспечения становится тесной среда обитания. По мнению автора, читатель понял, что речь идет о среде разработки, в которой обитает разработчик. У кого это "дом", у кого "строительная площадка", а у кого и то, и другое. В этой статье мы рассмотрим возможность расширения нашего дома. Мы покажем, как именно можно наращивать мощность IDE своими силами, будь то среда разработки Borland Delphi или Borland C++ Builder.

У многих из вас возникало желание добавить несколько полезных функций в любимое IDE. Разработчики фирмы Borland не оставили без внимания эту полезную возможность. Они разработали набор интерфейсов, позволяющих расширять возможности среды, хотя, к сожалению, отсутствие документации по данному вопросу мешает самостоятельному изучению. Жалкие комментарии в исходных текстах не могут воспроизвести всю мощь, которую предоставляет IDE разработчику расширений. Автор статьи попытается передать читателю опыт своих изысканий и постарается своими советами уберечь читателя от многих подводных камней.

Документ построен таким образом, чтобы мы переходили от этапа к этапу от простого к сложному. Насколько это удалось, судить вам. Вместе c вами мы рассмотрим на примерах все сервисы, предоставляемые IDE Borland Delphi\C++Builder.

Итак, начнем?

 

Создание pop-up меню своего компонента и кое-что еще о классе TComponentExpert

Давайте рассмотрим создание простейшего одно уровневого контекстного меню на своем компоненте, которое будет открываться при щелчке правой кнопкой по нему в самом верху контекстного меню Delphi.

 

Прежде всего вам следует разделить код вашего компонента на Design-time и Run-time. Для этого перенесите ваш компонент в модуль, с названием, например, MyComponent.pas, а процедуры регистрации его в палитре компонентов (procedure Register и т.д.) в модуль, с названием, например, MyComponentReg. На такие меры приходится идти из-за того, что Borland не включила в исходные коды исходник файла Proxies.pas.

 

 

 

Code:

{....}

 

uses ToolsApi, Menus;

 

{....}

 

var

item: TMenuItem;

begin

{get reference to delphi's mainmenu. You can handle it like a common TMainMenu}

with (BorlandIDEServices as INTAServices).GetMainMenu do

begin

item := TMenuItem.Create(nil);

item.Caption := 'A Mewn caption';

Items.Add(item);

end;

end;

 

This article introduces you to the world of Delphi Experts. Delphi Experts are DLLs, that will be loaded during the startup sequence of Delphi. This article first appeared on Delphi-PRAXiShttps://www.delphipraxis.net/viewtopic.php?t=5300 in German.

 

NOTE: The techniques shown in this article are valid starting with Delphi 3 or 4 and since Delphi 7 they are deprecated, however, still fully suported by the Delphi IDE.

 

Installation of a Delphi-IDE-Expert

 

Every Delphi-Expert has to be registered in the Windows-Registry. For each Delphi-Version installed on a machine, as well as for each user using the machine, the Delphi-Expert has to be registered separately.

 

In the Registry the Delphi-Expert has to be registered under the folowing key:

 

HKCU\Software\Borland\Delphi\X.0\Experts

 

Итак вам опять нужно "немного" кода. Вот небольшой примерчик компонента лично для вас и остальных моих читателей. Установите этот компонент в палитру Delphi, бросьте экземпляр на форму, закройте ее и модуль и откройте форму как файл формы, используя в диалоге открытия тип *.dfm. Вы увидите дополнительные свойства 'StringThing' и 'Thing'. Первое - свойство строки, второе - бинарное свойство, фактически запись. Если вы имеете HexEdit (шестнадцатиричный редактор) или что-то аналогичное, взгляните на ваш dfm-файл и вы увидите тэги ваших новых свойств вместе с их именами.

 

Если TReader/TWriter имеет специфические методы для чтения/записи свойств и вы хотите добавить, например, строку, целое, символ или что-то еще (проверьте описание соответствующих методов TReader в файлах помощи), то в этом случае используйте DefineProperty. В случае сложного объекта используйте DefineBinaryProperty и ваши методы чтения и записи получат TStream вместо TReader/TWriter.

 

Одной и наиболее сильных сторон среды программирования Delphi является ее открытая архитектура, благодаря которой Delphi допускает своего рода метапрограммирование, позволяя "программировать среду программирования". Такой подход переводит Delphi на качественно новый уровень систем разработки приложений и позволяет встраивать в этот продукт дополнительные инструментальные средства, поддерживающие практически все этапы создания прикладных систем. Столь широкий спектр возможностей открывается благодаря реализованной в Delphi концепции так называемых открытых интерфейсов, являющихся связующим звеном между IDE (Integrated Development Environment) и внешними инструментами. Данная статья посвящена открытым интерфейсам Delphi и представляет собой обзор представляемых ими возможностей.

 

В Delphi определены шесть открытых интерфейсов: Tool Interface, Design Interface, Expert Interface, File Interface, Edit Interface и Version Control Interface. Вряд ли в рамках данной статьи нам удалось бы детально осветить и проиллюстрировать возможности каждого из них. Более основательно разобраться в рассматриваемых вопросах вам помогут исходные тексты Delphi, благо разработчики снабдили их развернутыми комментариями. Объявления классов, представляющих открытые интерфейсы, содержатся в соответствующих модулях в каталоге ...\Delphi\Source\ToolsAPI.

 

 Debug Delphi 3 experts with Delphi 3

Delphi 3 has a new feature "debug DLLs". It can be used to debug experts with the internal debugger. Just follow these simple steps, and debugging an expert can be fun:

  

Make sure that the expert is not installed. If there is this entry

\CURRENT_USER\software\Delphi\3.0\experts,

myexpert=\projects\myexpert\expert.dll

rename this entry to "expert.xxx". (don't delete it, you'll need it later).

Otherwise, you cannot compile a new version.

 

 

 

 

Code:

uses ToolsApi;

{....}

var

a, i: Integer;

begin

with (BorlandIDEServices as IOTAPackageServices) do

begin

for a := 0to GetPackageCount - 1do

begin

for i := 0to GetComponentCount(a) - 1do

begin

{get each component name with GetComponentName(a, i);}

end;

end;

end;

end;

 

 

https://www. swissdelphicenter.ch/en/tipsindex 

 

 

Я написал компонент-отладчик, выводящий в дереве все компоненты. Попробуйте этот код. Вызывайте функцию DisplayProperties как показано ниже:

 

  

Code:

{

This unit can be compiled into a package and will then appear in the Delphi

Help menu.

}

unit SDCSimpleExpert;

 

interface

 

uses ToolsApi;

 

type

TSDCSimpleExpert = class(TNotifierObject, IOTAMenuWizard, IOTAWizard)

public

function GetIDString: string;

function GetName: string;

function GetState: TWizardState;

procedure Execute;

function GetMenuText: string;

end;

 

procedureRegister;

 

implementation

 

uses Dialogs;

 

procedureRegister;

begin

{register expert}

RegisterPackageWizard(TSDCSimpleExpert.Create);

end;

 

{ TSDCSimpleExpert }

 

procedure TSDCSimpleExpert.Execute;

begin

{code to execute when menu item is clicked}

ShowMessage('Hello SwissDelphiCenter Simple Expert.');

end;

 

function TSDCSimpleExpert.GetIDString: string;

begin

{unique expert identifier}

Result := 'SwissDelphiCenter.SimpleExpert';

end;

 

function TSDCSimpleExpert.GetMenuText: string;

begin

{caption of menu item in help menu}

Result := 'SwissDelphiCenter Simple Expert';

end;

 

function TSDCSimpleExpert.GetName: string;

begin

{name of the expert}

Result := 'SwissDelphiCenter Simple Expert';

end;

 

function TSDCSimpleExpert.GetState: TWizardState;

begin

Result := [wsEnabled];

end;

 

end.