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

 

Code:

RegisterPropertyEditor(TypeInfo(TContainedClass),

TContainer,

'Contained',

TClassProperty);

 

 Редактор свойства, пример которого приведен ниже, имеет ограничение на устанавливаемые цвета: только clRed, clWhite или clBlue.

 

Компонент во время проектирования может знать имена текущих модулей и имя проекта. Все это можно получить с помощью 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;

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

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

Итак, получимдвафайла:
MyComponent.pas:

Code:

unit MyComponent;

 

interface

 

uses

SysUtils, Classes;

 

type

TMyComponent = class(TComponent)

private

{ Private declarations }

protected

{ Protected declarations }

public

{ Public declarations }

published

{ Published declarations }

end;

 

 

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

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

clip0248

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

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

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

 

Если вы присвоили свойству имя 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);