【发布时间】:2013-05-14 18:42:59
【问题描述】:
如果我有一个设置 Cursor := crHourglass, Application.ProcessMessages 的 ButtonClick 事件,然后使用 TOpenDialog 选择一个文件,然后执行一些 CPU 密集型操作,则光标的行为会有所不同,具体取决于它是否位于现有控件之上当打开对话框关闭时。如果光标在控件上方,则光标保持为沙漏;如果它完全在应用程序之外,然后在密集过程仍在进行时移入该区域,则光标将保持为箭头。一个人不能点击或做任何事情,所以让用户感到困惑的是得到一个箭头但不能用它做任何事情。
单步调试调试器显示光标在它应该在的任何地方都是-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;
【问题讨论】:
-
看在上帝的份上,当你的代码不能完全按照你的意愿运行时,你们什么时候停止调用 ProcessMessages!!!
-
如果我遗漏了什么,请见谅,但是设置光标而不调用 ProcessMessages 会导致光标直到 密集工作之后才真正改变已经结束了。
-
您似乎只是解决了一个问题。但是现在你遇到了另一个问题。如果在第一个事件处理程序运行之前单击按钮两次会发生什么?无论如何,你说的不是真的。在事件处理程序中,分配给
Cursor并调用Sleep,看看会发生什么。 -
只发布相关代码的危险!可以禁用所有控件,但仍然无法解决问题。我唯一的猜测是当鼠标移入窗口时会触发一些事件,但当然它没有被处理,因为它忙于做其他事情大约一秒钟。这表明 Rob 将其传递给单独线程的想法将是解决方案。
-
好吧,您似乎没有发布相关代码,因为我无法重现您所描述的内容。 Rob 在所有分数上都是正确的。不要打电话给
ProcessMessages。显示文件对话框时不要更改光标。并且不要在 UI 线程上运行长时间的任务。