我认为我的问题可能已经存在于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
传递数组类型的参数?即使用与上述相同的程序调用。
+红利问题:
type TMyRecord = record
param, value: ShortString
end;
procedure MyProc(const R: TMyRecord);
begin
//
end
是否有任何技术可以调用过程并传递类型记录的值?类似(伪代码):
MyProc((TMyRecord.param='aaa', TMyRecord.value='bbb'));
我问的原因是:我不想申报变量并进行设置。相反,我想直接将数组/记录值作为过程参数传递。
答案 0 :(得分:4)
是的,您所写的内容适用于Delphi XE7及更高版本。
program Project1;
{$APPTYPE CONSOLE}
type
TMyArray = array of ShortString;
procedure MyProc(const A: TMyArray);
var
s : ShortString;
begin
for s in A do WriteLn(s);
end;
begin
MyProc(['no', 'trump', 'please']);
ReadLn;
end.
输出:
没有
王牌
请
XE7引入了新的动态数组初始化语法,允许像上面那样的函数调用。在此之前,您需要使用显式构造函数初始化,如:
MyProc(TMyArray.Create('no', 'trump', 'please'));
对于记录,您需要构造函数或其他方法来返回记录类型。这有效:
program Project1;
{$APPTYPE CONSOLE}
type
TMyRecord = record
param: ShortString;
value: ShortString;
constructor Create(AParam, AValue : ShortString);
end;
constructor TMyRecord.Create(AParam: ShortString; AValue: ShortString);
begin
param := AParam;
value := AValue;
end;
procedure MyProc(const R: TMyRecord);
begin
WriteLn(R.param);
WriteLn(R.value);
end;
begin
MyProc(TMyRecord.Create('foo', 'bar'));
ReadLn;
end.
输出:
FOO
杆
答案 1 :(得分:4)
正如其他人所说,它可以在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'));
同样在最后的德尔福版本中,我认为没有别的办法。