Процедура SetLength изменяет размер строки, одномерного динамического массива или многомерного динамического массива.
Вариант 1.
При изменении размера строки StringToChange, новый размер NewLength может быть меньше, такой же или больше, чем у существующей строки. Во всех случаях размер задается в символах и в любом случае создается новая строка.
Если строка короче, то она отсекается. Если она длиннее, то добавленные символы не будут проинициализированы. Это может дать странный эффект - смотрите первый пример.
Вариант 2.
Динамический массив объявляется без задания фиксированной длины. Такое объявление создает лишь указатель. Даже многомерный динамический массив создается в виде одного неинициализированного указателя.
SetLength меняет длину измерений Dim1Length, Dim2Length … массива ArrayToChange. Это может быть сделано несколько раз - не только над неинициализированным указателем. Последующие вызовы сотрут данные или добавят дополнительное место. Это дополнительное место инициализируется только в том случае, если оно содержит строки, интерфейсы или переменные типа Variant.
Dim1Length указывает на левое (внешнее) измерение массива.
Slice Создает часть массива с параметром "Открытый Массив"
Пример кода : Делаем строку меньше или длиннее
var
myString : string;
onPos : Integer;
begin // Присваиваем моей строке известную фразу
myString := 'The cat sat on the mat'; // Показ этого значения
ShowMessage('"'+myString+'"'); // Теперь делаем строку длиннее SetLength(myString, 25); // Показ снова этого значения // Обратите внимание, что строка закончена преждевременно // Это потому что дополнительные символы не инициализированы
ShowMessage('"'+myString+'"'); // Теперь делаем строку короче - прерывают перед 'sat'
onPos := AnsiPos('sat', myString); SetLength(myString, onPos-1); // Показ этой строки снова // Теперь строка полностью инициализирована
ShowMessage('"'+myString+'"');
end;
"The cat sat on the mat"
"The cat sat on the mat
"The cat "
Пример кода : Установка длины одномерных и многомерных массивов
var
singleArray : array of string;
multiArray : array of array of Word;
i, j : Integer;
begin // Установливаем длину одномерного массива SetLength(singleArray, 4); // Теперь заполняем : обратите внимание, что динамические массивы начинаются с 0
ShowMessage('Одномерный массив :');
for i := 0 to 3 do
begin
singleArray[i] := 'String '+IntToStr(i);
ShowMessage('Элемент '+IntToStr(i)+' = '+singleArray[i]);
end; // Устанавливаем длину многомерного массива SetLength(multiArray, 2, 3); // Теперь заполняем его
ShowMessage('Многомерный массив :');
for i := 0 to 1 do
for j := 0 to 2 do
begin
multiArray[i,j] := i + j;
ShowMessage('Элемент '+IntToStr(i)+','+IntToStr(j)+' = '+
IntToStr(multiArray[i,j]));
end;
end;
Одномерный массив :
Элемент 0 = 0
Элемент 1 = 1
Элемент 2 = 2
Элемент 3 = 3
Многоиерный массив :
Элемент 0,0 = 0
Элемент 0,1 = 1
Элемент 0,2 = 2
Элемент 1,0 = 1
Элемент 1,1 = 2
Элемент 1,2 = 3