我有一个形式与大多数其实现的功能,使用标准TAction.我有一个菜单的一个工具栏和一些toobuttons.我已经实现的剪贴板粘贴有没有代码,只是使用TEditCopy和TEditPaste的行动。它完美的作品在TEdit和TMemo框我有。

现在,我希望它的工作与TListBox,太。具体地说,我希望能够复制选择清单中的项目TListBox使用同样的菜单项、关键的快捷方式和toolbuttons.

因此,我认为我会需要延长TEditCopy行动。但这似乎并不非常直接的给我。特别是,TEditAction检查为重点的控制是一个TCustomEdit控制,这一TListBox它不是。我有点害怕它会被太多的工作。

显而易见的选择是只是忘了标准行动和执行复制,以clipbard在OnExecute方法的一般TAction.

但是,在放弃之前,你有一些想法,暗示或欺骗,将会帮助我的扩展标准TEditCopy行动?

有帮助吗?

解决方案

您应该要么重写TAction的事件处理程序或创建一个新的后裔,结合从TEditAction / TEditCopy代码与额外处理的TListBox中。

动作扩展点是设置OnExecute /的OnUpdate事件处理程序,而不会在这里工作,因为它会禁用现有TEDIT处理。你可以从TEditCopy下降和覆盖的方法,但它可能会尽可能多的代码为下降直接从TAction一个新的类。可能有一些其他低级别的黑客工具,将工作,但我没有看到它,即使有,它保证比成文少维护。

其他提示

下面是我出来实现黑客攻击。

它不需要手动更改的ActionList或者我已经拥有的MenuItems按钮的位置,因为我一直在同名 TEditCopy的类。

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

它扩展与支持的TListBox以及所需要的功能的标准TEditCopy动作。

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;

应用程序的其余部分保持不变。所有的复制/粘贴functionalit仍然与根本没有代码来实现。

我记得具有读过的东西上网,但我找不到链接。如果我找到它回来,我会告诉你更精确地了解它。

我记得,虽然是一个行动,检查是否可以应用(或不)为特定目标使用"TBasiAction.HandlesTarget"的方法-这是虚拟的。你应该检查的方法"HandlesTarget","UpdateTarget"和"ExecuteTarget"(所有成员TBasicAction)时使用执行一个行动。

再次,更多关于这一点,如果我找到的链接。

[编辑]

这不是后我一直在寻找,但它似乎准确描述你想要什么:etutorials:定义定义的行动

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top