【问题标题】:Listbox multiselect losing focus with OnKeyUp列表框多选失去焦点与 OnKeyUp
【发布时间】:2013-06-30 18:59:47
【问题描述】:

我有两个列表框,并且都带有 Multiselect:=True。我有一个弹出菜单,可将所选项目复制/粘贴到剪贴板/从剪贴板中复制/粘贴。一切按预期工作。

我想添加键盘 CtrlC(复制)和 Ctrl+V(粘贴),但是在选择项目后,然后使用 Ctrl-C,选定的项目全部丢失选择,列表中的第一个项目被选中,它被复制到剪贴板。

我正在使用 KeyPreview 和主窗体 OnKeyUp

if (ssCtrl in Shift) then
begin
  case Char(Key) of
   'c','C' : puCopyClick(Sender);
   'v','V' : puPasteClick(Sender);
  end;
  Exit;
end;
case Key of
  VK_Delete : puDeleteClick(Self);
end;
Exit;

我怎样才能使 Ctrl+C 等像弹出窗口一样工作?

谢谢

【问题讨论】:

  • 根据你之前的问题,没有键盘,只有鼠标,所以这个问题没有意义。除此之外,是什么让你选择了OnKeyUp?那是错误的事件。看看其他应用程序的行为方式。快捷键按下时触发。您希望我们帮助您学习如何正确地完成所有这些工作吗?从您之前的问题来看,您似乎不想做对。
  • @DavidHeffernan 您似乎很多。我没有说没有键盘,我说我是在强迫他们使用鼠标。这样做的原因是我这样做是为了帮助半自动化朋友失败的业务,并且在不到一小时的时间内,我会决定什么是正确的方法来做这个 东西。我已经编程了很长时间,可能在你出生之前,(基于明显傲慢的假设)所以当你只了解 5% 的情况时,请不要提出“正确”教我。
  • 当您强制他们使用鼠标时,他们将如何按 CTRL+C?如果您想假设仅通过使用鼠标来更改焦点,那取决于您。但这是一个错误的假设。我不能强迫你以正确的方式去做。如果您认为OnMouseUp 是检测焦点变化的正确方法,那么这取决于您。但我相信你会从敞开心扉接受你错了的可能性中受益。当然,我也可能是错的。我没有所有信息。
  • 另外,你开始编程有什么关系。那么如果是在我出生之前呢?我在这里有大约 200k 的代表。这让我对吗?当然不是。我可能会说绝对的垃圾。我经常这样做。你应该根据自己的优点来判断陈述。任何时候有人试图断言他们是对的,因为他们年龄更大,更有经验,我会怀疑。有比我编程更好的青少年,也有绝望的 40 岁老兵。
  • 对您在程序中观察到的行为的解释:在您的按键事件处理程序运行之前,控件的内置按键处理程序正在查看按键并尝试选择列表中以 C 开头的项目,这显然是列表中的第一项。之后,您的按键处理程序将新更改的选择复制到剪贴板。

标签: delphi listbox delphi-5 onkeyup


【解决方案1】:

处理快捷键的最佳方式是让菜单项处理它们。您说您有一个包含这些操作的弹出菜单。使用菜单项的Shortcut 属性将该菜单项与快捷键相关联。

这允许您删除所有手动键盘事件处理并让框架为您完成。这有很多好处。其中最重要的一点是,当按键按下而不是像您当前拥有的那样上升时,该事件将触发。

如果我没记错的话,最好使用 Delphi 5 中确实存在的动作。这些允许您关联单个 动作,例如 复制到剪贴板多个独立的 UI 元素。例如,该操作可以与主菜单、弹出菜单和快捷键相关联。

【讨论】:

  • 谢谢大卫,我忽略了快捷键。另一个“更好”的建议比我愿意投资这个项目需要更多的工作:要了解原因,请参阅上面的评论。 :)
  • 通常使用动作比其他方法的工作量更少。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
相关资源
最近更新 更多