zoukankan      html  css  js  c++  java
  • [导入]控制光标

    按照习惯,我们的程序在执行时间比较长的时候一般需要把光标设置成漏斗的样子,执行完操作再换回来。

    如:

      Screen.Cursor := crHourGlass;
      // Do somthing
      Screen.Cursor := crDefault;

    但是中间我们要考虑到,万一执行中出现错误,那么最后一句的 Screen.Cursor := crDefault 也就执行不到了,光标不会变回原来的样子,这是无法忍受的 :)

    于是代码修改后变成以下的样子:

      Screen.Cursor := crHourGlass;
      try
        // Do somthing
      finally
        Screen.Cursor := crDefault;
      end;

    这样即使中途出现错误光标都变回原来的样子了

    可是频繁的写 try / finally 也让我有点受不了 -_-!

    在C++里好办,只要写个类即可简化这些工作

    class TAutoCursor
    {
        __fastcall TAutoCursor()
        {
            Screen->Cursor = crHourGlass;
        }

        __fastcall ~TAutoCursor()
        {
            Screen->Cursor = crDefault;
        }
    }

    使用:

    void __fastcall foo()
    {
        TAutoCursor cur;
        // Do something
    }

    代码简洁了不少 :)

    这样当foo执行完时,不管有没有出现错误,cur都会被析构,鼠标也就变回来了

    这是因为C++中的类是分配在栈里的,函数结束时系统会把栈里的临时变量等自动清除掉

    可是Delphi与C++不同,Delphi的类都是建在堆里的,是需要手工释放的。

    难道就没有办法实现么?答案是否定的,否则我也就不用写这篇东东了,呵呵

    实现代码如下

    unit AutoCursor;

    interface

    uses
      Controls, Forms;

    type
      IAutoCursor = interface
      end;

      TAutoCursor = class(TInterfacedObject, IAutoCursor)
      private
        FOldCursor: TCursor;
      public
        constructor Create(ACursor: TCursor = crHourGlass);
        destructor Destroy; override;
      end;

    implementation

    { TAutoCursor }

    constructor TAutoCursor.Create(ACursor: TCursor);
    begin
      inherited Create;
      FOldCursor := Screen.Cursor;
      Screen.Cursor := ACursor;
    end;

    destructor TAutoCursor.Destroy;
    begin
      Screen.Cursor := FOldCursor;
      inherited;
    end;

    end.

    只要象下面这样用就可以了

    var
      Cur: IAutoCursor;
    begin
      Cur := TAutoCursor.Create;
      // Do something
    end;

    文章来源:http://blog.csdn.net/sephil/archive/2005/09/07/473862.aspx

  • 相关阅读:
    Zookeeper环境搭建
    Zookeeper介绍
    相关错题
    数据库前三章测试题
    数据库相关练习题
    SQL语句操作数据
    用表组织数据
    创建和管理SQL Server数据库
    登陆数据库
    C#部分试题实例
  • 原文地址:https://www.cnblogs.com/sephil/p/auto_cursor.html
Copyright © 2011-2022 走看看