NIL可以用于Sender对象吗?

GM *_*ord 4 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,任何智慧

kob*_*bik 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;
Run Code Online (Sandbox Code Playgroud)

因此,当我需要调用CheckBox1Click(nil)它时,我可以将事件处理程序中的代码转换为单独的方法.


War*_* P 6

回调或"事件"与任何其他功能没有什么不同.您可以在任何地方传递NIL引用,只要您(a)编写该代码并知道它是安全的,或者(b)您已经读取了该代码及其调用的所有内容而不检查nil,并且知道它是零安全的.

有些程序员自由使用NIL,有些人认为使用NIL参数值是不好的样式.我的风格倾向于"不要假设发件人被分配,并且不要假设它是特定类型的",这导致我的事件处理程序中有很多检查代码,但是除了我的其他代码,它的变化很大,所以第一条编码规则就出现了; "不要做出假设.阅读代码."


Ken*_*ite 5

只要代码不引用,您就可以将其nil用作TNotify事件(或任何其他期望的事件)的参数:SenderSender

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;
Run Code Online (Sandbox Code Playgroud)