Также обратите внимание, что в Delphi переменные динамического типа массива хранятся в виде указателя (в DotNet-говорящем вы бы назвали это ссылочным типом).
Если вы не приведете эту переменную к указателю, компилятор не позволит вам выполнить выделение самостоятельно. Вы должны использовать SetLength (), как уже упоминалось lassevk.
Используя многомерный массив (например, TData), вы можете установить оба измерения за один раз, установив все измерения одним вызовом SetLength (). В результате получается кубоподобная структура (каждое измерение имеет одинаковую длину). Но также возможно дать каждому индексу в измерении длину, отличную от его следующего измерения. В двух измерениях это иногда называют «зубчатым» массивом.
Для этого вы должны написать это так:
SetLength(Data, SizeOfFirstDimension);
for i = 0 to SizeOfFirstDimension - 1 do
SetLength(Data[i], SizeOfSecondDimensionPerIndex(i));
В этом примере я использую функцию с именем SizeOfSecondDimensionPerIndex, чтобы определить размер каждого массива во 2-м измерении, но вы можете определить этот размер любым удобным вам способом.
В дополнение к этому, я бы посоветовал вам использовать префикс 'R' для определений типа записи. Я знаю это не во всех основных руководствах по стилю кодирования, но если вы посмотрите на 'P' -приставки для указателей, 'I'-префиксы для интерфейсов,' F'-префиксы для полей классов, 'a'-префиксы для аргументов, C-префиксы для констант, S-префиксы для строк ресурсов, вы можете следовать этой логике и использовать R-префикс для записей. Я знаю, что это помогло мне лучше понять мой код!
Удачи!