Главная » Delphi » Редакторы компонентов  CLX

0

Структура  редакторов компонентов CLX точно такая же, как и у VCL, но кое в чем они  отличаются. Прежде всего  тем,  что  модули,  в которых реализованы функции времени разработки, разбиты на несколько новых  модулей. В частности, модуль DsgnIntf был  переименован в DesignIntf. Кроме  того,  в большинстве случаев  в раздел  uses нужно  добавить новый модуль DesignEditors. В модуле  DesignIntf определены интерфейсы,  которые используются конструктором форм  и  инспекто ром  объектов. В модуле  DesignEditors реализованы классы  редактора основных свойств  и редактора компонентов.

К сожалению, не все возможности времени разработки, использовавшиеся в VCL, применяются в  CLX.  Например,  редактор свойства OwnerDraw доступен  только   в VCL. Редакторы, характерные для CLX, реализованы в модуле CLXEditors, а редак торы, характерные для VCL, — в модуле VCLEditors.

На   рис. 13.8  представлен  редактор  TddgRadioGroupEditor компонента  CLX TRadioGroup, позволяющий пользователю быстро присвоить значение свойству ItemIndex. Класс  TddgRadioGroupEditor определен в  модуле  QddgRgpEdt.pas, исходный код которого представлен в листинге 13.5.

Рис.  13.8.  Выбор  элемента  для   компонента  CLX RadioGroup в специальном редакторе

Листинг 13.5. QddgRgpEdt.pas — исходный  код редактора

TddgRadioGroupEditor

unit QddgRgpEdt;

interface uses

DesignIntf, DesignEditors, QExtCtrls, QDdgDsnEdt;

type

TddgRadioGroupEditor = class( TddgDefaultEditor )

protected

function RadioGroup: TRadioGroup; virtual;

public

function GetVerbCount: Integer; override;

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

procedure ExecuteVerb( Index: Integer ); override;

end;

implementation uses

QControls;

{========================================}

{== Методы класса TddgRadioGroupEditor ==}

{========================================}

function TddgRadioGroupEditor.RadioGroup: TRadioGroup;begin

// Вспомогательная функция, обеспечивающая быстрый доступ к

// редактируемому компоненту. Компонент также проверяется на

// соответствие классу TRadioGroup

Result := Component as TRadioGroup;

end;

function TddgRadioGroupEditor.GetVerbCount: Integer;

begin

// Возвращается количество новых элементов меню

Result := RadioGroup.Items.Count + 1;

end;

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

begin

// Заголовки элементов контекстного меню

if Index = 0 then

Result := ‘Edit Items…’

else

Result := RadioGroup.Items[ Index – 1 ];

end;

procedure TddgRadioGroupEditor.ExecuteVerb( Index: Integer );

begin

if Index = 0 then

EditPropertyByName( ‘Items’ )        // Определено в QDdgDsnEdt.pas

else begin

if RadioGroup.ItemIndex <> Index – 1 then

RadioGroup.ItemIndex := Index – 1

else

RadioGroup.ItemIndex := -1;          // Сбросить все элементы

Designer.Modified;

end;

end;

end.Методика,  используемая  в  классе  TddgRadioGroupEditor, применима как  для VCL, так и для CLX. В данном примере набор  пунктов контекстного меню компонента TRadioGroup зависит от элементов выбранных в группе.  Выбор  пункта  меню,  соот ветствующего одному из элементов группы,  приводит к изменению значения свойства ItemIndex. Если в группе  нет  ни одного  элемента, то меню  содержит только  пункт Edit Items.

При  выборе пользователем пункта  меню  Edit Items вызывается редактор объекта типа  TStringList, в котором указывается значение для свойства Items компонента TRadioGroup. Метод  EditPropertyByName() не входит  в состав  CLX или  VCL. Он определен в классе TddgDefaultEditor. Этот  метод  используется для вызова  редак тора   любого   указанного свойства  компонента  из  редактора  данного  компонента. Класс TddgDefaultEditor реализован в модуле QddgDsnEdt.pas, исходный код ко торого представлен в листинге 13.6.

Листинг 13.6. QddgDsnEdt.pas — исходный код редактора TddgDefaultEditor

unit QddgDsnEdt;

interface uses

Classes, DesignIntf, DesignEditors;

type

TddgDefaultEditor = class( TDefaultEditor )

private

FPropName: string;

FContinue: Boolean;

FPropEditor: IProperty;

procedure EnumPropertyEditors(const

PropertyEditor: IProperty);

procedure TestPropertyEditor( const PropertyEditor: IProperty;

var Continue: Boolean );

protected

procedure EditPropertyByName( const APropName: string );

end;

implementation uses

SysUtils, TypInfo;

{=====================================}

{== Методы класса TddgDefaultEditor ==}

{=====================================}

procedure TddgDefaultEditor.EnumPropertyEditors( const

PropertyEditor: IProperty );

begin

if FContinue then

TestPropertyEditor( PropertyEditor, FContinue );

end;

procedure TddgDefaultEditor.TestPropertyEditor( const PropertyEditor: IProperty; var Continue: Boolean );

begin

if not Assigned( FPropEditor ) and

( CompareText( PropertyEditor.GetName, FPropName ) = 0 ) then

begin

Continue := False;

FPropEditor := PropertyEditor;

end;

end;

procedure TddgDefaultEditor.EditPropertyByName( const

var

Components: IDesignerSelections;

begin

Components := TDesignerSelections.Create;

FContinue := True;

FPropName := APropName;

Components.Add( Component );

FPropEditor := nil;

try

APropName: string );

GetComponentProperties( Components, tkAny, Designer, EnumPropertyEditors );

if Assigned( FPropEditor ) then

FPropEditor.Edit;

finally

FPropEditor := nil;

end;

end;

end.

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

По теме:

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