Главная » Delphi » Пользовательские категории

0

Как уже было сказано, категория свойства представляется в программном коде как класс,  который является потомком класса  TPropertyCategory. Возникает вопрос: трудно ли создать  свои собственные категории свойств?  Оказывается, это не так уж и сложно. В большинстве случаев  для  этого  достаточно переопределить виртуальные функции Name() и Description() класса TPropertyCategory и тогда можно  полу чать информацию, относящуюся к данной категории.

В качестве примера создадим  новую категорию Sound, к которой можно  причис лить  некоторые свойства компонента TddgWaveFile (он  уже упоминался в настоя щей  главе  ранее). Объявление класса  новой категории, TSoundCategory, представ лено  в листинге 12.10.  Этот  листинг содержит текст  файла  WavezEd.pas, включаю щего в себя определение категории компонента, редактор его свойств и редактор самого компонента.

Листинг 12.10. WavezEd.pas — редактор свойств для компонента

TddgWaveFile

unit WavezEd;

interface

uses PropertyCategories, DesignEditors, DesignIntf;

type

{ Редактор для свойства WaveName компонента TddgWaveFile }

TWaveFileStringProperty = class(TStringProperty)

public

procedure Edit; override;

function GetAttributes: TPropertyAttributes; override;

end;

{ Редактор для компонента TddgWaveFile. Позволяет воспроизводить и останавливать звучание данных WAV с помощью локального менюв среде IDE. }

TWaveEditor = class(TComponentEditor)

private

procedure EditProp(const Prop: IProperty);

public

procedure Edit; override;

procedure ExecuteVerb(Index: Integer); override;

function GetVerb(Index: Integer): string; override;

function GetVerbCount: Integer; override;

end;

implementation

uses TypInfo, Wavez, Classes, Controls, Dialogs;

{ TWaveFileStringProperty }

procedure TWaveFileStringProperty.Edit;

{ Выполняется по щелчку на кнопке с многоточием рядом со строкой

свойства WavName в окне инспектора объектов. Этот метод позволяет

пользователю выбрать файл в диалоговом окне OpenDialog и задать его

в качестве значения свойства. }

begin

with TOpenDialog.Create(nil) do

try

{ Установить свойства диалогового окна }

Filter := ‘Wav files|*.wav|All files|*.*';

DefaultExt := ‘*.wav';

{ Поместить текущее значение в свойство FileName диалогового

окна. }

FileName := GetStrValue;

{ Выполнить диалог и установить значение свойства, если это

диалоговое окно закрывается по щелчку на кнопке OK. }

if Execute then

SetStrValue(FileName);

finally

Free;

end;

end;

function TWaveFileStringProperty.GetAttributes:?

TPropertyAttributes;

{ Указывает на то, что редактор свойств будет вызывать диалоговое

окно. }

begin

Result := [paDialog];

end;

{ TWaveEditor }

const

VerbCount = 2;

VerbArray: array[0..VerbCount – 1] of string[7] = (‘Play’,’Stop’);

procedure TWaveEditor.Edit;

{ Вызывается, когда пользователь дважды щелкает на компоненте во

время разработки.

Этот метод вызывает метод GetComponentProperties, чтобы обратиться

к методу Edit редактора свойства WaveName. }

var

Components: IDesignerSelections;

begin

Components := TDesignerSelections.Create;

Components.Add(Component);

GetComponentProperties(Components, tkAny, Designer,

EditProp, nil);

end;

procedure TWaveEditor.EditProp(const Prop: IProperty);

{ Вызывается один раз для каждого свойства в ответ на вызов функции

GetComponentProperties. Этот метод ищет редактор свойства WaveName

и вызывает свой метод Edit. }

begin

Prop.Edit;

Designer.Modified;        // Сообщает конструктору о модификации

end;

procedure TWaveEditor.ExecuteVerb(Index: Integer);

begin

case Index of

0: TddgWaveFile(Component).Play;

1: TddgWaveFile(Component).Stop;

end;

end;

function TWaveEditor.GetVerb(Index: Integer): string;

begin

Result := VerbArray[Index];

end;

function TWaveEditor.GetVerbCount: Integer;

begin

Result := VerbCount;

end;

end.После  определения класса  категории остается лишь  зарегистрировать свойства для данной категории, используя одну из функций регистрации. Для компонента TddgWaveFile это  делается в процедуре Register()с помощью следующего  фраг мента кода:

RegisterPropertiesInCategory(TSoundCategory, TddgWaveFile, [‘WaveLoop’, ‘WaveName’, ‘WavePause’]);

Источник: Тейксейра, Стив, Пачеко, Ксавье.   Borland Delphi 6. Руководство разработчика. : Пер.  с англ. — М. : Издательский дом “Вильямс”, 2002. —  1120 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии