控制光标

来源:互联网 发布:mac 还原出厂设置 编辑:程序博客网 时间:2024/05/04 01:47

(以下演示代码用C++Builder/Delphi实现)

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

如:

  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;


看明白了么?

想知道为什么吗?请听下回分解

原创粉丝点击