Класс TPropertyEditor

Прежде, чем писать свой собственный Редактор Свойств, нужно разобраться в базовом классе TPropertyEditor:

TPropertyEditor = class

private

FDesigner: TFormDesigner;

FPropList: PInstPropList;

FPropCount: Integer;

constructor Create(ADesigner: TFormDesigner; APropCount: Integer);

function GetPrivateDirectory: string;

procedure SetPropEntry(Index: Integer; AInstance: TComponent;

APropInfo: PPropInfo);

protected

function GetPropInfo: PPropInfo;

function GetFloatValue: Extended;

function GetFloatValueAt(Index: Integer): Extended;

function GetMethodValue: TMethod;

function GetMethodValueAt(Index: Integer): TMethod;

function GetOrdValue: Longint;

function GetOrdValueAt(Index: Integer): Longint;

function GetStrValue: string;

function GetStrValueAt(Index: Integer): string;

procedure Modified;

procedure SetFloatValue(Value: Extended);

procedure SetMethodValue(const Value: TMethod);

procedure SetOrdValue(Value: Longint);

procedure SetStrValue(const Value: string);

public

destructor Destroy; override;

procedure Activate; virtual;

function AllEqual: Boolean; virtual;

procedure Edit; virtual;

function GetAttributes: TPropertyAttributes; virtual;

function GetComponent(Index: Integer): TComponent;

function GetEditLimit: Integer; virtual;

function GetName: string; virtual;

procedure GetProperties(Proc: TGetPropEditProc);virtual;

function GetPropType: PTypeInfo;

function GetValue: string; virtual;

procedure GetValues(Proc: TGetStrProc); virtual;

procedure Initialize; virtual;

procedure SetValue(const Value: string); virtual;

property Designer: TFormDesigner read FDesigner;

property PrivateDirectory: string read GetPrivateDirectory;

property PropCount: Integer read FPropCount;

property Value: string read GetValue write SetValue;

end;

Методы, приведенные ниже, можно переопределять (override) для изменения поведения Редактора свойств. ( SetXxxValue используется для представления одного из методов SetFloatValue, SetMethodValue, SetOrdValue или SetStrValue. GetXxxValue обозначает GetFloatValue, GetMethodValue, GetOrdValue или GetStrValue)

· Activate -вызывается, когда свойство выбирают в инспекторе объектов. Может быть полезно, позволяя некоторым атрибутам свойства определяться в каждый момент выбора этого свойства.

· AllEqual -вызывается всякий раз, когда на форме выбирается более чем один объект. Если этот метод возвращает True, то вызывается GetValue, иначе в Инспекторе Объектов показывается пустая строка. AllEqual вызывается при условии, что GetAttributes возвращает paMultiSelect.

· Edit -вызывается при нажатии кнопки «...» или по двойному щелчку мыши на свойстве. Этот метод может, к примеру, показать какое-нибудь диалоговое окно для редактирования свойства (пример - свойство Font).

· GetAttributes -возвращает необходимую Инспектору Объектов информацию для того, чтобы тот смог отобразить свойство в подходящей манере. GetAttributes возвращает множество (set) значений типа TPropertyAttributes:

paValueList: Редактор Свойств может возвращать список значений для этого свойства. Если этот атрибут установлен, то нужно определить GetValues. В Инспекторе объектов справа от свойства появится кнопка для выпадающего списка.

paSortList: Инспектор объектов будет сортировать список, полученный от GetValues.

paSubProperties: свойство имеет подсвойства, которые будут показываться ниже в виде иерархии (outline). Если GetProperties будет генерировать объекты-свойства, то этот атрибут должен быть установлен.

paDialog: показывает, что метод Edit будет вызывать диалог. Если данный атрибут установлен, то появится кнопка «...» справа от свойства в Инспекторе Объектов.

paMultiSelect: позволяет свойству оставаться в Инспекторе Объектов, когда на форме выбрано сразу несколько объектов. Некоторые свойства не годятся для множественного выбора, например, Name.

paAutoUpdate: Если этот атрибут установлен, то метод SetValue будет вызываться при каждом изменении, произведенном в редакторе, а не после завершения редактирования (пример - свойство Caption).

paReadOnly: значение менять нельзя.

· GetComponent -возвращает компонент под номером Index в случае множественного выбора объектов (multiselect). GetAttributes должен возвращать paMultiSelect.

· GetEditLimit -возвращает число символов, которые пользователь может ввести при редактировании свойства. По умолчанию 255 символов.

· GetName -возвращает имя свойства. По умолчанию это имя получается из информации о типе, все подчеркивания замещаются пробелами. Данный метод Вам нужно переопределять только в том случае, если имя свойства отличается от того, которое нужно отображать в Инспекторе Объектов.

· GetProperties -должен быть переопределен для вызова PropertyProc для каждого подсвойства (или вложенного свойства) редактируемого свойства и передачи нового TPropertyEdtior для каждого подсвойства. По умолчанию, PropertyProc не вызывается и подсвойства не ожидаются. TClassProperty будет передавать новый редактор свойств для каждого свойства, объявленного published в классе. TSetProperty передает новый редактор для каждого элемента множества.

· GetPropType -возвращает указатель на информацию о типе редактируемого свойства.

· GetValue -возвращает значение свойства в виде строки. По умолчанию возвращает '(unknown)'. Этот метод нужно переопределять с тем, чтобы возвращать правильное значение.

· GetValues -вызывается, если GetAttributes возвращает paValueList. Должно вызвать Proc для каждого значения, которое приемлемо для данного свойства.

· Initialize -вызывается при создании Редактора свойств.

· SetValue(Value) -вызывается для того, чтобы установить значение свойства. Редактор свойств должен уметь разобрать строку (Value) и вызвать метод SetXxxValue. Если строка имеет некорректный формат или неверное значение, то редактор Свойств должен сгенерировать исключительную ситуацию (exception), описывающую данную проблему. SetValue может вообще проигнорировать все изменения и оставить всю обработку изменений методу Edit (как в свойстве Picture).

Свойства и методы полезные при создании нового класса Редактора свойств:

·PrivateDirectory (свойство)
Это директория, в которой находится .EXE, либо рабочая директория, указанная в DELPHI.INI. Если редактор должен сохранить какую-то информацию (установки), то лучше в этой директории.

·Value (свойство)
Текущее значение свойства, то же самое возвращает GetValue.

·Modified (метод)
Вызывается для того, чтобы показать, что значение свойства изменилось. Методы SetXxxValue вызывают Modified автоматически.

·GetXxxValue (метод)
Возвращает значение первого из редактируемых свойств.

·SetXxxValue (метод)
Устанавливает значения свойства для всех выбранных объектов.