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