延伸的特尔斐TEditCopy行动,还复制列表框项目的剪贴板
题
我有一个形式与大多数其实现的功能,使用标准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:定义定义的行动