您的位置:首页 > 其它

Delhpi中的函数与过程

2015-10-06 22:56 267 查看

Delhpi中的函数与过程

函数与过程的概述

过程可以看作轻量级的函数。
从形式上讲:过程强调处理事务的流程而不是结果,所以过程没有返回值。而函数强调处理事务后的结果,所以有返回值。
从功能上讲:函数可以用作类的构造器即构造函数,而过程不具备这种功能。
除此之外,函数与过程并没有太大的差异。

注意:以下类容以函数为准,讲解一些需要注意的事项。

函数的形式参数的值是否可变

{使用关键字const后,形式参数的值便不可以改变,否则编译出错}
function TForm1.ConstFunction(const name: String): String;
begin
{不可以这样:name := '鬼A魅'}
Result := name;
end;

{默认情况下,形式参数的值是可以改变的}
function TForm1.NormalFunction(name: String): String;
begin
name := '鬼A魅';
Result := name;
end;

</pre><h2>函数的形式参数的值是传值还是传址</h2><div></div><pre name="code" class="delphi">var
MyValue: Integer = 2;//全局变量

{传址,将内存单元MyValue的地址传递给address}
function TForm1.AddressFunction(var address: Integer): Integer;
begin
{因为address中保存的是内存单元MyValue的地址,
对address的操作就是对MyValue的操作,
MyValude中的值会发生变化}
address := address * 2;
{这里再将内存单元MyValue的地址传递给Result,函数拿到的是MyValue中的值}
Result := address;
end;

{传值,将内存单元MyValue的值复制一份传递给value}
function TForm1.ValueFunction(value: Integer): Integer;
begin
{对value的操作是不会影响到MyValue的,
如果此刻MyValue的值发生变化同样也不会影响到value}
value := value * 2;
Result := value;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
//结果:2
showMessage(IntToStr(MyValue));

//结果:4,函数AddressFunction()在这里会改变MyValue的值
showMessage(IntToStr(AddressFunction(MyValue)));
//结果:4
showMessage(IntToStr(MyValue));

//结果:8
showMessage(IntToStr(ValueFunction(MyValue)));
//结果:4
showMessage(IntToStr(MyValue));
end;

函数的形式参数的开放模式

说明:可以通过数组来传递参数个数或者参数类型不确定的参数列表

{参数为数组,该数组的长度与数组中元素的类型均不确定}
function TForm1.LengthTypeParams(const MyArray: array of const): Integer;
var
index: Integer;
str: String;
begin
{通过循环来处理数组中的所有元素}
for index := Low(MyArray) to High(MyArray) do
begin
{因为类型不确定,所以我们需要判断数据的类型然后再进行相应的处理}
case MyArray [index].VType of
vtInteger: str := IntToStr(MyArray [index].VInteger);
vtBoolean: str := BoolToStr(MyArray [index].VBoolean);
end;
showMessage(str);
end;
end;

{参数为数组,该数组的长度不确定,但数组中元素的类型确定}
function TForm1.LengthParams(const MyArray: array of Integer): Integer;
var
index: Integer;
begin
{通过循环来处理数组中的所有元素}
for index := Low(MyArray) to High(MyArray) do
showMessage(IntToStr(MyArray[index]));
end;

procedure TForm1.Button2Click(Sender: TObject);

begin
showMessage(BoolToStr(True));
LengthParams([1, 3, 5]);//结果为:1,3,5
LengthTypeParams([520, True]);//结果为:520, -1(True:-1;False:0);
end;

{元素类型可变的数组,元素的可能类型如下}
type
TVarRec = record
case Byte of
vtInteger:    (VInteger: Integer; VType: Byte);
vtBoolean:    (VBoolean: Boolean);
vtChar:       (VChar: Char);
vtExtended:   (VExtended: PExtended);
vtString:     (VString: PShortString);
vtPointer:    (VPointer: Pointer);
vtPChar:      (VPChar: PChar);
vtObject:     (VObject: TObject);
vtClass:      (VClass: TClass);
vtWideChar:   (VWideChar: WideChar);
vtPWideChar:  (VPWideChar: PWideChar);
vtAnsiString: (VAnsiString: Pointer);
vtCurrency:   (VCurrency: PCurrency);
vtVariant:    (VVariant: PVariant);
vtInterface:  (VInterface: Pointer);
end;

函数的形式参数的缺省模式

注意:声明函数时需要给那些缺省的参数赋初值
function WithoutParams(param1: Integer; param2: Integer = 2; param3: Integer = 3) : Integer;


function TForm1.WithoutParams(param1, param2, param3: Integer): Integer;
begin
showMessage(IntToStr(param1)+'|'+IntToStr(param2)+'|'+IntToStr(param3));
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
WithoutParams(1); //结果为:1|2|3
WithoutParams(1, 4); //结果为:1|4|3
WithoutParams(1, 4, 5); //结果为:1|4|5
end;


缺省参数后面的参数都将缺省。

函数的重载

说明:函数名字相同,参数列表不同。声明时需要使用关键字overload对同名的函数进行标注。

function SameNameFunction(): Integer; overload;
function SameNameFunction(param: Integer): Integer; overload;


public
{ Public declarations }
function SameNameFunction(): Integer; overload;
function SameNameFunction(param: Integer): Integer; overload;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: