我试图将一些字符串传递给动态字符串数组,在这种情况下它正在工作:
procedure DoSomeThing(in_cmd: string; var out_strs: array of string);
begin
..
for n := low(out_strs) to high(out_strs) do
begin
out_strs[n] :='bla bla';
end;
end;
Run Code Online (Sandbox Code Playgroud)
在应用程序中使用as:
.
.
.
SetLength(my_out_str, sizer);
DoSomeThing('do it now', my_out_str);
.
.
Run Code Online (Sandbox Code Playgroud)
但我想在程序中使用my_out_str的SetLength.可能吗?
是的,这是可能的,但您必须使用先前定义的动态数组类型声明参数.您目前正在使用开放阵列.
type
TStrDynArray = array of string;
procedure DoSomeThing(in_cmd:string; var out_strs: TStrDynArray);
begin
SetLength(out_strs, 2 * Length(inn_cmd));
...
Run Code Online (Sandbox Code Playgroud)
或者,TArray<string>
如果可用泛型,请使用(来自Delphi 2009)
procedure DoSomeThing(in_cmd:string; var out_strs: TArray<string>);
begin
SetLength(out_strs, 2 * Length(inn_cmd));
Run Code Online (Sandbox Code Playgroud)
其原因在于,array of x
在一个上下文中与array of x
另一个上下文中的不同.
在类型声明中
type
TDynamicArray = array of string;
Run Code Online (Sandbox Code Playgroud)
是动态数组类型,可以调整大小.动态数组在Delphi 4中引入.
在参数定义中
procedure Test(var X: array of string);
Run Code Online (Sandbox Code Playgroud)
是一个开放数组参数,这意味着它将接受不同大小的数组作为输入.它只需要一个指针(即引用)到第一个元素,以及数组中最后一个元素的索引.它不知道或不关心输入数组是动态数组还是静态数组,因此不允许调整长度.
打开数组参数早于Delphi 1.
进一步阅读
http://rvelthuis.de/articles/articles-openarr.html