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

Редактировать свойства в окне Инспектора Объектов можно двумя способами. Один заключается в предоставлении пользователю возможности редактирования свойства как строки текста. Другой требует создания специального диалогового окна, в котором и выполняется редактирование свойства. В некоторых случаях потребуется использовать оба способа для редактирования одного свойства.

Вот основные этапы создания редактора свойств.

1. Создание объекта класса, производного от класса редактора свойств.

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

3. Редактирование свойства в диалоговом окне (необязательный этап).

4. Определение атрибутов редактора свойств.

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

При создании нового Редактора Свойств не нужно всегда переписывать его заново от базового класса TPropertyEditor. Достаточно выбрать в качестве предка уже существующий для данного свойства редактор и переопределить некоторые его методы.

Рассмотрим простейший пример нового Редактора Свойств. У всех видимых объектов есть свойство Hint - подсказка, появляющаяся во время выполнения программы, если задержать на некоторое время мышь на объекте. Это свойство имеет тип String и во время дизайна для его редактирования используется Редактор типа TStringProperty. Обычно, подсказка бывает однострочной, но в некоторых случаях ее нужно сделать многострочной. В принципе, здесь проблемы нет, достаточно во время выполнения программы присвоить свойству Hint нужное значение, например:

Button1.Hint:='Line1'#13#10'Line2';

Теперь подсказка будет состоять из двух строк. Но это достаточно неудобно, более удобно было бы формировать многострочную подсказку во время дизайна, однако редактор TStringProperty такой возможности не дает.

Создадим новый редактор, который мог бы это сделать. Для этого достаточно будет выбрать в качестве предка редактор TStringProperty и переписать некоторые методы. Во-первых, нужно переопределить метод Edit, в котором будет вызываться диалог для ввода строк подсказки. Во-вторых, нужно переопределить функцию GetAttributes, которая возвращает набор параметров, описывающих данное свойство. В частности, должен быть установлен атрибут paDialog, при этом в Инспекторе Объектов у свойства появится кнопка «…» для вызова диалога. И вообще-то нужно изменить метод GetValue, который используется для отображения значения свойства в Инспекторе Объектов.

Назовем новый Редактор Свойств THintProperty.

Объявлениеновогокласса:

THintProperty = class(TStringProperty)

public

function GetAttributes: TPropertyAttributes; override;

function GetValue : String; override;

procedureEdit; override;

end;

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

Функция GetAttributes добавляет к унаследованному множеству атрибуты paDialog (появляется кнопка «…») и paReadOnly (свойство нельзя редактировать непосредственно в Инспекторе Объектов, а только в диалоге, вызываемом через кнопку «…»):

function THintProperty.GetAttributes: TPropertyAttributes;

begin

Result := inherited GetAttributes + [paDialog, paReadOnly];

end;

Функция GetValue заменяет "неправильные" символы #10 и #13 (перевод каретки и переход на новую строку) на символ ">":

function THintProperty.GetValue : string;

var

i : Byte;

begin

result:=inherited GetValue;

for i:=1 to Byte(result[0]) do

if result[i]<#32 then result[i]:='>';

end;

Процедура Edit вызывает диалог для ввода строк подсказки. Диалог можно было бы нарисовать свой собственный, однако можно воспользоваться уже готовым. Несколько разных диалогов лежит в директории X:\DELPHI\SOURCE\LIB. Воспользуемся модулем STREDIT.PAS, в котором есть необходимый диалог редактирования строк:

procedure THintProperty.Edit;

var

HintEditDlg : TStrEditDlg;

s : string;

begin

HintEditDlg:=TStrEditDlg.Create(Application);

with HintEditDlg do

try

Memo.MaxLength := 254;

s:=GetStrValue+#0;

Memo.Lines.SetText(@s[1]);

UpdateStatus(nil);

ActiveControl := Memo;

if ShowModal = mrOk then begin

s:=StrPas(Memo.Lines.GetText);

if s[0]>#2 then Dec(Byte(s[0]),2);

SetStrValue(s);

end;

finally

Free;

end;

end;

Строка if s[0]>#2 then Dec(Byte(s[0]),2) нужна, таккак Memo.Lines.GetText возвращаетвсестрокиссимволами #13#10.








Дата добавления: 2015-09-07; просмотров: 811;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.012 сек.