Содержание материала

 

Первый элемент массива метаданных описывает свойство Caption, для него задается вид pkImmediateText, чтобы любое изменение названия метки сразу же отображалось на форме. Второй элемент очень короток - это ссылка на другой метакласс, описывающий положение и размеры метки. В данном случае мы предполагаем, что метакласс TGsvBounds_INFO описан либо в текущем программном модуле, либо в другом модуле, указанном оператором uses. Отметим, что мы не задаем здесь никаких других аттрибутов, полагая, что они будут взяты из класса TGsvBounds_INFO, хотя можно было бы их явно указать - в этом случае инспектор использовал бы явно указанные аттрибуты, а не аттрибуты вложенного свойства. Следующий элемент подобен предыдущему, но для него мы указываем имя published-свойства, а имя метакласса передаем через поле NestedType, предполагая, что этот тип зарегистрирован в реестре метаданных. И, наконец, последний элемент - цвет, для которого мы указываем имя свойства, название и имя класса, который реализует функциональность по представлению значения цвета в виде RGB. Последнее, что мы должны сделать, чтобы объекты типа TLabel были доступны для инспекции,- это зарегистрировать класс TLabel_INFO в реестре метаданных. Удобнее всего это можно сделать так:

Code:

initialization

GsvRegisterTypeInfo(TLabel_INFO);

 

Поскольку в предложенном описании даны ссылки на другие метаклассы, то продолжим пример и предоставим их реализацию.

Code:

type

TGsvBounds_INFO = class(TGsvObjectInspectorTypeInfo)

   public

     classfunction TypeInfo: PGsvObjectInspectorPropertyInfo; override;

     classfunction ChildrenInfo(Index: Integer):

                     PGsvObjectInspectorPropertyInfo; override;

   end;

 

classfunction TGsvBounds_INFO.TypeInfo: PGsvObjectInspectorPropertyInfo;

const

   DSK: TGsvObjectInspectorPropertyInfo = (

     Caption: 'Положение и размер'; Kind: pkFolder;

     Help: 1234; Hint: 'Координаты верхнего левого угла и размеры'

   );

begin

   Result := @DSK;

end;

 

classfunction TGsvBounds_INFO.ChildrenInfo(Index: Integer):

   PGsvObjectInspectorPropertyInfo;

const

   DSK: array[0..3] of TGsvObjectInspectorPropertyInfo = (

     ( Name: 'Left'; Caption: 'Левый край'; Kind: pkText ),

     ( Name: 'Top'; Caption: 'Верхний край'; Kind: pkText ),

     ( Name: 'Width'; Caption: 'Ширина'; Kind: pkText ),

     ( Name: 'Height'; Caption: 'Высота'; Kind: pkText )

   );

begin

   ifIndex <= High(DSK) then Result := @DSK[Index]

   else                       Result := nil;

end;

 

Метакласс TGsvBounds_INFO перегружает два метода базового класса. Метод TypeInfo возвращает указатель на метаданные всего класса в целом. Это позволяет задать аттрибуты свойства в одном метаклассе и ссылаться на них из множества других метаклассов. Метод возвращает указатель на константную запись, в которой мы задаем название, вид поля и справочную информацию о свойстве. Метод ChildrenInfo описывает координаты верхнего левого угла прямоугольника и его размеры, ссылаясь на соответствующие published-свойства компонента. Метакласс для шрифта будет задавать имя шрифта, его размер, стиль и цвет:

Code:

type

TFont_INFO = class(TGsvObjectInspectorTypeFontInfo)

public

   classfunction TypeInfo: PGsvObjectInspectorPropertyInfo; override;

   classfunction ChildrenInfo(Index: Integer):

                   PGsvObjectInspectorPropertyInfo; override;

end;

 

classfunction TFont_INFO.TypeInfo: PGsvObjectInspectorPropertyInfo;

const

   DSK: TGsvObjectInspectorPropertyInfo = (

     Caption: 'Шрифт'; Kind: pkDialog

   );

begin

   Result := @DSK;

