首页 > 代码库 > inherited在消息中的作用

inherited在消息中的作用

好奇一下。看来Object Pascal确实与Windows深入结合了。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

const
  UM_Test = WM_USER + 100;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure MyMessage(var Msg: TMessage); message UM_Test;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   Perform(UM_Test, 0, 0);
end;

procedure TForm1.MyMessage(var Msg: TMessage);
begin
  inherited;
  ShowMessage(Hello);
end;

end.

在message处理中和其他不一样的是inherited不会因为没有在祖先中找到一样的函数或者方法而将inherited失效,他会传入缺省的消息处理.
这里调用TFORM1的祖先的消息处理,由于tform和tcustomform没有这个实现,所以直接调用的是tcustomform的defaulthandle.(注意这个方法是对twincontrol的override)。

但是,如果本类重载了DefaultHandler函数,就会直接调用本类的DefaultHandler函数:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls;

const
  UM_Test = WM_USER + 100;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    procedure MyMessage(var Msg: TMessage); message UM_Test;
    procedure DefaultHandler(var Message); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
   Perform(UM_Test, 0, 0);
end;

procedure TForm1.DefaultHandler(var Message);
begin
  with TMessage(Message) do
  begin
      if Msg = UM_Test then ShowMessage(DefaultHandler);
  end;
  inherited;
end;

procedure TForm1.MyMessage(var Msg: TMessage);
begin
  inherited;
  ShowMessage(Hello);
end;

end.

 顺便再看看这样改写的效果:

procedure TForm1.DefaultHandler(var Message);
begin
  with TMessage(Message) do
  begin
      if Msg = UM_Test then ShowMessage(DefaultHandler);
      if Msg = WM_SETTEXT then ShowMessage(WM_SETTEXT);
  end;
  inherited;
end;