нет RTTI для неисследованных типов данных - PullRequest
2 голосов
/ 26 января 2010

AFAIK компилятор не генерирует RTTI, если тип не назван. Например: T = массив [0..1,0..1] из Integer; В этом случае можно узнать общий размер массива, но невозможно узнать размер каждого измерения.

Это работает, только если я использую тип с явным именем: Т01 = 0,1; T = массив [T01, T01] целого числа;

Я что-то пропустил?

Тестовый код:

type
  t = array[0..1, 0..1] of Integer;

procedure test;
var
  i: PTypeInfo;
  d: TArrayTypeData;
begin
  i := TypeInfo(t);
  assert(i.Kind = tkArray);
  d := GetTypeData(i).ArrayData;
end;

Ответы [ 2 ]

1 голос
/ 26 января 2010

Да, в настоящее время это ограничение генерируемой информации RTTI, у вас должно быть имя типа.

Такие вещи не будут работать:

var
 StrArray :  Array of String;

Но сработает следующее:

type
  TStrArray = Array of String;
var
  StrArray : TStrArray;

Обычно я переключал свои динамические массивы на новый синтаксис TArray, который определен в модуле system.pas как, чтобы убедиться, что у них есть имена.

TArray<T> = array of T;

Так что обходной путь к вашей конкретной проблеме - объявить имя типа для этого массива.

type
  TMyArray = array[0..1, 0..1] of Integer;
var
  t : TMyArray;
1 голос
/ 26 января 2010

Вы по-прежнему можете получить размеры массива с помощью встроенных High и Low. Давайте возьмем пример типа array[0..1,3..4] of Integer:

Low(T) // low bound of first range (0)
High(T) // high bound of first range (1)
Low(T[Low(T)]) // low bound of second range (3)
High(T[Low(T)]) // high bound of second range (4)

В двух последних вы можете использовать любой допустимый индекс в значении индекса.

...