【问题标题】:How to call events in delphi without user intervention?如何在没有用户干预的情况下调用delphi中的事件?
【发布时间】:2012-12-17 19:26:04
【问题描述】:

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

procedure Form1.btnOKClick(Sender: TObject);
begin
//Do something
end;

只有当我点击按钮时才会调用这个事件,对吧?

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

【问题讨论】:

标签: delphi delphi-xe2


【解决方案1】:

调用附加到控件的OnClick 事件处理程序的最佳方法是调用控件上的Click 方法。像这样:

btnOK.Click;

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

但我赞同 whosrdaddy 的回答中表达的观点。您应该将按钮背后的逻辑提取到一个单独的方法中。

【讨论】:

  • +1 这是唯一适合完美问题的答案。 OP 问题是关于事件不是方法。也许 OP 不知道有什么区别,但他就是这样问的:o)
  • 它适用于单击按钮,但例如面板上没有这种方法。还有 Resize 事件呢?如何以编程方式调用 Resize 事件?
  • @Delmo 要么直接调用事件处理程序,要么将其提取到您可以直接调用且事件处理程序调用的另一个方法中。
  • 谢谢@DavidHeffernan,我想有这种解决方案,但我要求一些方法来“模拟”事件的发生。
  • 正如@SirRufo 所说,问题是关于事件,而不是方法。
【解决方案2】:

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

通常你会这样做:

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

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

那么您需要做的就是从代码中的其他部分调用DoSomething

【讨论】:

  • 与@LURDs 回答的效果相同,只是代码更简洁。如果您这样做,您稍后会感谢自己,特别是如果 // do something 被移动到单独的单元、数据模块、业务对象。
  • @whosrdaddy - 你是对的。我要那样做。我问这个问题只是因为我想知道第二种方式。
  • @GolezTrol:我正在重构这样写的 100k LOC 庞然大物,我面前的人需要受到惩罚:)
  • 或者将所有业务逻辑包装在自己的对象结构中,与任何GUI无关。
  • @JerryDodge:是的,通常情况下会这样做:)
【解决方案3】:

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

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

Sender 可以是你喜欢的任何对象,也可以是 nil。

【讨论】:

  • 你没有调用事件,你只是调用了一个方法。不能调用事件,只能调用与事件相关的方法。
猜你喜欢
  • 2012-04-16
  • 2011-11-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-10
  • 1970-01-01
  • 2017-10-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多