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

 

Code:

RegisterPropertyEditor(TypeInfo(TContainedClass),

TContainer,

'Contained',

TClassProperty);

 

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

 

Предупреждение: Окно CPU еще до конца не оттестировано и может иногда приводить к ошибкам. Если у вас есть проблемы с отладчиком, или при запуске вашей программы вы не можете им воспользоваться, окно CPU может помочь решить ваши проблемы. Обычно его не требуется включать, если только у вас не "особый случай".

 

В Delphi 2 эта характеристика встроена, но по умолчанию выключена, называется это окно CPU window, или DisassemblyView. Она легка в использовании, может быть полезной в отладке и сравнении кода при его оптимизации.

 

Для активизации этой характеристики, запустите REGEDIT и отредактируйте регистры описанным ниже образом. Найдите ключ HKEY_CURRENT_USER\Software\Borland\Delphi\2.0\Debugging. Создайте по этому пути строковый ключ с именем "ENABLECPU". Значение нового ключа должно быть строкой "1". Это все. Теперь в Delphi IDE появился новый пункт меню View|CPUWindow. При его активизации выводится новое окно.

 

Давайтерассмотримсозданиепростейшегоодноуровневогоконтекстногоменюнасвоемкомпоненте, котороебудетоткрыватьсяприщелчкеправойкнопкойпонемувсамомверхуконтекстногоменю 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;

 

 

               Горячие клавиши в окне редактора

F1

контекстная помощь

F3

продолжить поиск (начать - Ctrl+F )

F4

выполнить программу до положения курсора

F5

поставить Break Point

F7

трассировать с заходом в процедуры

F8

трассировать без захода в процедуры

F9

запустить программу

F10

активизировать главное меню

F11

открыть/закрыть Object Inspector

F12

переход между формой и кодом

Ctrl-F1

контекстная помощь

Ctrl-F2

прервать выполнение программы

Ctrl-F3

посмотреть стек

Ctrl-F4

закрыть текущий модуль

Ctrl-F5

список переменных для просмотра (Watch List)

Ctrl-F7

просмотр значений переменных и их изменение

Ctrl-F9

компилировать проект

Ctrl-F10

активизировать главное меню

Ctrl-F11

открыть проект

Ctrl-F12

список модулей проекта

Shift-F7

трассировка заходя в каждую процедуру и перескакивание в каждое возникающее событие

Shift-F10

всплывающее меню

Shift-F11

добавить модуль к проекту

Shift-F12

список форм проекта для быстрой навигации

Alt-F4

закрыть проект и все файлы

Alt-F6

переключение окон

Alt-F8

переход к следующей ошибке компиляции

Alt-F7

переход к предыдущей ошибке компиляции

Ctrl-Shift-F4

закрыть проект и все файлы

Alt-Ctrl-F11

менеджер проектов

Alt-Shift-F4

закрыть все окна, но проект не закрывать

Ctrl-Shift-0..9

поставить метку 0..9

Ctrl-0..9

перейти на метку 0..9

Alt-0

список окон

Ctrl-Enter

открыть файл с именем слова на котором курсор стоит

Ctrl+клик мышкой на слове

перейти на определение этого слова

Alt+выделение текста (мышкой или клавиатурой)

выделение вертикального блока

Ctrl+Shift+Up

Ctrl+Shift+Down

переход от объявления процедуры к ее реализации

Ctrl-Shift-C

закончить метод (если он описан - создать шаблон для реализации,если есть реализация - объявить метод)

Ctrl+Space

высветить список методов, свойств объекта (после точки)

Ctrl+Shift+Space

высветить список параметров функции

Ctrl-Shift-E

открыть эксплорер кода

Ctrl-Shift-R

начать/завершить запись макро

Ctrl-Shift-P

выполнить записанное макро

Ctrl-Shift-T

добавить в To Do лист

Ctrl-Shift-U

уменьшить отступ выделенного блока

Ctrl-Shift-I

увеличить отступ выделенного блока

Ctrl-Shift-S

сохранить как

Ctrl-Shift-G

вставить GUID

Ctrl-Shift-B

посмотреть иерархию классов

Ctrl+Shift+Y

удалить от курсора до конца строки

Ctrl+Shift+Z

redo

Ctrl-Alt-W

watch List

Ctrl-Alt-R

grep result

Ctrl-Alt-T

список потоков проекта

Ctrl-Alt-A

вставить дату

Ctrl-Alt-S

вызовы стека

Ctrl-Alt-H

шаблон для документации модуля

Ctrl-Alt-L

локальные переменные

Ctrl-Alt-V

история событий

Ctrl-Alt-B

список Break Points

Ctrl-Alt-M

Модули

Ctrl-N

вставить пустую строку, курсор остается на текущей строке

Ctrl-M

Enter

вставить пустую строку, курсор переходит на следующую строку

Ctrl-E

поиск по мере введения символов (Incremental Search)

Ctrl-R

поиск и замена

Ctrl-A

выделить весь текст (только Дельфи 6+)

Ctrl-T

удалить от курсора до конца слова

Ctrl-Y

удалить строку

Ctrl-O, O

вставить все текущие опции компиляции по позиции курсора

Ctrl+O, C

marks a column block

Ctrl+O, I

marks an inclusive block

Ctrl+O, K

marks a non-inclusive block (default when the editor starts)

Ctrl+O, L

marks a line as a block

Ctrl-P

префикс, после которого можно вставить любой ASCII код

Ctrl-S

сохранить текущий файл

Ctrl-F

открыть диалог поиска

Ctrl-J

лист шаблонов

Ctrl-K, С

копирование блока без буфера обмена

Ctrl-Z

отмена

Ctrl-X

вырезать

Ctrl-С

копировать

Ctrl-V

вставить

Ctrl-B

список буферов

Ctrl+K, R

читать блок из файла

Ctrl+K, W

записать блок в файл

Ctrl+O, U

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

Ctrl+O, A

диалог: "открыть файл"

Ctrl+O, G

переход к строке номер...

Ctrl+K, E

перевод слова в нижний регистр

Ctrl+K, T

выделить слово

Ctrl+K, Y

удалить выделенный блок

Ctrl+K, U

unindent block

Ctrl+K, I

indent block

Ctrl+K, P

печать текста

Ctrl+K, F

перевод слова в вверхний регистр

Alt+[

Alt+]

найти соответствующую скобку

Ctrl+Q, P

вернуть курсор на место последнего редактирования

 

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

Командной строкой:

 

Delphi32.EXE -ns

 

 

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

Командной строкой: Delphi32.exe -np

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

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

clip0248

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

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

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

 

HKEY_CURRENT_USER\Software\Borland\Delphi\4.0\Debugging

 

ViewCPUOnException=0