【问题标题】:how to determine which event calls procedure in delphidelphi如何判断哪个事件调用过程
【发布时间】:2012-02-05 20:32:01
【问题描述】:

我在 delphi 中有一个名为 XYZ(sender:TObject) 的过程。我的表格上有一个按钮。

Button.onclick:= xyz;
Button.OnExit:= xyz;

两个事件调用相同的过程。我想在程序 XYZ 中确定哪个事件调用它(onclick 或 onexit),并根据它进行编码。 如何确定哪个事件被触发?谢谢

【问题讨论】:

  • 如果你有这样的需求,可能是你xyz的代码太多了。您应该将它拆分为 x, y e z。可能 OnClick 会调用 x,OnExit 会调用 y,两者都会调用 z。
  • 更普遍的问题是:如何在 Delphi 中获得“调用堆栈”? - 看到这个问题Need a way to periodically log the call stack/stack trace for EVERY method/procedure/function called
  • @mjn 这在这里没有什么帮助。您肯定不会将 VCL 私有实现细节编码到 VCL 客户端代码中吗?
  • @David 当然你的答案是要走的路 - 调用堆栈解析将是最不可接受的解决方案,我不敢将它作为答案发布;)
  • 这听起来像是代码重用的破坏逻辑。调用堆栈更多的是调试工具而不是设计工具。

标签: delphi


【解决方案1】:

您无法通过公平的方式获取这些信息。解决方案是使用两个单独的顶级事件处理程序,它们反过来可以调用另一个方法,传递一个参数来标识正在处理的事件。

type
  TButtonEventType = (beOnClick, beOnExit);

procedure TMyForm.ButtonClick(Sender: TObject);
begin
  HandleButtenEvent(beOnClick);
end;

procedure TMyForm.ButtonExit(Sender: TObject);
begin
  HandleButtenEvent(beOnExit);
end;

procedure TMyForm.HandleButtonEvent(EventType: TButtonEventType);
begin
  //use EventType to decide how to handle this
end;

【讨论】:

  • 是否可以在不使用其他参数的情况下在同一过程中获取该信息?
  • 对不起,我不太明白这个问题。
  • 我们能得到事件信息,比如触发了哪个事件吗?只是想知道。
  • 不,你不能。答案的第一句话就涵盖了这一点。
  • +1。值得指出的是,您也可以将 Sender 作为参数传递,然后您就可以在多个按钮上使用此技巧。假设您有 10 个按钮,并且您希望能够在 HandleButtonEvent 中单独处理它们(例如修改标题/图标/等)。您可以将它们的所有单击和退出分配给上面的两个 ButtonClick 和 ButtonExit 例程,而无需复制所有这些例程。显然,这仅在需要处理多个按钮时才有用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多