如何拦截和抑制 TFrame 子组件的消息?

2024-02-29

我需要拦截WM_PASTE message https://stackoverflow.com/questions/10158861/how-to-intercept-detect-a-paste-command-into-a-tmemo/10158921#10158921 for a TEdit放置在内部的组件TFrame的后代阶级。

如果不满足条件,我想取消粘贴操作。

有没有办法在帧级别做到这一点? (我的意思是,没有声明TEdit的后裔)


有没有办法在帧级别做到这一点? (我的意思是,没有声明TEdit的后裔)

WM_PASTE被直接发送到TEdit窗口, 的TFrame永远不会看到它,所以你必须子类化TEdit直接拦截消息。您可以:

  • TFrame分配一个处理程序到TEdit's WindowProc财产。如果您只有几个,这是一个简单的方法TEdits到子类,但越多它变得越复杂TEdit你想要子类化:

    type
      TMyFrame = class(TFrame)
        Edit1: TEdit;
        ...
        procedure FrameCreate(Sender: TObject);
        ...
      private
        PrevWndProc: TWndMethod;
        procedure EditWndProc(var Message: TMessage);
        ...
      end;
    
    procedure TMyFrame.FrameCreate(Sender: TObject);
    begin
      PrevWndProc := Edit1.WindowProc;
      Edit1.WindowProc := EditWndProc;
      ...
    end;
    
    procedure TMyFrame.EditWndProc(var Message: TMessage);
    begin
      if Message.Msg = WM_PASTE then
      begin
        if SomeCondition then
          Exit;
      end;
      PrevWndProc(Message);
    end;
    
  • 编写并安装一个派生自的新组件TEdit,类似于TMemo你提出的例子 https://stackoverflow.com/a/10158921/65863.

  • 定义一个本地的插入器类TFrame的单位,上面TFrame类声明,它将拦截WM_PASTE for every TEdit在框架上:

    type
      TEdit = class(Vcl.StdCtrls.TEdit)
        procedure WMPaste(var Message: TMessage); message WM_PASTE;
      end;
    
      TMyFrame = class(TFrame)
        Edit1: TEdit;
        Edit2: TEdit;
        ...
      end;
    
    procedure TEdit.WMPaste(var Message: TMessage);
    begin
      if not SomeCondition then
        inherited;
    end;
    
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何拦截和抑制 TFrame 子组件的消息? 的相关文章

