Delphi过程函数之间的参数传递
声明过程和函数时,根据需要写入参数,参数分为两种:
形式参数:所谓形式参数是指过程和函数声明语句的参数列表中的参数,简称形参。
1 function TForm1.myfunc(s1, s2: String): String;
实际参数:实际参数则是调用函数时传入函数的参数列表,简称实参。
1 myfunc(str1,str2);
参数传递又分为按值传递,按址传递。-------举例理解就像数组中的 A数组:=B数组,改变任一数组内容,另外一个随之改变(同一地址)。A数组:=copy(B数组),只是内容相同,地址不同。不会随之改变
按值传递:将实参复制一份给形参所代表的临时存储单元。实参和形参的内容都保存在不同的内存地址中,在过程和函数中改变形参的值时,只是形参内容发生变化,不会影响到实参。
1 var 2 s1,s2: Integer; S1------->> X=2 3 begin S2------->> Y=2 4 s1:= 2; 5 s2:= 2; 6 myfunc(s1,s2); 7 ShowMessage(IntToStr(s1+s2));//结果为4,此时x,y已经改变 8 end; 9 10 function TForm1.myfunc(x,y: Integer): Integer;//没有var关键字 11 begin 12 x:= x + 10; 13 y:= y + 10; 14 Result:= x + y; 15 end;
按址传递:实参将保存内容的内存地址传递给形参,形参与实参指向同一内存地址,当形参的内容发生变化时,实参的内容也会随之改变。
1 procedure TForm1.Button1Click(Sender: TObject); 2 var 3 s1,s2: Integer; 4 begin 5 s1:= 2; 6 s2:= 2; S1------->> var @X 7 myfunc(s1,s2); S2-------->> var @Y 8 ShowMessage(IntToStr(s1+s2));//结果为24,此时x,y已经改变 9 end; 10 11 function TForm1.myfunc(var x,y: Integer): Integer;//有var关键字 12 begin 13 x:= x + 10; 14 y:= y + 10; 15 Result:= x + y; 16 end;
参数类型:所谓的参数类型指的不是参数的数据类型,而是指在Delphi中 6 种不同的类型的参数。
即数值参数,常量参数,变量参数,无类型参数,外部参数,以及开放数组参数。
在过程或函数种形参可以分为 3 种 :
1.不带 var,称为数值参数,简称值参。 即上方 按值传递
2.带有 var,称为变量参数,简称变参。 即上方 按址传递
3.带有const,称为常量参数:
在过程或函数中,常量参数的值是不可以改变的,因此可以将它作为一个常量使用,在过程或函数中不可以为常量参数赋值,否则会出现编译错误。并且也不可以吧常量参数作为实参传递给其他过程或参数。
无参数数据类型:指在过程或函数声明时不指定参数的数据类型,如果参数没有指定数据类型则必须在参数前假var ,out ,count.
在参数前加 var或 out 表示参数的值是可以改变的。而参数前加 count,参数值不能改变。当参数为无类型参数时,实参可以是任意数据类型的变量或表达式。
使用无类型参数因为Delphi没有对参数进行合法检查,所以使用时应对其进行强制类型转换。好处是不用考虑实参的数据类型,只需要将形参根据实参类型强制转换即可。
1 procedure TForm1.myproc(var x, y);//参数无数据类型 2 begin 3 Integer(x):= Integer(x)+ 10; 4 Integer(y):= Integer(y)+ 10; 5 end;
外部参数:形参前使用 out 称为外部参数,它不能用来向过程函数种传入信息,只能传出。外部参数类似于变量参数。当过程或函数被调用结束后,通过外部参数可以回传某些信息,如果调用失败,外部参数就被设为空。
外部参数主要用于不允许使用函数例程的 COM 等分布式技术中,如果需要向例程传递一个没有初始化的变量也可以使用外部参数。 与上方按址传递类似。
开放数组参数:就是一个参数数组,长度是不固定的,开放数组参数可以把静态数组和动态数组传递给本身,但不能用 setlength 改变动态数组的长度。
1 type 2 arr = array[0..10] of Integer;
1 function TForm1.arrinit(mm:arr):arr; 2 var 3 i: Integer; 4 begin 5 for i:=0 to 10do 6 begin 7 mm[i]:= i; 8 end; 9 result:= mm; 10 end;
1 procedure TForm1.Button1Click(Sender: TObject); 2 var 3 aa: arr; 4 i,sum: Integer; 5 begin 6 sum:= 0; 7 aa:= arrinit(aa); 8 for i:=0 to 10 do 9 begin 10 sum:= sum+aa[i]; 11 end; 12 ShowMessage(IntToStr(sum)); 13 end;
默认参数:声明过程中可以设置参数默认值。默认参数后得其他参数也只能是默认参数,即默认参数只能出现在最后
1 function myfunc2(x:Integer=10;y:Integer=20):Integer;
1 function TForm1.myfunc2(x, y: Integer): Integer; 2 begin 3 Result:= x + y; 4 end;
1 procedure TForm1.Button1Click(Sender: TObject); 2 var 3 sum: integer; 4 begin 5 sum:= myfunc2(); //计算自定义函数中x和y的默认值,结果40 6 sum:= myfunc2(20); //更改了x默认值为20,结果40 7 sum:= myfunc2(20,30);//更改了x和y默认值为20,30,结果50 8 end;