利用程序中止例程可以使得一个正常的运行的程序强行中止。程序中止的结果有两 种,一是仅仅只退出当前正在运行的语句,但不一定会退出整个程序;二是直接退出整个
- 69 -
程序。
Delphi 常用的程序中止方法有三种:使用 Exit 例程、使用 Halt 例程、调用全局程序 对象的 Terminate 方法。
Exit 声明于 Delphi 的标准 System 单元,其声明原型为:
procedure Exit; Exit 用于退出当前正在执行的程序块,当不会退出整个程序,除非将 Exit 用在了程序的 主程序块(即.dpr 文件中的程序块)中。下面的程序演示了 Exit 例程的用法:
procedure M1; begin
exit; writeln('M1');
end;
begin
writeln('Start Program'); M1;
writeln('Ending Program');
//Exit; readln;
end. 运行后的结果为:
Start Program Ending Program
若读者将例中的注释语句去掉注释符号后再运行程序时就会发现,程序执行后的窗口一闪
而过,根本不会停留在屏幕上。
在使用 try...finally...类型的异常处理语句时,在 try...finally 部分中执行的 exit 会被当成一个异常来处理。详见”异常处理“部分。
自 Delphi2009 开始,Exit 后可接一个参数以传递函数退出时所返回的结果。这种应 用必须满足两个条件:
1. 后接参数的 Exit 只能用于函数中
2. 参数的类型必须与函数的返回值的类型相同或兼容 下面的程序说明了这种用法:
function DoSomething(aInteger: integer): string; begin
if aInteger < 0 then Exit('Negative');
else
Result := 'Positive'; end;
- 70 -
var
i: integer; begin
writeln(DoSomething(-1)); readln;
end.
例中定义了函数 DoSomething,它接受一个 Integer 类型的参数。当传给 DoSomething 的 参数的值小于 0 时,函数会返回一个字符串'Negative'并退出。
通过上面的例子我们可以发现,接参数的 Exit 事实相当于将两条语句简化成了一条。 如上例中的 Exit('Negative')相当于以下的复合语句:
begin
Result := 'Negative'; Exit;
end;
与 Exit 不同,Halt 会引发一个异常中断并通过这个中断直接退出整个的程序。 System 单元中 Halt 的声明原型为:
procedure Halt([ExitCode:Integer]); Halt 后可接一个 Integer 类型的标识码用于标识程序退出的相关信息。这个标识可以省 略,省略时编译默认其值为 0。
Halt 会直接退出整个程序。这句话的意思是:不管在何种地方,以何种形式,只要调 用了 Halt 就会退出整个的程序。请看下面的示例:
uses
SysUtils, Dialogs; procedure M1;
begin
Halt; end;
procedure M2; begin
Writeln('M2'); M1;
end;
begin
ShowMessage('Starting Program'); M2;
ShowMessage('Ending Program'); end.
程序中调用了 M2,这会导致程序的中断。
- 71 -
Delphi 中的窗体程序中含有一个全局程序对象(一般是 Application),其中的 Terminate 方法可在窗体程序的任何地方使程序正常中断并退出:
procedure TForm1.Button1Click(Sender: TObject); begin
Application.Terminate; showmessage('');
end;