Delphi 6游标不变

时间:2013-05-14 18:43:00

标签: windows delphi delphi-6

如果我有一个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;

1 个答案:

答案 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没有响应,因此您不必首先更改光标。