2

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

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

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

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

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

4

3 回答 3

2

这是我出来实施的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;

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

于 2010-04-17T10:23:15.727 回答
0

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

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

于 2010-04-16T13:45:35.780 回答
0

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

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

再次,如果我找到链接,更多关于此的信息。

[编辑]

这不是我要找的帖子,但它似乎准确地描述了您想要的内容: 教程:定义自定义操作

于 2010-04-16T13:15:16.957 回答