调用ProcessMessages方法可以中断应用程序的执行,将控制权交给系统,使之可以响应其他事件。这样,调用ProcessMessages方法时若发生了其他事件,Windows可以有时间来处理这些事件。调用该方法可以轮转Windows的消息环,当消息环为空时,应用程序将控制权交还给应用程序。系统忽略正在处理的消息,但是,它只影响调用了ProcessMessages方法的应用程序,而不影响其他应用程序。
通常在冗长的操作过程中,如一个很大的计算循环或进行一些绘图操作,您应该周期性地调用ProcessMessages方法,这样才可以让应用程序响应其他如重画窗口等消息。需要注意的是,ProcessMessages方法不允许应用程序进入空闲期消息处理(OnIdle),而HandleMessages方法可以。在程序输入"ProcessMessages"和"HandleMessages",然后按F1可以获得更多的帮助,也可以参考Windows编程书籍的消息处理部分。
下面是一个简单的例子。窗口只有两个按扭,按扭1"作循环"用于启动循环计数过程,按扭2用于控制动作。程序开始时,按扭1是禁用的,单击"开始"按扭2,则按扭2变为"停止",并且启用按扭1"作循环"。循环启动后,就可以启用"停止"按扭2来停止循环了。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
//设置循环停止标志和按扭状态标志
StopFlag:Boolean;
StatusFlag:Boolean;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
var
i,j:integer;
begin
Button1.Enabled:=Not(Button1.Enabled);
Button2.Enabled:=Not(Button2.Enabled);
for I:=0 to 100000 do
for j:=0 to 100 do
begin
//如果停止标志为真值,则退出循环。
if StopFlag then Exit;
//在窗口标题栏上显示循环进度。
Caption:=IntToStr(i)+‘:’+IntToStr(j);
//将控制权交给Windows。
Application.ProcessMessages;
end;
//可以在上面几行代码多作些试验(禁止或注释掉某个语句),看看具体的效果如何。
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Font.Size:=12;
Button1.Caption:=‘作循环’;
Button1.Enabled:=False;
Button2.Caption:=‘开始’;
StatusFlag:=False;
StopFlag:=not(StatusFlag);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
StatusFlag:=not(StatusFlag);
StopFlag:=not(StatusFlag);
if StatusFlag then
begin
Button2.Caption:=‘停止’;
end
else
Button2.Caption:=‘开始’;
Button2.Enabled:=not(StatusFlag);
Button1.Enabled:=StatusFlag;
end;
end.
如果在图形操作时使用Tapplication.Process Messages方法,可以获得非常平滑的效果。另外,处理类似的问题,可以考虑使用应用程序的空闲周期即Tapplication.OnIdle事件,或者是线程。
浙公网安备 33010602011771号