我现在用的是Delphi 7.
在下列代码中(很简单的一个消息响应):
-------------------------------------------------------------------------
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs;type
  TForm1 = class(TForm)
  private
    { Private declarations }
    procedure WMPaint(var Msg: TWMPaint); message WM_PAINT;
  public
    { Public declarations }
  end;var
  Form1: TForm1;implementation{$R *.dfm}{ TForm1 }procedure TForm1.WMPaint(var Msg: TWMPaint);
begin
  messagebeep(0);
  inherited;
end;end.-------------------------------------------------------------------------《delphi 5 开发人员指南》说(具体见P119):在
procedure TForm1.WMPaint(var Msg: TWMPaint)中写了inherited,是为了让Windows完成他本该完成的事情,如果不写"inherited",Windows就没办法画窗体,即窗体不会显示出来。但是我屏蔽了inherited后,发现窗体依旧能显示,和写了inherited没有区别。我不知道是我理解有误还是Delphi 5与 Delphi 7的区别。我现在手头上没有delphi 5,就没办法实验。请知道的兄弟说说。

解决方案 »

  1.   

    注意重画和显示是不同的概念。
    如果你有过VC经验的话就很好理解,《delphi 5 开发人员指南》的意思应是如果你的代码改变了窗体的DC,你不重画窗体是不能看到改变DC的效果的,而你的消息没有inherited的话,消息被你拦下,无论你怎样form.Repaint都没用的。
    没做过具体实验,有错的话请原谅!!
      

  2.   

    to Bitter_fish(苦鱼):
    偶没用过VC.:(原话是:
    为了证明inherited的作用,可以在清单5 - l中把WMPaint( )方法中的inherited去掉,即代码变成:
    procedure TForm1.WMPaint(var Msg: TWMPaint);
    begin
      messagebeep(0);
    end;因为这样Windows就没有机会对WM_PAINT消息进行基本的处理,所以,窗体就不会被画出来。
      

  3.   

    你在canvas上画几条线,再将窗口反复拉大再拖小,应该就可以看到用inherited与不用inherited的效果。
    屏蔽inherited后,窗口依旧能显示,只是重画有问题。个人认为D5那里翻译有误(当时也误导了我-_-)
      

  4.   

    inherited相当于执行父类的WMPaint()函数,而控件的绘制工作都是在这个函数中的。
      

  5.   

    inherited相当于执行父类的WMPaint()函数,而控件的绘制工作都是在这个函数中的。
      

  6.   

    to  aiirii(ari-爱的眼睛):
    确实没错。
    窗体的"显示"和"画"区别在哪里呢?望指教。
      

  7.   

    当你放大缩小窗体时,WINDOWS会给这个窗体一个WM_PAINT消息。窗体得到这个消息后会给这个窗体的所有子窗体分别一个WM_PAINT消息,这样这个窗体就重画了一次。如果你没有inherited的话,子窗体就没有得到WM_PAINT消息,所以消失。显示就是窗体的一个属性。重画是WINDOWS的一个重要机制。