【问题标题】:How Do I Interrupt a Find Dialog in Delphi?如何中断 Delphi 中的查找对话框?
【发布时间】:2012-01-09 06:04:59
【问题描述】:

我有一个标准的查找对话框:

我的程序可以处理一些非常大的文件,在这些文件中查找文本可能需要 10 或 20 秒或更长时间。因此,按下“查找下一个”按钮后,我将光标更改为沙漏。在找到或未找到文本后,我将其改回标准指针。

我的问题是用户可能决定取消搜索并通过按下取消按钮来决定这样做。然后取消按钮关闭对话框,但在我的 FindDialogFind 例程中继续搜索,直到找到或未找到文本。

我在 FindDialog.exe 退出时设置了一个断点,但直到 FindDialogFind 完成后才到达。

有什么方法可以捕获已按下取消按钮的事实,这将允许我打破 FindDialogFind 循环,或者是否有更好的方法可以在按下取消按钮时停止搜索?

【问题讨论】:

  • FindDialogOnClose事件中,设置一个布尔变量FStopSearch。在您的搜索例程中经常检查此 var,如果设置则中止搜索。
  • @LURD - 这正是我想做的。如何为 Windows 公共对话框设置 OnClose 事件处理程序?它不是德尔福形式。你为什么不把这个作为答案而不是评论给我呢?
  • 哎呀。放置的 FindDialog 确实具有三个事件。 FindDialogClose 应该可以正常工作。谢谢。我们都有那些没有任何记录的日子。对不起。
  • 好的,我做了一个回答,并添加了关于 TFindDialog 组件的评论。

标签: delphi interruption finddialog


【解决方案1】:

TFindDialog 组件的OnCloseevent 中,设置一个布尔变量FAbortSearch。 在您的搜索例程中经常检查此 var,如果设置则中止。

【讨论】:

  • 当然,这只有在搜索例程定期调用Application.ProcessMessages() 时才会起作用,因此“取消”按钮将完全起作用。
【解决方案2】:

将搜索逻辑移动到一个工作线程中,只要按下Next 按钮就会启动该工作线程。当对话框关闭时,如果线程仍在运行,您可以终止它。

【讨论】:

  • 我可以,但没有必要这样做,因为这是用户等待的主要任务。
  • 也许,但它确实允许您通过在搜索期间调用Application.ProcessMessages() 来干净地取消搜索操作,而不会减慢搜索本身或引入副作用,因此对话框仍然响应用户输入.任何时候您必须在任何明显的时间内阻塞主线程,您都应该考虑使用工作线程。主线程需要及时响应消息队列。
  • ... 如果只有 Delphi 使线程更容易。请把它传给雷米。
  • 确实如此。从TThread 派生一个类。向其构造函数添加参数以传入您的搜索条件,并覆盖其Execute() 方法以根据需要搜索文件。确保让搜索代码定期检查 TThread.Terminated 属性,并在设置为 True 时退出 Execute()
猜你喜欢
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 2011-11-08
  • 2021-09-14
  • 1970-01-01
  • 2010-10-01
  • 2012-09-03
  • 1970-01-01
相关资源
最近更新 更多