Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
扩展delphi TEditCopy操作以将列表框项目也复制到剪贴板_Delphi_Clipboard_Taction - Fatal编程技术网

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

扩展delphi TEditCopy操作以将列表框项目也复制到剪贴板,delphi,clipboard,taction,Delphi,Clipboard,Taction,我有一个表单,它的大部分功能都是使用标准的TAction实现的。我有一个菜单,一个工具栏和一些按钮。我实现了剪贴板复制/粘贴,完全没有代码,只使用了TEditCopy和TEditPaste操作。它在我的TEdit和TMemo盒子里工作得非常好 现在,我希望它也能与TListBox一起工作。具体来说,我希望能够使用完全相同的菜单项、快捷键和工具按钮在TListBox中复制选定的列表项 因此,我相信我需要扩展TEditCopy操作。但对我来说,这似乎不是很直截了当。特别是,TEDIAction检查聚

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

现在,我希望它也能与TListBox一起工作。具体来说,我希望能够使用完全相同的菜单项、快捷键和工具按钮在TListBox中复制选定的列表项

因此,我相信我需要扩展TEditCopy操作。但对我来说,这似乎不是很直截了当。特别是,TEDIAction检查聚焦控件是否为TCustomEdit控件,而不是TListBox控件。我有点担心这将是太多的工作

显然,另一种选择是忘记标准操作,用通用战术的OneExecute方法实现复制到clipbard


但是,在放弃之前,你有什么想法、提示或窍门可以帮助我扩展标准的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。