【发布时间】:2012-03-05 16:42:20
【问题描述】:
最近我被要求自动化一个小子程序,该程序显示一系列数据记录和四个潜在按钮中的任意两个,供用户在查看记录分析后选择。老板说让用户看到分析是在浪费时间,因为用户总是选择按钮列表中的第一选择,他准备接受我对除了最好的用户之外的所有用户的猜测。因此,他希望添加一系列新按钮,以提供自动处理、手动处理和逐个处理。最后一个按钮只会运行已经存在的代码。第二个按钮基本上什么都不做,只是退出。第一个按钮?嗯,这就是问题所在。
我决定做的是使用几个标志,然后根据分析让自动路径只模拟最佳子按钮的点击。问题是调用 Button1Click(Sender) 是不可能的,因为运行分析的过程称为 RunAnalysis 并且没有附加到特定对象以传递 TObject。我最终将 Button1Click 方法的内容重构为 Button1Pressed,然后从 Button1Click 调用 THAT。因此,我能够从 RunAnalysis 中调用 Button1Pressed。
避免的路径是调用 Button1Click(Nil)。我没有尝试过,因为我有一个简单的解决方案(顺便感谢 Modelmaker)。但我的问题是,零参考会起作用还是会造成灾难。我可以调用一个更高的函数(随机?),它确实有一个发送者,只是为了在过程调用中有一个发送者对象?如果我不使用任何实际引用发件人的东西,发件人对象到底有多重要?
系统详情:Delphi 7 在 Win 7 编程环境中用于 Windows XP。
提前感谢您的智慧,GM
【问题讨论】:
-
您可以使用
nil的Sender参数调用事件处理程序,前提是事件处理程序确实尝试访问Sender对象。但是,您应该知道,无论如何最好不要直接调用事件处理程序。如果你想假装按下按钮,你只需调用按钮的Click方法。 -
大卫,我无法调用 click 方法,因为没有 Sender 可以通过。即 Button1Click(sender);出错了。我曾想过在 RunAnalysis 过程中执行 Button1Click(nil),但担心会发生灾难,最后将原始 Button1Click 更改为在没有任何参数的情况下调用 Button1Pressed。然后,我可以将 RunAnalysis 中的调用更改为 Button1Pressed。在任何一个 Button1 活动处理程序中,我都没有引用 Sender。因此我的问题。感谢您的评论和肯定 Nil 在这种情况下是一个合法的参考。
-
不,我的意思是你有
Button: TButton,然后写Button.Click。您应该始终更喜欢直接调用事件处理程序。它们真的应该只被框架调用。 -
每当我不需要给发件人的时候,我都会通过
nil。在你的情况下,它应该是安全的,只要你不假设它会被分配到另一端的某个地方。不过,在某些情况下,您确实需要小心传递nil。