delphi开放数组参数

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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值