delphi - TWinControl 的助手

标签 delphi

我喜欢“覆盖”TWinControl.CNKeyDown,将 Enter 键用作 Tab,而不修改原始 VCL 源。 我也这样做,使用 SetFocus,效果很好。

辅助类型声明为:

type
   TWinControlEx = class helper for TWinControl
   private
       procedure SetFocus; reintroduce;
       procedure CNKeyDown(var Message: TWMKeyDown); reintroduce;
   end;

重写的方法如下所示:

if (Message.CharCode = 13) and (Pos('Cr_To_Tab',ImeName)>0) and (Pos('No_Cr_To_Tab',ImeName)=0) then
      begin
        if not ((GetKeyState(VK_CONTROL) and not $7FFF) <> 0) then
        begin
          Message.CharCode := 9;
        end;
      end;
   Message.CharCode := 9;
   inherited;

但是我的代码运行起来好像还是用原来的版本。另一个令人沮丧的事情是我无法调试问题,因为当我在 CNKeyDown 方法中放置一个断点时,它永远不会停止,并且 IDE (RAD Studio 10.2) 在其中放置了一个叉号。

谁能给我一些指导?

最佳答案

您不能像您尝试的那样使用类助手来重新引入现有方法的新版本。

类助手不是解决方案。您需要改为:

  1. 从所需的原始类派生一个新类,如 TEdit,并覆盖其适用的virtual/dynamic 方法,如 WndProc()KeyDown() 等,然后在运行时创建自定义类的实例而不是原始类。您可以在设计时在 IDE 中安装您的自定义类,也可以将您的类实现为 Interposer,以便它仅在运行时覆盖原始类。参见 Two Approaches to Sub-classing Components Compared了解更多详情。

  2. 根本不要派生新类。只需在运行时子类化原始类的所需对象实例的 WindowProc 属性。然后您可以在他们处理之前处理他们的窗口消息。

关于delphi - TWinControl 的助手,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43865802/

相关文章:

delphi - 将多个对象作为一个参数传递

delphi - 分组盒 1 或 2;根据单击按钮后选择哪个复选框

c - Delphi dcu 到 obj

delphi - 断开连接时发生 IdHTTP 访问冲突

delphi - 需要一种方法来定期记录调用的每个方法/过程/函数的调用堆栈/堆栈跟踪

android - 如何从 Android 中删除短信。拉德工作室

delphi - 如何完全断开TCPClient? (印地)

delphi - 仅对某些类启用 Delphi XE RTTI

delphi - Spring4d - ObjectDataset 刷新没有从底层 IObjectList 获取记录

windows - 如何判断外部应用程序何时在 delphi 中结束