WndProc漏写override会发生什么情况?

试图改写TForm1(注意,不是TForm类)的WndProc函数,从而达到某些目的。程序如下:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
  private
    { Private declarations }
  public
    { Public declarations }
        procedure WndProc(var message:TMessage); override; // 如果漏写override,TForm1的WndProc函数将不起作用。原因是,TObject努力把消息发到TForm1里来,试图调用TForm1的虚函数WndProc,结果在它的虚函数列表中没有找到此函数(因为名称被占用,因此VMT列表里不再有它),于是就回到TForm1的上级,即TForm,找到了后者的WndProc,执行,当然没有任何特殊的自定义动作。
// 还有另一种可能,即VMT和普通函数里都有一个叫做WndProc的函数。但是VMT里的那个函数没有被改写,因此不执行任何动作。偏偏TObject是发消息给它的。
end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.WndProc(var message:TMessage); begin if message.msg =WM_LBUTTONDOWN then ShowMessage('ddd') else inherited WndProc(Message); end; end.
原文地址:https://www.cnblogs.com/findumars/p/3523951.html