例程
(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;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?