扩展delphi TEditCopy操作以将列表框项目复制到剪贴板

时间:2010-04-16 10:56:23

标签: delphi clipboard taction

我有一个表单,其大部分功能都是使用标准TAction实现的。我有一个菜单,一个工具栏和一些toobuttons。我只使用TEditCopy和TEditPaste动作实现了没有代码的剪贴板复制/粘贴。它在我拥有的TEdit和TMemo盒子中非常完美。

现在,我希望它也适用于TListBox。具体来说,我希望能够使用相同的菜单项,关键快捷方式和工具按钮在TListBox中复制选定的列表项。

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

显而易见的替代方法是忘记标准操作,并在通用TA的OnExecute方法中将副本实现到clipbard。

但是,在放弃之前,你是否有一些想法,提示或技巧可以帮助我扩展标准的TEditCopy行动?

3 个答案:

答案 0 :(得分:2)

这是我出来实施的黑客攻击。

不需要手动更改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;

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

答案 1 :(得分:0)

我记得在网上看到过有关它的内容,但我找不到链接。如果我找回来,我会更准确地告诉你。

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

如果我找回链接,请再说一次。

[编辑]

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

答案 2 :(得分:0)

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

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