NIL可以用于Sender对象吗?

时间:2012-02-14 09:49:20

标签: delphi delphi-7

最近我被要求自动化一个小例程,该例程提供了一系列数据记录和四个潜在按钮中的任意两个,供用户在看到记录分析后选择。老板说,让用户看到分析是在浪费时间,因为用户总是选择按钮列表中的头号选项,他准备住我的猜测,除了最好的用户。因此,他希望添加一系列新按钮,以自动处理,手动处理和处理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

4 个答案:

答案 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)

简答 - 是的。

我用它来区分(例如)菜单事件是由用户点击还是直接通过代码调用。