end;

 

classfunction TFont_INFO.ChildrenInfo(Index: Integer):

   PGsvObjectInspectorPropertyInfo;

const

   DSK: array[0..3] of TGsvObjectInspectorPropertyInfo = (

     ( Name: 'Name'; Caption: 'Имя'; Kind: pkText;

       Hint: 'Имя шрифта' ),

     ( Name: 'Size'; Caption: 'Размер'; Kind: pkText;

       Hint: 'Размер в пунктах' ),

     ( Name: 'Style'; Caption: 'Стиль'; Kind: pkSet;

       NestedClass: TFontStyles_INFO ),

     ( Name: 'Color'; Caption: 'Цвет'; Kind: pkColor;

       NestedClass: TGsvColor16_INFO )

   );

begin

   ifIndex <= High(DSK) then Result := @DSK[Index]

   else                       Result := nil;

end;

 

Класс TFont_INFO порожден от класса TGsvObjectInspectorTypeFontInfo, в котором переопределены методы ShowDialog и ObjectToString. Метод ShowDialog вызывает стандартный Windows-диалог выбора шрифта, а метод ObjectToString выводит в качестве значения свойства Font строку, включающую имя шрифта и его размер. Свойства стиля и цвета заданы собственными метаклассами:

Code:

type

TGsvColor16_INFO = class(TGsvObjectInspectorTypeListInfo)

protected

   classfunction ListEnumItems(Index: Integer):

                   PGsvObjectInspectorListItem; override;

public

   classfunction TypeInfo: PGsvObjectInspectorPropertyInfo;

                   override;

end;

 

TFontStyles_INFO = class(TGsvObjectInspectorTypeSetInfo)

public

   classfunction ChildrenInfo(Index: Integer):

                   PGsvObjectInspectorPropertyInfo; override;

end;

 

classfunction TGsvColor16_INFO.ListEnumItems(Index: Integer):

   PGsvObjectInspectorListItem;

const

   DSK: array[0..15] of TGsvObjectInspectorListItem = (

     ( Name: 'Черный';       Data: clBlack ),

     ( Name: 'Коричневый';   Data: clMaroon ),

     ( Name: 'Темнозеленый'; Data: clGreen ),

     ......

     ( Name: 'Розовый';      Data: clFuchsia ),

     ( Name: 'Голубой';      Data: clAqua ),

     ( Name: 'Белый';        Data: clWhite )

   );

begin

   ifIndex <= High(DSK) then Result := @DSK[Index]

   else                       Result := nil;

end;

 

classfunction TGsvColor16_INFO.TypeInfo:

   PGsvObjectInspectorPropertyInfo;

const

   DSK: TGsvObjectInspectorPropertyInfo = (

     Caption: 'Цвет'; Kind: pkDropDownList

   );

begin

   Result := @DSK;

end;

 

classfunction TFontStyles_INFO.ChildrenInfo(

   Index: Integer): PGsvObjectInspectorPropertyInfo;

const

   DSK: array[0..2] of TGsvObjectInspectorPropertyInfo = (

     ( Name: 'Style'; Caption: 'Полужирный'; Kind: pkBoolean;

       Tag: Ord(fsBold) ),

     ( Name: 'Style'; Caption: 'Курсив'; Kind: pkBoolean;

       Tag: Ord(fsItalic) ),

     ( Name: 'Style'; Caption: 'Подчеркнутый'; Kind: pkBoolean;

       Tag: Ord(fsUnderline) )

   );

begin

   ifIndex <= High(DSK) then Result := @DSK[Index]

   else                       Result := nil;

end;

 

Добавить комментарий

Не использовать не нормативную лексику.

Просьба писать ваши замечания, наблюдения и все остальное,
что поможет улучшить предоставляемую информацию на этом сайте.

ВСЕ КОММЕНТАРИИ МОДЕРИРУЮТСЯ ВРУЧНУЮ, ТАК ЧТО СПАМИТЬ БЕСПОЛЕЗНО!


Защитный код
Обновить