控制光标
来源:互联网 发布: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;
看明白了么?
想知道为什么吗?请听下回分解
- 控制光标
- 光标控制
- js 光标位置控制
- js控制光标位置
- 光标位置控制
- Windows控制台光标控制
- c#textbox光标控制
- combobox光标控制
- jquery光标控制
- javascript控制光标移动
- windows控制台光标控制
- 控制文本光标
- Emacs 光标控制
- js 控制光标位置
- 控制台控制光标位置
- C++之光标控制
- 用javascript控制光标位置
- vi中光标的控制
- UTF-8转换成GB2312的全处理
- 最近在研究AOP
- spring对commons_fileupload和cos_fileuplaod的封装
- Baby Cow File System - Spec 1
- 静态发布的文章页中动态显示相关链接的方法
- 控制光标
- Mirror
- Chapter 5. Introduction to Internet Programming
- 解析java的*.class文件
- 日本語を勉強の手帳(栢さん指導)
- 第一研究—注册表与ini
- 正则表达式
- 权限管理
- 求助 虚拟服务器而需要应用程序的问题