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

Fab*_*zio 2 delphi paste delphi-2007 windows-messages

我需要截取WM_PASTE一个TEdit放在一个TFrame后代类中的组件消息.

如果不满足条件,我想进行粘贴操作.

有没有办法在帧级别执行此操作?(我的意思是,没有声明一个TEdit人的后代)

Rem*_*eau 5

有没有办法在帧级别执行此操作?(我的意思是,没有声明一个TEdit人的后代)

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

  • TFrame处理函数分配给了TEditWindowProc财产.如果你只有少数TEdits子类,这是一个简单的方法,但是TEdit你想要子类的s 越多越复杂:

    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;
    
    Run Code Online (Sandbox Code Playgroud)
  • 编写并安装一个派生自的新组件TEdit,类似于TMemo您提供示例.

  • 定义内插类是本地只是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;
    
    Run Code Online (Sandbox Code Playgroud)