TApplication.ProcessMessages用于程序执行一个长的过程又不中断其他代码的执行(例如安装程序时响应放弃按钮),
与HandleMessages的区别是如果没有发现消息,ProcessMessages方法不会把应用程序置于空闲状态.
问:Delphi中 如 何 在 第 一 个 按 扭 事 件 尚 未 结 束 时 按 第 二 个 按 扭 结 束 第 一 个 按 扭 事 件?

----答: 使 用TApplication.ProcessMessages 方 法。调 用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 事 件, 或 者 是 线 程。