Delphi 系统[15]关键字和保留字 procedure、function、forward、out - 函数、过程相关

Delphi 系统[15]关键字和保留字  procedure、function、forward、out -函数、过程相关

1、定义:

  • procedure :定义过程,过程无返回值。主要用来执行一系列动作。还可以用来声明自定义函数类型。  
  • function :定义函数,函数有返回值。主要用来计算某一结果。还可以用来声明自定义函数类型。
  • forward :用于函数(或过程)的前置声明,这样可以使代码中“较先实现的函数”可 以调用“较后实现的函数”,如果“较后实现的函数”不做前置声明,则它不能被前面的函数调用。  
  • out :定义函数(或过程)的参数为传出类型,out 类型的参数用来将函数的执行结果通过此参数返回给调用者(传地参数)。 
    • 调用者在调用函数时,不需要给 out 类型的参数赋值,赋了也没用。 
    • 与关键字 var 比较,var:定义函数(或过程)的参数为传址类型,var类型的参数在函数内的一切改变都会返回给调用者,调用者也可以在调用函数前,给 var 参数赋值,然后传递到函数里面使用。   

2、示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
{函数前置声明 forward; }
function CalcP(R: Double): Double; forward;
function CalcA(R: Double): Double; forward;
  
{ 过程:执行一系列动作,显示圆的半径、周长、面积信息 }
procedure ShowInfo(Radius: Double);
var
  sRadius: string;
  sPerimeter: string;
  sArea: string;
begin
  sRadius := FloatToStr(Radius);
  
 { 如果不做前置声明,则这里无法调用CalcP函数,因为函数在ShowInfo之后 }
  sPerimeter :=FloatToStr(CalcP(Radius));
  
  { 如果不做前置声明,则这里无法调用CalcA函数,因为函数在ShowInfo之后 }
  sArea := FloatToStr(CalcArea(Radius));
  
  ShowMessage('半径:' + sRadius + #13#10 + '周长:' +  sPerimeter + #13#10 + '面积:' + sArea);
end;
  
{ 函数:计算圆的周长 }
function CalcPerimeter(R: Double): Double;
begin
  { 2 乘以 派 乘以 半径,Pi 是系统函数,计算圆周率 }
  Result := 2 * Pi *R;
end;
  
{ 函数:计算圆的面积 }
function CalcArea(R: Double): Double;
begin
  { 派 乘以 半径的平方,Pi 是系统函数,计算圆周率 }
  Result := Pi * R * R;
end;
  
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowInfo(10.5);
  ShowInfo(30.25);
end;
  
 
 
{ 声明自定义函数类型 TMyFunc }
type
  TMyFunc = function(I:Integer): Integer;
 
{ 某个函数 }
function GetCountNum(Num: Integer): Integer;
var
  I: Integer;
begin
  Result := 0;
  for I := 0 to Num do
  begin
    Result := Result + I;
  end;
end;
  
{ 自定义函数类型一般用作函数或过程的参数 }
procedure TForm1.Button1Click(Sender: TObject);
var
  MyFunc: TMyFunc;
  iCountNum: Integer;
begin
  { 将某个同类型的函数赋值给MyFunc,要保证函数一致 }
  MyFunc := GetCountNum;
  { 然后 MyFunc 就可以像普通函数一样使用 }
  iCountNum := MyFunc(100);
  Caption := IntToStr(iCountNum);  { 结果:5050 }
end;
  
 
{ var 和 out 的使用}
{ 过程是没有返回值的,但是我们可以通过 var 或 out 参数来返回数据 }
procedure Test(var I: Integer; out S: String);
begin
  { 查看传进来值 }
  ShowMessage('参数I:' +IntToStr(I) + #13#10 + '参数S:' +S);  { S 将为空 }
  { 修改参数的值,看能否传递到过程外面去 }
  I := I + 100;
  S := S + 'TaoRoy'{ 如果我们将这一行代码注释掉,则 S 将返回空字符串 }
end;
  
procedure TForm1.Button1Click(Sender: TObject);
var
  A: Integer;
  B: String;
begin
  A := 1;
  B := 'ABC';
  Test(A, B);  { 'ABC' 无法传入到函数中 }
  Caption := IntToStr(A ) + ' ' +B;    { 结果 101 TaoRoy }
end;

  

 

 

 

创建时间:2021.08.11  更新时间:

posted on   滔Roy  阅读(544)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
阅读排行:
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报

导航

点击右上角即可分享
微信分享提示