我有一个表单,其大部分功能都是使用标准TAction实现的。我有一个菜单,一个工具栏和一些toobuttons。我只使用TEditCopy和TEditPaste动作实现了没有代码的剪贴板复制/粘贴。它在我拥有的TEdit和TMemo盒子中非常完美。
现在,我希望它也适用于TListBox。具体来说,我希望能够使用相同的菜单项,关键快捷方式和工具按钮在TListBox中复制选定的列表项。
所以,我相信我需要扩展TEditCopy Action。但对我来说这似乎不太直接。特别是,TEditAction检查聚焦控件是否为TCustomEdit控件,TListBox不是。我有点担心这会是太多的工作。
显而易见的替代方法是忘记标准操作,并在通用TA的OnExecute方法中将副本实现到clipbard。
但是,在放弃之前,你是否有一些想法,提示或技巧可以帮助我扩展标准的TEditCopy行动?
答案 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下降的新类一样多。可能还有其他一些低级别的黑客可以使用,但是我没有看到它,即使有,它也可以保证比记录的方法更难维护。