【问题标题】:prevent running main form OnActivate event防止运行主窗体 OnActivate 事件
【发布时间】:2011-01-09 09:09:05
【问题描述】:

我有一个简单的程序(在delphi 7中),它的主要形式是一个按钮。 当我单击主窗体上的按钮时,我将打开第二个窗体。 当我关闭第二个表单时,如何防止运行主表单 OnActivate 事件? (除了这段代码:MainForm.OnActivate = nil)

谢谢

【问题讨论】:

  • OnActivate 事件处理程序中有什么,为什么它不应该在 Form2 关闭时运行,以及它是否应该在其他情况下运行(例如,当用户离开您的应用程序并返回它时)。这些问题的答案很大程度上决定了您需要的解决方案。
  • 我怀疑 OnActivate 使用错误,修复它,问题就会消失。
  • 确实,这听起来有点像 MainForm 中发生的事情。OnActivate 不合适,实际上是真正的问题。
  • 该代码可能位于 Application.OnActivate 中更好?

标签: delphi events forms


【解决方案1】:

使用GpStuff (BSD License) 暂时禁用事件的好方法:

uses
  GpStuff;

with DisableHandler(@@MainForm.OnActivate) do
  Form2.ShowModal;

【讨论】:

  • 尽管双指针引用看起来有点难看,但我觉得这是一个非常酷的解决方案。 +1
  • 我认为这仅在事件属性实际上直接存储在字段中时才有效。大多数 VCL 事件都是如此,但一般事件不一定如此。顺便说一句:+1;我喜欢返回自动清理界面的函数,我自己也经常使用它,但很少有人这样做。
  • 三元运算符,ORLY?无论如何,矫枉过正。
  • @Uwe:我找不到更好看的解决方案 :(
  • @gabr 难道不能用 RTTI 来完成,因为这些总是发布的属性?
【解决方案2】:

最简单的方法

MainForm.OnActivate := NIL;
Form2.ShowModal;
MainForm.OnActivate := MainFormOnActivate;

使用其他东西可能会破坏 Delphi 未来的兼容性...

【讨论】:

  • 如果使用了Form2.Show那么这没有任何效果。
  • @David Heffernan 我不确定我是否理解你的意思,你能说得更具体一点吗?这几天我有点慢:-P
  • Re[David的评论]:OnActivate改成'nil',显示form2,OnActivate改回来(而form2仍然显示);一段时间后,用户关闭 form2 并触发 form1 的 OnActivate。
  • aha,这是我的逻辑缺陷......我一定是疯了:-P anyhu OnActive 不应该被触发,除非表单获得焦点,但该事件仍然有很大的可能性发生,最好使用 ShowModal 以确保安全或 gabr 的“DisableHandler”
  • 我的 DisableHandler 方法也只适用于 ShowModal。
猜你喜欢
  • 1970-01-01
  • 2015-10-13
  • 2011-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多