随机推荐

  • JVM JIT 诊断工具和优化技巧

    我听说过很多关于 JVM JIT 的内容can这样做 但没有看到很多关于如何分析 JIT 在程序的给定运行中实际执行的操作的信息 有很多使用技巧 XX PrintCompilation and XX PrintOptoAssembly但它会
  • 如何使用 Python Selenium Webdriver 在 Chrome 中加载默认配置文件?

    我想使用 Python 的 webdriver 启动 Chrome 及其默认配置文件 以便 cookie 和站点首选项在会话中保持不变 我怎样才能做到这一点 这就是它最终为我工作的原因 from selenium import webdri
  • 忘记旧的 WiFi Direct 连接

    有没有办法忘记旧的 WiFi Direct 连接 在代码中 我需要这个来更改谁成为群组所有者 我设置 groupOwnerIntent 15 但尚未成为组所有者 如果您只想断开与现有的连接WiFiP2p连接 然后只需调用WiFiP2pMan
  • 将大量数据加载到数组中的最快方法

    我在 stackexchange 中广泛搜索了一个将巨大 2GB dat 文件加载到 numpy 数组中的简洁解决方案 但没有找到合适的解决方案 到目前为止 我设法以非常快的方式 list f open myhugefile0 for li
  • C++ 在张量流中使用 Eigen

    张量流和特征值之间有什么关系 特别是关于tensor数据结构 有一些较旧的引文 例如 其中指出tensorflow正在广泛使用Eigen 据我所知 tensorflow人员已经扩展了Eigen代码 然而 最近的张量流文档似乎没有明确提及 E
  • SQL 2008 中的内存不足异常

    关于SQL Server 2008中Out of Memory异常 当我执行向表中插入数千行的大型查询时 执行此操作时发生的异常是 System OutOfMemoryException 根据一篇非常好的微软知识库文章 链接在这里 http
  • 如何获取 MongoDB 中的所有文档 ID?

    如何获取 MongoDB 中所有文档 ID 的数组 我只需要一组 id 但不需要文档内容 您可以通过调用在 Mongo shell 中执行此操作map http docs mongodb org manual reference metho
  • 为 MVC 应用程序添加尾部斜杠

    我正在构建一个基于 MVC 设计模式的应用程序 我希望我的 URL 如下 http example com page action http example com page action 我成功地让它与下面的代码一起工作 但如果 URL
  • 如果我要将文件内容读入数组,是否需要初始化数组?

    我正在初始化buf在立即用以下内容重写其内容之前不必要地全为零read exact fn parse
  • 在 Python 代码中使用 Git 命令

    我被要求编写一个脚本 从 Git 中提取最新代码 进行构建并执行一些自动化单元测试 我发现有两个内置的 Python 模块可以随时使用 用于与 Git 交互 GitPython and libgit2 我应该使用什么方法 模块 更简单的解决
  • 在输入类型=“文本”中键入时跟踪 onchange 的最佳方法?

    在我的经验中 input type text onchange事件通常仅在您离开后发生 blur 控制 有没有办法强制浏览器触发onchange每次textfield内容变化 如果不是 那么 手动 跟踪这个最优雅的方法是什么 Using o
  • 在 Razor 中将视图模型属性编码为 JavaScript

    我有一个简单的视图模型 public class IndexViewModel public bool ShowWelcomeMsg get set 在我看来 我需要 JS 中的这个属性 但这是不正确的 因为它输出False代替false但
  • 使用PyQt5嵌入动态条形图

    我在 python 中编写了以下代码 以在生成的 GUI 中显示条形图PyQt5 import sys from PyQt5 QtWidgets import QDialog QApplication QPushButton QVBoxLa
  • Libgdx ModelBuilder.createRect 仅从一侧可见

    在我的第一个 libgdx 3D 游戏中 我现在从createBox to createRect 仅创建可见面 如果一堵墙位于另一堵墙的左侧 则其右面不可见 我正在创建 4 个模型 frontFace backFace rightFace
  • 如何在React-native ListView中过滤数据?

    我正在尝试过滤数组对象列表 然后尝试使用新的数据源在 ListView 中显示 但是 该列表并未被过滤 我知道我的过滤功能工作正常 我在console log中检查过 我正在使用 Redux 将状态映射到 prop 然后尝试过滤道具 这是错
  • SignalR 和序列化对象数组

    我是 SignalR 的新手 并且已经完成了一个简单的测试 hack 我希望用类型化对象序列化对象数组 默认情况下 SignalR 已将 Json NET 序列化器配置为不提供类型信息 我发现我可以通过以下方式在 DependencyRes
  • 无法执行操作。计算替代解决方案,可能需要一段时间 STS?

    我想问一下添加新的时候出现这个错误是什么意思Available Software Site并使用 Eclipse STS Spring Tool Suite 安装新软件Install New Software 我遇到这个问题Spring T
  • 使用 new(Integer) 与 int

    在我的 Java 课上 教授使用了类似的内容 integerBox add new Integer 10 这和刚刚做的一样吗 integerBox add 10 我用谷歌搜索了一下 但找不到一种方法或另一种方法 而且教授也很含糊 我能找到的
  • 查找特殊字符之间的文本并替换字符串

    例如我有一个字符串包含 String s test string 67 Hi 我想得到这个字符串 67 有了星星 我就可以开始替换那部分字符串了 我现在的代码如下所示 String s test string 67 Hi s s subst
  • 如何拦截和抑制 TFrame 子组件的消息?

    我需要拦截WM PASTE message https stackoverflow com questions 10158861 how to intercept detect a paste command into a tmemo 10