gpt4 book ai didi

delphi - 动态 Delphi 表单创建 - 确保正确的鼠标消息处理

转载 作者:行者123 更新时间:2023-12-03 18:05:10 31 4
gpt4 key购买 nike

我有一个基于左侧 treeView 和右侧面板的应用程序布局。该面板根据所选的树节点(一种“表单浏览器”)托管不同的 TForm 类。一次只显示一个表单,它公开存储在其他地方的基础数据,并且在每个新的树节点单击时创建和销毁表单实例。

除以下情况外,一切正常。单击表单上的一个按钮,该按钮将启动一个需要一秒钟左右的操作。在此操作期间,可能会调用 Application.ProcessMessages。现在就在这个 Action 实际完成之前,用户点击了一个新的树节点。处理此 wmMousedown 消息会导致立即释放表单。然后action代码返回到form代码发现self变了导致AV。

我的问题是,在允许释放表单之前,有没有办法知道表单的消息已全部处理和完成?单击关闭按钮时,模态表单似乎会执行此操作,因为如果忙碌,它们会在关闭之前暂停...

谢谢布莱恩

最佳答案

不惜一切代价避免使用 Application.ProcessMessages!

我看到的最常见的不当用法是允许重新绘制 GUI,例如更新标签标题后。确保 GUI 更新的最安全方法是使用 Update 方法(绕过绘制消息并导致控件直接重新绘制)显式重新绘制任何受影响的控件。或者它可能是 Refresh 方法 - 或者它可能是其中之一或两者!遗憾的是,我永远记不起来了!

Application.ProcessMessages 会导致您发现的“重入”问题,有效地在您的代码中创建潜在的新的、短暂的“主消息循环”,从而导致难以诊断和难以重现问题。

在这种情况下,我会检查 Application.ProcessMessages 的使用,看看是否可以设计出一种替代方法来消除它在您的代码中的使用,而不是尝试修补大量的 >其他 代码只是为了让它处理 Application.ProcessMessages 引起的问题。

注意:该规则的一个异常(exception)是使用 Application.ProcessMessages 来保持“进度”消息/对话框上“取消”按钮的响应性,只要该进度消息是相对安全的/dialog 框是模态的,当显示该对话框时,您的应用程序的其余部分被有效地禁用,因此只有“取消”按钮可以可能 回复任何消息

关于delphi - 动态 Delphi 表单创建 - 确保正确的鼠标消息处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1399105/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com