2009-10-29 1 views
6

Я пытаюсь изменить размер массива определенного класса, переданного в качестве аргумента, например.Delphi: SetLength() в аргументе типа «массив TObject»

procedure Resize(MyArray: Array of TObject); 
begin 
    SetLength(MyArray, 100); 
end; 

Однако при этом возникает ошибка «E2008 Несовместимые типы». Верно ли, что вы не можете этого сделать (я видел слухи, но никакой официальной документации), или я делаю что-то неправильно?

ответ

10

Вы не указали тип явно. Таким образом, у компилятора есть проблемы, соответствующие им. Если определить тип, как:

type 
    TObjectArray = array of TObject; 

Существует никаких сомнений, и (благодаря Mghie) вы должны использовать параметр уага, потому что resising скорее всего, приведет к изменению указателя.

procedure Resize(var MyArray: TObjectArray); 
begin 
    SetLength(MyArray, 100); 
end; 
+3

Должен быть параметр var? – mghie

+0

Хорошая точка. Исправлено. –

+0

Этот ответ пропускает ключевой момент, который является разницей между открытыми массивами и массивными пучками. –

9

Вы смешиваете открытые массивы (параметр Resize) и динамические массивы (то, что SetLength ожидает). См. here для объяснения - особенно часть под названием «Путаница».

+0

Спасибо, Герхардт. Я все еще изучаю этот материал. :) – conciliator