Как передать общий массив в качестве параметра открытого массива в Delphi?

4

delphi,delphi-xe5,

Дельфи, Дельфи-xe5,

Ответов: 2


3 принят

Один из способов сделать то, что вы хотите, - это изменить параметр на открытый массив TTest, т.е.

TArray<TTest>

Но предположил, что вы не хотите изменять параметр и действительно хотите, чтобы он был a , тогда вы можете просто использовать синтаксис псевдо-конструктора массива для его вызова (почти во всех версиях Delphi, кроме очень старых). Скажем, у вас есть что-то вроде:type TTest = (a, b, c); procedure DoTest(const stest: TArray<TTest>); // simple demo implementation var I: Integer; begin for I := Low(stest) to High(stest) do Write(Integer(stest[I]), ' '); Writeln; end;

begin
  DoTest(TArray<TTest>.Create(a, c, b, a, c));
end.

Затем его можно вызвать, используя синтаксис Create, без необходимости объявлять переменную или заполнять ее вручную. Компилятор сделает это за вас:

0 2 1 0 2

Выход, как и ожидалось:

procedure DoTest(stest: TArray<TTest>);

Сейчас у меня нет компилятора Delphi, поэтому я не могу это проверить, но мне

stest

не объявляется как параметр открытого массива , а параметр динамического массива. Вы действительно хотитеprocedure DoTest(const stest: array of TTest);

a

1

Компилятор может смутить aдругую декларацию.

Квалифицируйте тип следующим образом:

DoTest([Ttest.a]);

Заметка:

Эта функция инициализации динамических массивов была введена в XE7 .


0

Я предполагаю, что с помощью «как я могу вызвать DoTest без создания переменной типа TArray» вы хотите избежать объявления и инициализации локальной переменной, например кода

var arr: TArray<TTest>;
begin
  SetLength(arr, 1);
  arr[0] := a;
  DoTest(arr);

Для этого вы можете использовать конструктор массива, например:

DoTest(TArray<TTest>.Create(a));

Этот синтаксис поддерживается, по крайней мере, с Delphi 2010.

Дельфи, Дельфи-xe5,
Похожие вопросы