• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
alina.yan
博客园    首页    新随笔    联系   管理    订阅  订阅
ProcessMessages与HandleMessages
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 事 件, 或 者 是 线 程。

posted on 2009-07-29 11:50  alina.yan  阅读(1367)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3