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