gpt4 book ai didi

delphi - 为什么从代码中调用事件处理程序是不好的做法?

转载 作者:行者123 更新时间:2023-12-03 14:32:27 26 4
gpt4 key购买 nike

假设您有一个菜单项和一个执行相同任务的按钮。为什么将任务代码放入一个控件的操作事件中然后从另一个控件调用该事件是一种不好的做法?Delphi 和 vb6 一样允许这样做,但 realbasic 不允许,并表示您应该将代码放入一个方法中,然后由菜单和按钮调用

最佳答案

这是你的程序如何组织的问题。在您描述的场景中,菜单项的行为将根据按钮来定义:

procedure TJbForm.MenuItem1Click(Sender: TObject);
begin
// Three different ways to write this, with subtly different
// ways to interpret it:

Button1Click(Sender);
// 1. "Call some other function. The name suggests it's the
// function that also handles button clicks."

Button1.OnClick(Sender);
// 2. "Call whatever method we call when the button gets clicked."
// (And hope the property isn't nil!)

Button1.Click;
// 3. "Pretend the button was clicked."
end;

这三种实现中的任何一种都可以工作,但是为什么菜单项如此依赖于按钮?按钮有什么特别之处以至于它应该定义菜单项?如果新的 UI 设计取消了按钮,菜单会怎样?更好的方法是分解事件处理程序的操作,使其独立于其附加的控件。有几种方法可以做到这一点:

  1. 一种方法是完全删除 MenuItem1Click 方法,并将 Button1Click 方法分配给 MenuItem1.OnClick 事件属性。为分配给菜单项事件的按钮命名的方法会令人困惑,因此您需要重命名事件处理程序,但这没关系,因为与 VB 不同,Delphi 的方法名称不定义它们所处理的事件处理。只要签名匹配,您就可以将任何方法分配给任何事件处理程序。两个组件的 OnClick 事件都是 TNotifyEvent 类型,因此它们可以共享一个实现。 根据它们的用途而不是它们所属的内容来命名方法。

  2. 另一种方法是将按钮的事件处理程序代码移至单独的方法中,然后从两个组件的事件处理程序中调用该方法:

    procedure HandleClick;
    begin
    // Do something.
    end;

    procedure TJbForm.Button1Click(Sender: TObject);
    begin
    HandleClick;
    end;

    procedure TJbForm.MenuItem1Click(Sender: TObject);
    begin
    HandleClick;
    end;

    这样,真正起作用的代码就不会直接与任何一个组件绑定(bind),并且让您可以更轻松地自由地更改这些控件,例如通过重命名它们或替换它们具有不同的控制。将代码与组件分离使我们找到了第三种方法:

  3. Delphi 4 中引入的 TAction 组件专门针对您所描述的情况而设计,其中同一命令有多个 UI 路径。 (其他语言和开发环境提供类似的概念;这并非 Delphi 所独有。)将事件处理代码放入 TActionOnExecute 事件处理程序中,然后分配该代码按钮和菜单项的 Action 属性的操作。

    procedure TJbForm.Action1Click(Sender: TObject);
    begin
    // Do something
    // (Depending on how closely this event's behavior is tied to
    // manipulating the rest of the UI controls, it might make
    // sense to keep the HandleClick function I mentioned above.)
    end;

    想要添加另一个像按钮一样的 UI 元素吗?没问题。添加它,设置其 Action 属性,然后就完成了。无需编写更多代码即可使新控件的外观和行为与旧控件类似。您已经编写过该代码一次。

    TAction 不仅仅是事件处理程序。 它可以让您确保 UI 控件具有统一的属性设置,包括标题、提示、可见性、启用性和图标。当命令当时无效时,相应地设置操作的 Enabled 属性,任何链接的控件将自动禁用。例如,无需担心命令通过工具栏被禁用,但仍可通过菜单启用。您甚至可以使用操作的 OnUpdate 事件,以便操作可以根据当前条件自行更新,而无需知道何时发生可能需要您设置 Enabled 立即购买。

关于delphi - 为什么从代码中调用事件处理程序是不好的做法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/956255/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com