【问题标题】:extending the delphi TEditCopy action to also copy listbox items to clipboard扩展 delphi TEditCopy 操作以将列表框项复制到剪贴板
【发布时间】:2010-04-16 10:56:22
【问题描述】:

我有一个表单,它的大部分功能都是使用标准 TAction 实现的。我有一个菜单、一个工具栏和一些工具按钮。我已经实现了剪贴板复制/粘贴,根本没有代码,只使用 TEditCopy 和 TEditPaste 操作。它在我拥有的 TEdit 和 TMemo 框中完美运行。

现在,我希望它也可以与 TListBox 一起使用。具体来说,我希望能够使用完全相同的菜单项、快捷键和工具按钮复制 TListBox 中选定的列表项。

所以,我相信我需要扩展 TEditCopy 操作。但这对我来说似乎不是很直接。特别是,TEditAction 检查焦点控件是否为 TCustomEdit 控件,而不是 TListBox。我有点担心工作量太大。

显而易见的替代方法是忘记标准操作并在通用 TAction 的 OnExecute 方法中实现复制到剪贴板。

但是,在放弃之前,您有什么想法、提示或技巧可以帮助我扩展标准 TEditCopy 操作吗?

【问题讨论】:

    标签: delphi clipboard taction


    【解决方案1】:

    这是我要实施的 hack。

    不需要手动更改我已有的 ActionList 或 MenuItems 和 ToolButtons,因为我为该类保留了 同名 TEditCopy。

    type
     TEditCopy = class(StdActns.TEditCopy)
      public
       function HandlesTarget(Target: TObject): Boolean; override;
       procedure ExecuteTarget(Target: TObject); override;
       procedure UpdateTarget(Target: TObject); override;
      end;
    

    它扩展了标准的 TEditCopy 操作,还具有支持 TListBox 所需的功能。

    function TEditCopy.HandlesTarget(Target: TObject): Boolean;
     begin
      result:=(inherited handlesTarget(Target)) or (target is TListbox);
     end;
    
    procedure TEditCopy.ExecuteTarget(Target: TObject);
     begin
      if (target is TListBox) and (TListBox(Target).ItemIndex<>-1) then
        clipboard.AsText:=TListBox(Target).Items[TListBox(Target).ItemIndex]
      else
        inherited;
     end;
    
    procedure TEditCopy.UpdateTarget(Target: TObject);
     begin
      if target is TListbox then
        Enabled := true
      else
        inherited;
     end;
    

    应用程序的其余部分保持不变。所有的复制/粘贴功能仍然完全没有代码实现。

    【讨论】:

    • 您应该更改 UpdateTarget,使您的 Enabled 语句为 Enabled := TListBox(Target).ItemIndex &lt;&gt; -1)。使用您当前的代码,即使没有选择,它也会启用,但 ExecuteTarget 将调用继承的处理程序并会崩溃,因为它需要编辑。
    • 是的,你是对的!事实上,这在我的生产代码中永远不会发生,(我有两个 IF 而不是一个只有一个 ELSE 的 IF)只有我在这里复制的代码有这个错误。
    【解决方案2】:

    您应该覆盖 TAction 的事件处理程序,或者创建一个新的后代,将 TEditAction/TEditCopy 中的代码与 TListBox 的额外处理相结合。

    操作的扩展点是设置 OnExecute/OnUpdate 事件处理程序,这在此处不起作用,因为它会禁用现有的 TEdit 处理。您可以从 TEditCopy 继承并覆盖这些方法,但它可能与直接从 TAction 继承的新类一样多。可能还有其他一些低级的 hack 会起作用,但我看不到它,即使有,它也保证比记录的方法更难维护。

    【讨论】:

    • 感谢您的回答,这正是我认为我需要的,也是我害怕做的。在我自己的新 TEditCopyAction 中重新实现完整的 TEditAction 和 TEditCopy 以处理 TListBox。
    • 我已经提出了一个解决方案,请参阅下面的我自己的答案。为了感谢你们四位的关心,你们值得我接受你们的回答。谢谢-
    • @Craig Peterson:你能注意一下这个posted question也处理TAction吗?
    【解决方案3】:

    我记得我在网上读过一些关于它的东西,但我找不到返回链接。如果我找到它,我会更准确地告诉你。

    不过,我记得的是,一个操作使用“TBasiAction.HandlesTarget”方法检查它是否可以应用(或不应用)到特定目标 - 这是虚拟的。您应该检查在执行操作时如何使用方法“HandlesTarget”、“UpdateTarget”和“ExecuteTarget”(TBasicAction 的所有成员)。

    再一次,如果我找到链接,可以了解更多。

    [编辑]

    这不是我要找的帖子,但它似乎准确地描述了您想要的内容: etutorials : Defining Custom Actions

    【讨论】:

    • 谢谢,我也找到了这个链接。尽管它提供了实现全新 TAction 所需内容的完整描述,但它不适用于我的案例。就我而言,我已经使用了标准的 TEditCopy 操作,我想保留并扩展以应对焦点控件是 TListbox 的情况。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-27
    • 2023-01-31
    • 2015-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多