扩展delphi TEditCopy操作以将列表框项目也复制到剪贴板
我有一个表单,它的大部分功能都是使用标准的TAction实现的。我有一个菜单,一个工具栏和一些按钮。我实现了剪贴板复制/粘贴,完全没有代码,只使用了TEditCopy和TEditPaste操作。它在我的TEdit和TMemo盒子里工作得非常好 现在,我希望它也能与TListBox一起工作。具体来说,我希望能够使用完全相同的菜单项、快捷键和工具按钮在TListBox中复制选定的列表项 因此,我相信我需要扩展TEditCopy操作。但对我来说,这似乎不是很直截了当。特别是,TEDIAction检查聚焦控件是否为TCustomEdit控件,而不是TListBox控件。我有点担心这将是太多的工作 显然,另一种选择是忘记标准操作,用通用战术的OneExecute方法实现复制到clipbard扩展delphi TEditCopy操作以将列表框项目也复制到剪贴板,delphi,clipboard,taction,Delphi,Clipboard,Taction,我有一个表单,它的大部分功能都是使用标准的TAction实现的。我有一个菜单,一个工具栏和一些按钮。我实现了剪贴板复制/粘贴,完全没有代码,只使用了TEditCopy和TEditPaste操作。它在我的TEdit和TMemo盒子里工作得非常好 现在,我希望它也能与TListBox一起工作。具体来说,我希望能够使用完全相同的菜单项、快捷键和工具按钮在TListBox中复制选定的列表项 因此,我相信我需要扩展TEditCopy操作。但对我来说,这似乎不是很直截了当。特别是,TEDIAction检查聚
但是,在放弃之前,你有什么想法、提示或窍门可以帮助我扩展标准的TEditCopy操作吗?我记得在网上读过一些关于它的内容,但我找不到相关链接。如果我找到它,我会更准确地告诉你 不过,我记得,一个动作会使用“TBasiAction.handleTarget”方法检查它是否可以应用于(或不应用于)特定的目标,该方法是虚拟的。您应该检查在执行操作时如何使用方法“HandleTarget”、“UpdateTarget”和“ExecuteTarget”(TBasicAction的所有成员) 再一次,如果我找到链接,我会更多地了解这一点 [编辑] 这不是我要找的帖子,但它似乎准确地描述了你想要什么:
您应该重写TAction的事件处理程序,或者创建一个新的子体,将来自TEDIAction/TEditCopy的代码与TListBox的额外处理结合起来
操作的扩展点是设置OnExecute/OnUpdate事件处理程序,而这在这里不起作用,因为它将禁用现有的TEdit处理。您可以从TEditCopy派生并重写这些方法,但它可能与直接从TAction派生的新类一样多。可能还有其他一些低级别的黑客可以使用,但我看不到,即使有,它的可维护性也肯定比文档化的方法要差。下面是我要实现的黑客 它不需要手动更改ActionList或我已有的菜单项和工具按钮,因为我为类保留了相同的名称
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;
函数TEditCopy.handleTarget(Target:TObject):布尔值;
开始
结果:=(继承的HandleTarget(目标))或(目标为TListbox);
结束;
过程TEditCopy.ExecuteTarget(目标:TObject);
开始
如果(目标是TListBox)和(TListBox(目标).ItemIndex-1),则
clipboard.AsText:=TListBox(目标).Items[TListBox(目标).ItemIndex]
其他的
继承;
结束;
过程TEditCopy.UpdateTarget(目标:TObject);
开始
如果目标是TListbox,则
已启用:=真
其他的
继承;
结束;
应用程序的其余部分保持不变。所有复制/粘贴功能仍然没有代码实现。谢谢,我也找到了这个链接。虽然它提供了实施全新战术所需的完整描述,但它不适用于我的案例。在我的例子中,我已经使用了标准的TEditCopy操作,我想保留并扩展它,以应对聚焦控件是TListbox时的情况。谢谢你的回答,这正是我认为我需要的,也是我害怕做的。在我自己的新TEditCopyAction中重新实现完整的TEDIAction和TEditCopy,以处理TListBox。我已经提出了一个解决方案,请参见下面我自己的答案。为了感谢你们四位的关注,你们值得我接受你们的回答。谢谢-@Craig Peterson:你能不能也注意一下处理TAction这个问题?你应该更改UpdateTarget,这样你的Enabled语句就是
Enabled:=TListBox(Target).ItemIndex-1)
。对于当前代码,即使没有选择,它也将被启用,但ExecuteTarget将调用继承的处理程序,并将崩溃,因为它需要编辑。是的,你是对的!事实上,这在我的生产代码中永远不会发生,(我有两个IF,而不是一个IF和一个IF),只有我在这里复制的代码有bug。