В этом разделе рассматривается проблема создания редактора нестандартного свойства. Конкретно мы обсудим следующие вопросы.

• создание класса редактора свойства;
• редактирование свойства как текста;
• редактирование свойства в диалоговом окне;
• определение атрибутов редактора свойства;

• регистрация редактора свойства.

11.1.1. Создание класса редактора свойства

Создание класса редактора свойства заключается, в первую очередь, в выборе родительского класса, в качестве которого может использоваться класс ТРгорегіуЕсІіііог или один из его потомков, перечисленных в табл. 11.1.

Таблица 11.1. Редакторы свойств, определенные в модуле ОезідпЕсІКоге

Имя класса

Описание

TOrdinalProperty

Базовый класс для всех редакторов численных величин (таких

как TIntegerProperty, TEnumProperty, TCharProperty и т. п.)

TIntegerProperty

Редактор целочисленных свойств

TEnumProperty

Редактор свойств-перечислений

TCharProperty

Редактор символьных свойств

TFIoatProperty

Редактор вещественных свойств

TStringProperty

Редактор строковых свойств

TSetElementProperty

Редактор свойств для отдельных элементов множества. Каждый

элемент рассматривается как независимый логический тип

TSetProperty

Редактор свойств-множеств. Показывает имя типа и позволяет

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

TCIassProperty

Редактор свойств-классов. Показывает имя класса и позволяет

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

TComponentProperty

Редактор свойств-компонентов. В отличие от TCIassProperty,

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

связанного с данным (например, свойство PopupMenu)

TMethod Property

Редактор событий

TColorProperty

Редактор свойств типа TColor (цвет)

TFontNameProperty

Редактор имен шрифтов. Раскрывает список всех

зарегистрированных шрифтов

TFontProperty

Редактор свойств шрифта

Tint64Property

Редактор свойств типа Int64

TNestedProperty

Вложенный редактор, способный использовать родительский

редактор свойств

TInterfaceProperty

Редактор свойств-интерфейсов

TComponentNameProperty

Редактор имен свойств

Имя класса

Описание

TDateProperty

Редактор свойства-даты

TTimeProperty

Редактор свойства-времени

TDateTimeProperty

Редактор свойств типа TDateTime

TVariantProperty

Редактор свойств типа Variant

После выбора родительского класса необходимо перекрыть некоторые его методы, чтобы придать новому классу новую функциональность. В классе TPropertyEditor и его потомках есть свойство Value и два ключевых метода - GetValue и SetValue. Свойство Value содержит текущее значение редактируемого свойства в строковом формате. Когда Инспектору объектов необходимо отобразить значение свойства или изменить его, он обращается к этому свойству редактора. Виртуальные методы Set/Get обеспечивают доступ к свойству Value. Именно они перекрываются, если редактор должен обеспечить строковое представление свойства Value. Но где в этом случае можно получить «родное» (не строковое) значение свойства? Для этого в распоряжение создателя редактора предоставляются несколько методов поддержки, перечисленных в табл. 11.2. Все они определены в классе TPropertyEditor и, следовательно, доступны всем его потомкам.

Таблица 11.2. Методы доступа к значениям свойств

Тип свойства

Метод чтения

Метод записи

Число с плавающей запятой

GetFloatValue

SetFloatValue

Число і^64

GetInt64Value

SetInt64Value

Событие

GetMethodValue

SetMethodValue

Строка

GetStrValue

SetStrValue

Перечисление (любой 32-разрядный набор битов)

GetOrdValuie

SetOrdValue

Интерфейс

GetlntfVatue

SetlntfValue

Вариант

GetVarValue

SetVarValue

Помимо методов, указанных в таблице, определены также методы XXXXAt (Index), которые обеспечивают доступ к одному из множества значений типа. Например, GetFloatValueAt (), SetInt64ValueAt () и т. д.

В редакторе TSrtingProperty методы GetValue и SetValue определены, к примеру, следующим образом:

function TStгingProperty.GetValue: String;
begin
Result := GetStrValue;
end;
procedure TStringProperty.SetValue(const Value: String);
begin
SetStrValue(Value);
end;

Разумеется, в редакторах нестроковых типов эти методы осуществляют нужное преобразование:

function TIntegerProperty.GetValue: String;
begin
Result := IntToStr(GetOrdValue);
end;
procedure TFloatProperty.SetValue(const Value: String);
begin
SetFloatValue(StrToFloat(Value)) ;
end;

Особое значение имеют методы XXXXOrdValue: они применяются для получения значений не только перечислений, но и вообще любых 32-разрядных чисел. Напомню, что в 32-разрядных версиях Windows такими числами помечаются различного рода дескрипторы. Таким образом, эти методы обеспечивают доступ и к объектам.

В некоторых случаях значение Value не является строковым представлением текущего значения свойства. Например, свойство Font отображает в виде значения в окне Инспектора объектов строку TFont, которая ничего не говорит о реальных параметрах шрифта. Зато в правом углу строки значения свойства Font имеется небольшая кнопка, щелчок на которой приводит к появлению соответствующего диалогового окна.

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

ПРИМЕЧАНИЕ --

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

Создание редакторов || Оглавление || 11.1.2. Редактирование свойства как текста


Искусство создания компонентов Delphi



Новости за месяц

  • Август
    2019
  • Пн
  • Вт
  • Ср
  • Чт
  • Пт
  • Сб
  • Вс