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