delphi中,开放数组是指数组元素个数不定的数组,并非是变量类型,而是一种参数类型,只有在声明方法定义形参时才会用到。而在调用参数为开放数组的方法时,传入的实参可以是静态数组,也可以是动态数组。
开放数组和动态数组的形式都是array of Type,只是根据位置的不同表明不同的身份,在方法声明中定义形参时使用array of Type定义的是开放数组参数;在其他位置使用array of Type定义的则是动态数组变量。
因为开放数组参数在调用时可以传入静态数组或动态数组,而静态数组不能使用SetLength()方法设置数组长度,因此为了保持一致,对于开放数组无论传入是实参是静态数组还是动态数组,都不能使用SetLength()方法,否则会提示Incompatible types。所以在上面的代码中,如果增加SetLength(SourceArray, Length(SourceArray)+1)类似的代码,则编译不通过。
因此,若要将数组作为方法的输出参数,那么这个参数的类型就不能是开放数组;而函数的返回值也是一个特殊的输出参数,因此函数的返回值不可以是开放数组。
而且因为使用array of Type形式定义的形参都是开放数组,因此要定义类型为动态数组的参数时,就必须先声明一个动态数组类型,然后将参数声明为此动态数组类型。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TStrArray = array of string;
TForm1 = class(TForm)
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
function GetMsgArray: TStrArray;
function CopyArray(SourceArray: array of string;out DestArray: TStrArray): boolean;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
var
MessageArray, OutArray: TStrArray;
sTemp: string;
iIndex: Integer;
begin
MessageArray := GetMsgArray;
CopyArray(MessageArray, OutArray);
for iIndex := 0 to Length(OutArray) -1 do
begin
sTemp := sTemp + OutArray[iIndex] + sLineBreak;
end;
ShowMessage(sTemp);
end;
function TForm1.CopyArray(SourceArray: array of string;
out DestArray: TStrArray): boolean;
var
iIndex, iLength: integer;
begin
result := false;
for iIndex := 0 to Length(SourceArray) - 1 do
begin
iLength := Length(DestArray);
SetLength(DestArray, iLength + 1);
DestArray[iLength] := SourceArray[iIndex];
end;
result := true;
end;
function TForm1.GetMsgArray: TStrArray;
var
iIndex: Integer;
begin
for iIndex := 0 to 3 do
begin
SetLength(Result, Length(Result) + 1);
Result[Length(Result)-1] := 'tips' + IntToStr(iIndex);
end;
end;
end.
上面的代码中,SourceArray定义为array of string,但是因为SourceArray是函数的形参,因此是开放数组。
GetMsgArray函数的返回值,以及CopyArray函数的DestArray参数都是动态数组。
因为DestArray参数的类型是动态数组参数,在调用此方法时传入的实参类型必须为动态数组,否则编译时会提示Incompatible types。