http://hi.baidu.com/wangkuoguang/item/dc8762498de04be01381daae
procedure中使用动态数组作为参数的技巧
将动态数组作为函数或过程的一个参数。
下一段代码
procedure ListView(var myArr : array of string);
var
i :integer;
mytext :string;
begin
setlength(myArr,10);
for i :=3 to 9 do
myarr[i] := inttostr(i);
for i :=0 to 9 do
mytext :=mytext + myarr[i] ;
end;
procedure makeA(name,id:string);
var
Darr :array of string;
i :integer;
begin
setlength(Darr,4);
for i := 0 to 3 do
Darr[i] := inttostr(i);
end;
Listview(Darr);
end;
如上的一段代码在delphi里不能通过语法检查,会在‘setlength(myarr,10)‘处报错。delphi会报告语法错误--incompatible type。产生这样的错误原因 直接在参数中写 array of string,编译器不会认为它是动态数组,而认为它是静态数组,而静态数组是不能执行setLength操作的。这是历吏遗留问题,PASCAL没有动态数组,只有静态数组,为了向过程传递各种长度的静态数组,于是规定静态数组参数类型可以写成 array of integer这样的形式,省去了标界,以便接收不同长度的数组作参数。Delphi支持动态数组,但在过程参数中,array of integer这样的定义形式已经认为是静态数组类型。所以必须以自定义类型的方式来实现动态数组作过程参数。
要想实现上段代码的原本思想,则需要在单元的变量定义部分,自定义一个动态数组的变量类型,如:
type
TDyArr = array of string;
上段代码改为:
procedure ListView(var myArr : TDyArr);
var
i :integer;
mytext :string;
begin
setlength(myArr,10);
for i :=3 to 9 do
myarr[i] := inttostr(i);
for i :=0 to 9 do
mytext :=mytext + myarr[i] ;
end;
procedure makeA(name,id:string);
var
Darr :TDyArr;
i :integer;
begin
setlength(Darr,4);
for i := 0 to 3 do
Darr[i] := inttostr(i);
end;
Listview(Darr);
end;
就不会出现语法错误的报告了。