为什么在TMemo组件上Ctrl+C无效?(Vista + Delphi 7)

4

为什么无法将TDBMemo组件中选择的文本复制到剪贴板中? DELPHI 7,Windows Vista。 以下代码无法捕获ctrl+c事件,而ctrl+a却可以正常工作。

uses clipbrd;

    procedure THierarchierForm.dbm1KeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    begin

    if (Key=Ord('A')) and (ssCtrl IN Shift) then begin
    dbm1.SelectAll;
    Key:=0;
    end;

    if (Key=Ord('C')) and (ssCtrl IN Shift) then begin
    Clipboard.AsText:=dbm1.SelText;
    Key:=0;
    end;

    end;

谢谢。

2
我不知道你问题的答案,但是你做错了。如果你想处理快捷键,应该使用快捷键处理程序而不是 KeyDown。你可以使用 CTRL+SHIFT+ALT+C 和包括 CTRL 的任何组合来复制到剪贴板。如果你想将备忘录复制到剪贴板,那么我认为你应该调用 dbm1.CopyToClipboard - David Heffernan
我知道这不正确,但它让我很困扰,我无法理解。我不想复制整个备忘录,只想选取其中的一部分。"快捷键处理程序"是什么? - lyborko
CopyToClipboard可以做你想要的事情。我总是尝试使用Shortcut属性(例如在菜单或操作上)来处理这些事件。只写Shift=[ssCtrl]会更好,但最好的方法是Shift*[ssShift,ssAlt,ssCtrl]=[ssCtrl],但这有点学究。无论如何,如果你以这种方式做,将其移到Helper函数中。 - David Heffernan
1
我对TDBMemo不是很了解,但普通的TMemo本身就可以处理Ctrl+C(X、V、Z)。无论如何,@David对他的评论是正确的。 - Andreas Rejbrand
1个回答

3

您提供的代码可以在普通表单的上下文中使用。一定有其他干扰因素。

最明显的是,您的表单已将KeyPreview设置为True,因此您的表单处理CTRL+C

请注意,我坚持我的评论中表达的保留意见。


谢谢。但是keypreview是false...我认为干扰应该会发生,因为CTRL+X、CTRL+V很好用。我有一个TApplicationEvents对象,在OnMessage事件处理程序中捕获一些事件路由到TDBmemo,但是在删除此处理程序后,我没有看到任何区别。 - lyborko
我会使用Spy或类似的工具来检查消息的去向。或者你也可以在Delphi调试器中使用适当的条件断点来完成这个任务。 - David Heffernan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接