myamanda

博客园 首页 新随笔 联系 订阅 管理

    调用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事件,或者是线程。

posted on 2009-11-25 13:56  myamanda  阅读(255)  评论(0)    收藏  举报