如果我有一个ButtonClick事件设置Cursor:= crHourglass,Application.ProcessMessages,然后使用TOpenDialog选择一个文件,然后执行一些CPU密集型操作,光标的行为会有所不同,具体取决于它是否超过现有控件当打开对话框关闭时。如果光标在控件上方,则光标保持为沙漏;如果它完全在应用程序之外,然后在密集过程仍在进行时移动到该区域,则光标保持为箭头。一个人不能点击或做任何事情,所以它让用户感到困惑,不能用箭头做任何事情。
单步执行调试器会显示Cursor在任何位置都应为-11。使用Screen.Cursor而不是Cursor具有相同的效果。
有解决方案吗?
procedure TMyForm.LoadButtonClick(Sender: TObject);
begin
Cursor := crHourglass;
Application.ProcessMessages;
if OpenDialog.Execute then begin
// Do something intensive
// Cursor = crHourglass here but what is displayed is different
end;
Cursor := crDefault;
end;
答案 0 :(得分:8)
首先,确保仅在CPU密集型操作处于活动状态时设置光标。选择文件时不要更改光标 - 毕竟你从未看到任何其他程序这样做。
其次,当您在代码中说Cursor
时,您指的是表单的属性。您可能希望使用Screen.Cursor
,以便整个程序显示相同的光标。
第三,没有必要致电Application.ProcessMessages
。一旦显示对话框,就会立即处理消息,此外,没有特定的消息需要处理。
最后,考虑使用try-finally块保护游标更改,以便处理中的问题不会将游标置于错误的状态:
if OpenDialog.Execute then begin
Screen.Cursor := crHourglass;
try
// TODO: something intensive
finally
Screen.Cursor := crDefault;
end;
end;
如果操作确实占用了大量时间,请考虑将其移至另一个线程。然后您不必担心GUI没有响应,因此您不必首先更改光标。