如何在没有用户干预的情况下调用delphi中的事件?

如何在没有用户干预的情况下调用delphi中的事件?,delphi,delphi-xe2,Delphi,Delphi Xe2,我的表格上有一个按钮。下面是该按钮的单击事件 procedure Form1.btnOKClick(Sender: TObject); begin //Do something end; 仅当我单击按钮时才会调用此事件,对吗 如何在没有任何用户干预的情况下自动调用此事件?您可以像其他方法一样在代码中调用此事件 ... btnOkClick(Self.btnOk); // Sender in this case is the btnOk ... 发送方可以是您喜欢的任何对象,也可以是零。不要将

我的表格上有一个按钮。下面是该按钮的单击事件

procedure Form1.btnOKClick(Sender: TObject);
begin
//Do something
end;
仅当我单击按钮时才会调用此事件,对吗


如何在没有任何用户干预的情况下自动调用此事件?

您可以像其他方法一样在代码中调用此事件

...
btnOkClick(Self.btnOk); // Sender in this case is the btnOk
...

发送方可以是您喜欢的任何对象,也可以是零。

不要将业务逻辑放入事件处理程序中。当应用程序变大时,这将使代码无法读取

通常您会这样做:

procedure TForm1.DoSomething;
begin
 // do something
end;

procedure TForm1.btnOKClick(Sender: TObject);
begin
 DoSomething;
end;

然后,您只需从代码中的其他部分调用
DoSomething
调用附加到控件的
OnClick
事件处理程序的最佳方法是调用控件上的
Click
方法。像这样:

btnOK.Click;
直接调用事件处理程序会强制您提供
Sender
参数。调用
Click
方法可以让控件完成所有工作。按钮单击的windows消息处理程序的实现调用
click
方法


但我支持在whosrdaddy的回答中表达的观点。您应该将按钮后面的逻辑拉到一个单独的方法中。

与@LURDs answer的效果相同,只是代码更干净。如果您这样做,您以后会感谢您自己,尤其是当
//do something
被移动到一个单独的单元、数据模块和业务对象时。@whosrdaddy-您是对的。我打算这样做。我问这个问题只是因为我想知道第二种方法。@GolezTrol:我正在重新分解一个以这种方式编写的10万LOC庞然大物,我前面的人需要受到惩罚:)或者将所有业务逻辑包装在它自己的对象结构中,与任何GUI无关。@Jerrydoge:是的,这是人们通常会做的:)看,其中包括对手动触发事件处理程序的三种方式的描述。+1这是唯一适合这个问题的答案。OP问题是关于事件而不是方法的。也许OP不知道有什么不同,但他就是这样问的:o)它适用于点击按钮,但在面板上没有这样的方法。还有调整事件大小的问题吗?如何以编程方式调用Resize事件?@Delmo要么直接调用事件处理程序,要么将其提取到另一个可以直接调用的方法中,该方法由事件处理程序调用。谢谢@DavidHeffernan,我认为这是一种解决方案,但我要求使用某种方法来“模拟”事件发生。正如@SirRufo所说,问题是关于事件,而不是方法。你没有调用事件,你只是调用了一个方法。不能调用事件,只能调用与事件相关的方法。