-2

如果我有一个设置 Cursor := crHourglass, Application.ProcessMessages 的 ButtonClick 事件,然后使用 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;
4

1 回答 1

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

于 2013-05-14T18:52:58.157 回答