Delhpi中的函数与过程

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;



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值