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;

  

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.

Одной и наиболее сильных сторон среды программирования 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.

 

Компонент во время проектирования может знать имена текущих модулей и имя проекта. Все это можно получить с помощью ToolServices (см. файл TOOLINTF.PAS)

 

Имя текущего проекта можно получить с помощью вызова GetProjectName, список модулей/форм - с помощью функции GetUnitCount, которая возвратит количество модулей и затем с помощью GetUnitName(i) мы можем получить имя каждого модуля (также и с формами).

 

Вот примерный образец кода (получение и запись имен всех модулей/форм в StringGrid и имени проекта в Label):

 

Code:

procedure TInformationFrm.FormActivate(Sender: TObject);

{ необходимо: StringGrid1 (2 колонки, масса строк), Label1, Label2 }

var

i, j: Integer;

Tmp: string;

begin

StringGrid1.Cells[0, 0] := 'модулей:';

StringGrid1.Cells[1, 0] := 'форм:';

if ToolServices <> nilthen

with ToolServices do

begin

Label1.Caption := ExtractFileName(GetProjectName); { простое имя }

Label2.Caption := GetProjectName; { полное правильное имя пути }

for i := 0to GetUnitCount do

begin

Tmp := ExtractFileName(GetUnitName(i));

StringGrid1.Cells[0, i + 1] := Tmp;

Tmp := ChangeFileExt(Tmp, '.DFM');

for j := 0to GetFormCount do

if ExtractFileName(GetFormName(j)) = Tmp then

StringGrid1.Cells[1, i + 1] := Tmp

end;

end;

end;

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

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

 

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

 

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

 

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

 

Если вы присвоили свойству имя TableName, то полный цикл создания редактора свойств включает следующие шаги:

 

Опишите класс редактора свойства:

 

Code:

type

TTableNameProperty = class(TStringProperty)

function GetAttributes: TPropertyAttributes; override;

procedure GetValues(Proc: TGetStrProc); override;

end;

 

implementation

 

{ TTableNameProperty }

function TTableNameProperty.GetAttributes: TPropertyAttributes;

begin

Result := [paValueList];

end;

 

procedure TTableNameProperty.GetValues(Proc: TGetStrProc);

var

TableName: String;

I: Integer;

begin

{ здесь вы должны добавить свой код, ?тобы с помощью цикла обойти имена всех

таблиц, включенных в список }

for I := 0to ???? do

begin

TableName := ????[I];

Proc(TableName);

end;

end;

 Затем зарегистрируйте данный редактор свойства следующим образом: 

 

Code:

RegisterPropertyEditor(TypeInfo(string), TcsNotebook, 'TableName', TTableNameProperty);

 Скажем, вы имеете компонент TContainer, содержащий TContainedClass в свойстве с именем 'Contained' - попробуйте добавить следующую строку к процедуре Register вашего компонента:

 

Code:

RegisterPropertyEditor(TypeInfo(TContainedClass),

TContainer,

'Contained',

TClassProperty);

 

 

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-PRAXiShttp://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

 

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