Главная » Delphi » Информация  RTTI о множествах

0

Получение информации RTTI  о множестве ненамного сложнее предыдущих тех нологий. В листинге 10.7 представлен программный код,  обеспечивающий функцио нирование главной формы проекта SetRTTI.dpr, который можно  найти на прила гаемом CD, в каталоге, относящемся к данной главе.

Листинг 10.7. Получение информации  RTTI о типах множеств

unit MainFrm;

interface uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls, Grids;

type

TMainForm = class(TForm)

lbSamps: TListBox;

memInfo: TMemo;

procedure FormCreate(Sender: TObject);

procedure lbSampsClick(Sender: TObject);

private{ Закрытые объявления }

public

{ Открытые объявления }

end;

var

MainForm: TMainForm;

implementation

uses TypInfo, Buttons;

{$R *.DFM}

procedure TMainForm.FormCreate(Sender: TObject);

begin

// Добавить несколько примеров перечислимых типов

with lbSamps.Items do begin

AddObject(‘TBorderIcons’, TypeInfo(TBorderIcons));

AddObject(‘TGridOptions’, TypeInfo(TGridOptions));

end;

end;

procedure GetTypeInfoForOrdinal(AOrdTypeInfo: PTypeInfo; AStrings: TStrings);

var

// OrdTypeInfo: PTypeInfo;

OrdTypeData: PTypeData;

TypeNameStr: String;

TypeKindStr: String;

MinVal, MaxVal: Integer;

i: integer;

begin

// Получить указатель на структуру TTypeData

OrdTypeData := GetTypeData(AOrdTypeInfo);

// Получить строку по имени типа

TypeNameStr := AOrdTypeInfo.Name;

// Получить строку с разновидностью типа

TypeKindStr := GetEnumName(TypeInfo(TTypeKind),

Integer(AOrdTypeInfo^.Kind));

// Получить минимальные и максимальные значения для типа

MinVal := OrdTypeData^.MinValue;

MaxVal := OrdTypeData^.MaxValue;

// Добавить информацию в поле memo with AStrings do begin

Add(‘Type Name: ‘+TypeNameStr); Add(‘Type Kind: ‘+TypeKindStr);

// Рекурсивный вызов функции для отображения перечислимых

// значений множества.if AOrdTypeInfo^.Kind = tkSet then begin

Add(‘==========’);

Add(”);

GetTypeInfoForOrdinal(OrdTypeData^.CompType^, AStrings);

end;

// Отображение значения и имени перечислимых типов,

// принадлежащих множеству.

if AOrdTypeInfo^.Kind = tkEnumeration then begin

Add(‘Min Val: ‘+IntToStr(MinVal));

Add(‘Max Val: ‘+IntToStr(MaxVal));

for i := MinVal to MaxVal do

Add(Format(‘            Value: %d  Name: %s’,

[i, GetEnumName(AOrdTypeInfo, i)]));

end;

end;

end;

procedure TMainForm.lbSampsClick(Sender: TObject);

begin

memInfo.Lines.Clear;

with lbSamps do

GetTypeInfoForOrdinal(PTypeInfo(Items.Objects[ItemIndex]),

memInfo.Lines);

end;

end.В список  этой  демонстрационной программы было помещено два типа  множеств. Указатель на структуры  TTypeInfo для этих  двух типов  был  помещен в массив  Objects с  помощью функции  TypeInfo(). Когда  пользователь выбирает из  списка один  из  этих  элементов, вызывается процедура GetTypeInfoForOrdinal(), кото рой  передаются в качестве параметров как указатель  типа  PTypeInfo, так и свойство memInfo.Lines для заполнения данными RTTI.

Процедура GetTypeInfoForOrdinal() выполняет стандартные действия для по лучения  указателя  на структуру TTypeData, принадлежащую заданному  типу. Началь ная информация о типе хранится в параметре типа TStrings, а затем происходит ре курсивный вызов  той же процедуры GetTypeInfoForOrdinal() с передачей в каче стве    первого   параметра   значения   OrdTypeData^.CompType^ —     указателя     на перечислимый тип множества. Получаемые при этом данные  RTTI аналогично до бавляются в то же самое свойство типа TStrings.

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

По теме:

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