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

标签 delphi paste delphi-2007 windows-messages

我需要intercept the WM_PASTE message对于放置在 TFrame 的后代类中的 TEdit 组件。

如果不满足条件,我想启动粘贴操作。

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

最佳答案

Is there a way to do this at the frame level? (I mean, without declaring a TEdit's descendant)

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

  • TFrame将处理程序分配给 TEditWindowProc属性(property)。如果您只有几个TEdit,这是一个简单的方法。 s 到子类,但越多就越复杂 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 example you presented .

  • 定义一个仅位于 TFrame 本地的插入器类。的单位,位于 TFrame 上方类声明,它将拦截 WM_PASTE对于每个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;
    

关于delphi - 如何拦截和抑制 TFrame 子组件的消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49304718/

相关文章:

delphi - 如何在内联汇编中访问delphi开放数组参数

Javascript - 删除粘贴上的空格

linux - 在终端 Vim ( :set paste vs <c-r>* vs . ) 中粘贴代码。

delphi - 以编程方式更改 TChart 大小

delphi - 为什么大多数 Delphi 示例使用 FillChar() 来初始化记录?

Delphi XE 键盘错误

delphi - 无法让 Delphi 2007 的远程调试器正常工作?

javascript - 在自定义上下文菜单中实现 'Paste'

delphi - 将 Hi-Ansi 字符转换为等效的 Ascii 字符 (é -> e)

delphi - 如何避免调用 Application.CreateForm 两次?