arrays - 如何将数组值作为过程参数传递?

标签 arrays delphi syntax parameter-passing

我认为我的问题可能已经存在于 SO 知识库中,但我只是找不到它。在这种情况下,请引导我找到来源并投票以将其作为重复项关闭。 它是将数组参数传递给过程。

下面的案例简单、直观且有效:

procedure MyProc(const A: array of ShortString);
begin
//
end

现在我可以调用 MyProc 并直接向其传递字符串:

MyProc(['no', 'trump', 'please']);

现在如果我声明 ShortString 数组类型会怎样?

type
  TMyArray = array of ShortString;

procedure MyProc(const A: TMyArray);
begin
//
end

有没有办法直接传递数组类型的参数来执行MyProc? IE。使用与上面相同的过程调用。

+奖励问题:

type TMyRecord = record
  param, value: ShortString
end;

procedure MyProc(const R: TMyRecord);
begin
//
end

是否有任何技术可以调用过程并传递类型记录的值?类似(伪代码):

MyProc((TMyRecord.param='aaa', TMyRecord.value='bbb'));

我问的原因是:我不想声明一个变量并设置它。相反,我想直接将数组/记录值作为过程参数传递。

最佳答案

正如其他人所说,可以在Delphi XE7及更高版本中完成。 在以前的版本中,数组类型不能直接作为参数传递。

如果你离不开这种“舒适”。作为一个“丑陋”的解决方案,你可以使用一个中间函数,将动态数组复制到其相应的数组类型中:

function AsTypeArray(const MyArray : array of ShortString) : TMyArray;
begin
  SetLength(Result, Length(MyArray));
  Move(MyArray[Low(MyArray)], Result[0], Length(MyArray) * SizeOf(MyArray[Low(MyArray)]));
end;

所以你可以写:

MyProc(AsTypeArray(['no', 'trump', 'please']));

我不喜欢这个解决方案,但如果你无法升级到Delphi XE7或更高版本,并且你绝对想直接传递数组类型参数,我认为这是唯一的方法。

请注意,您可以将 TMyArray 对象作为参数传递给为接受动态数组而定义的函数:

procedure MyProc(const A: array of ShortString);
//...

var
  Arr : TMyArray;
begin
  //...
  MyProc(Arr); //It won't raise any error/warning
end;

对于记录,还需要一个返回记录类型的中间函数。

function MyRecord(Param : ShortString; Value : ShortString) : TMyRecord;
begin
  Result.Param := Param;
  Result.Value := Value;
end;

然后您将能够传递记录而无需声明变量。

MyProc(MyRecord('aaa', 'bbb'));

同样在Delphi的最新版本中,我认为没有其他办法。

关于arrays - 如何将数组值作为过程参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39573209/

相关文章:

arrays - 如何从 jQuery 对象数组创建 jQuery 对象?

关于数组的 C 编程语言示例

delphi - 如何在 Delphi 7 中使用 MSXML 6.0 创建 TXML 文档?

delphi - 在 Delphi 中如何验证文本框仅包含数字?

bash - Bash 中的 "[0: command not found"

arrays - 如何打印逗号后没有空格的数组

C++在学生列表中搜索和排序

c# - 从 Delphi dll 回调到 C# app

C# 语法解释

c# - 如何使匿名方法接受可变数量的参数?