例程

(1)过程和函数

两者突出的不同点在于:函数能返回计算结果,即有一个返回值,而过程没有,但是你可以调用函数完成一系列操作,跳过其返回值(用可选的出错代码或类似的东西代替返回值);也可以通过过程的参数传递计算结果

procedure Hello;
begin
  ShowMessage ('Hello world!');
end;

function Double1 (Value: Integer) : Integer;
begin
  Double1 := Value * 2;
end;

//流行的做法是用Result 给函数赋返回值,而不是用函数名,我认为这样的代码更易读
function Double2 (Value: Integer) : Integer;
begin
  Result := Value * 2;
end;

​ 一旦定义了这些例程,你就可以多次调用,其中调用过程可执行操作;调用函数能计算返回值。如下:

procedure TForm1.Button1Click (Sender: TObject);
begin
  Hello;
end;

procedure TForm1.Button2Click (Sender: TObject);
var
  X, Y: Integer;
begin
  X := Double1 (StrToInt (Edit1.Text));
  Y := Double1 (X);
  ShowMessage (IntToStr (Y));
end;

(2)传值、传址

procedure tform1.myproc1(chuanzhi: string); //传值
begin
  chuanzhi:= '学编程,到鱼c' ;
  showmessage(chuanzhi);
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  x: string;
begin
  x:= edit1.Text;                      //德琪
  myproc1(x);

  edit2.Text:= x+ '+你好!'            //德琪你好!(x还是x)
end;



procedure tform1.myproc2(var chuanzi: string); //传址
begin
  chuanzi:= '学编程,到鱼c' ;
  showmessage(chuanzi);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  x: string;
begin
  x:= edit1.Text;                      //德琪
  myproc2(x);

  edit3.Text:= x+ '+你好!'             //学编程,到鱼c 你好!(x地址更新了)
end;

​ 另外一个例子,下面是利用引用传递参数的例子,引用参数用var关键字标示:

procedure DoubleTheValue (var Value: Integer);
begin
  Value := Value * 2;
end;

​ 在这种情况下,参数既把一个值传递给过程,又把新值返回给调用过程的代码。当你执行完以下代码时:

var
  X: Integer;
begin
  X := 10;
  DoubleTheValue (X);

​ x变量的值变成了20,因为过程通过引用访问了X的原始存储单元,由此改变了X的初始值。

(3)常量参数

特点:不允许在例程中给常量参数赋新值

​ 例如:如果编译下面Delphi将出现错误:

function DoubleTheValue (const Value: Integer): Integer;
begin
  Value := Value * 2;      // compiler error
  Result := Value;
end;

(4)开放数组参数

​ 参数类型已定义,但是数组中的元素个数是未知数

function Sum(const A: array of Integer): Integer;
var
  I: Integer;
begin
  Result := 0;
  for I := Low(A) to High(A) do
    Result := Result + A[I];
end;

begin
  Writeln(Sum([1, 2]));
  Writeln(Sum([1, 2, 4]));
  Readln;
end.

​ 运行结果为:3;7

(5)Forward 声明(前置声明)

​ 欲声明一个过程或函数,而且只给出它的名字和参数,不列出其实现代码,需要在句尾加forward 关键字

procedure Hello; forward;

(6)函数重载

​ 重载的思想很简单:编译器允许你用同一名字定义多个函数或过程,只要它们所带的参数不同。实际上,编译器是通过检测参数来确定需要调用的例程。

​ 声明重载函数有两条原则:

  • 每个例程声明后面必须添加overload 关键字。
  • 例程间的参数个数或(和)参数类型必须不同,返回值不能用于区分各例程。
procedure ShowMsg (str: string); overload;
begin
  MessageDlg (str, mtInformation, [mbOK], 0);
end;

procedure ShowMsg (I: Integer; Str: string); overload;
begin
  ShowMssage (IntToStr (I) + ' ' + Str);
end;

procedure ShowMsg (FormatStr: string, Params: array of const); overload;
begin
  MessageDlg (Format (FormatStr, Params), mtInformation, [mbOK], 0);
end;

posted @ 2023-02-15 15:44  德琪  阅读(26)  评论(0编辑  收藏  举报