最近我被要求自动化一个小例程,该例程提供了一系列数据记录和四个潜在按钮中的任意两个,供用户在看到记录分析后选择。老板说,让用户看到分析是在浪费时间,因为用户总是选择按钮列表中的头号选项,他准备住我的猜测,除了最好的用户。因此,他希望添加一系列新按钮,以自动处理,手动处理和处理Case by Case。最后一个按钮只运行已有的代码。第二个按钮基本上什么都不做,只是退出。第一个按钮?嗯,这就是问题。
我决定做的是使用几个标志,然后让自动路径根据分析模拟点击任何子按钮是最好的。问题是调用Button1Click(Sender)是不可能的,因为运行Analysis的过程称为RunAnalysis,并且没有附加到特定对象以传递TObject。我最终将Button1Click方法的内容重构为Button1Pressed,然后从Button1Click调用THAT。因此,我能够从RunAnalysis中调用Button1Pressed。
避免的路径是调用Button1Click(Nil)。我没有尝试过,因为我有一个简单的解决方案(顺便说一句,感谢Modelmaker)。但我的问题是,零参考是否有效或是否会造成灾难。我可以调用一个更高的函数(随机吗?)确实有一个发送者,JUST在过程调用中有一个发送者对象?如果我不使用任何实际参考发件人的东西,发件人对象有多重要?
系统详细信息:用于Windows XP的Win 7编程环境中的Delphi 7。
提前感谢任何智慧,GM
答案 0 :(得分:8)
我倾向于在可能的情况下将事件处理程序的代码放入另一个方法中:
procedure TForm1.DoSomething(const Test: Boolean);
begin
// Do Something based on Test
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DoSomething(False); // init here
end;
procedure TForm1.CheckBox1Click(Sender: TObject);
begin
DoSomething(TCheckBox(Sender).Checked);
end;
因此,当我需要调用CheckBox1Click(nil)
时,对我来说,将代码从事件处理程序转移到单独的方法中是一个好兆头。
答案 1 :(得分:6)
回调或“事件”与任何其他功能没有什么不同。您可以在任何地方传递NIL引用,只要您(a)编写该代码并知道它是安全的,或者(b)您已经读取了该代码及其调用的所有内容而不检查nil,并且知道它是零安全的
有些程序员可以自由使用NIL,有些人认为使用NIL参数值是不好的样式。我的风格倾向于“不要假设发件人被分配,并且不要假设它是特定类型的”,这导致我的事件处理程序中有很多检查代码,但是除了我的其他代码,它的变化很大,所以第一条编码规则就出现了; “不要做出假设。阅读代码。”。
答案 2 :(得分:5)
只要代码未引用nil
,您就可以使用TNotify
作为Sender
事件(或任何其他期望Sender
)的参数:
procedure TForm1.Button1Click(Sender: TObject);
begin
DoSomeStuff(nil);
end;
procedure TForm1.DoSomeStuff(Sender: TObject);
begin
// Safe
DoSomeOtherStuff;
// Safe
// Do stuff with Sender
if Sender is TButton then
TButton(Sender).Caption := 'In DoSomeStuff'
// NOT safe!
with TButton(Sender) do
begin
Caption := 'In DoSomeStuff';
end;
end;
答案 3 :(得分:2)
简答 - 是的。
我用它来区分(例如)菜单事件是由用户点击还是直接通过代码调用。