首先Form1继承TForm, Form2继承Form1, Form3继承Form2, 然后在Form1的OnKeyDown事件中写按Escape键关闭窗体:
  if Key = VK_ESCAPE then
  begin
    Close;
  end;
而且在Form1.KeyPreview := True; 当然Form2, Form3.KeyPreview也是True, 问题就在这里: 当Form3.Create时, 按Escape键为什么窗体不会关闭呢 ?
如果Form3直接继承Form1就不会发生这种情况.

解决方案 »

  1.   

    Form2 的 OnKeyDown 中应 inherited; 吧,试试!
      

  2.   

    是因为 Form2.OnKeyDown 事件代码覆盖了 Form1.OnKeyDown ,所以……
      

  3.   

    当Form2.Create时, 按Escape键窗体会不会关闭呢 ?
      

  4.   

    TForm.onKeyDown是个函数指针,你的那段代码是放在Form1的另一个方法中,一般是Form1.Form1KeyDown(...)(IDE自动生成的一般是这样。你也可以取别的名字)。在属性窗里面,Form1.onKeyDown的值是TForm1.Form1KeyDown(你当然也可以自己改,让它指向一个你自己写的方法)。
    这个信息会保存到窗口的描述文件中,在Form1的实例初始化时,会执行一个赋值操作:
     self.onKeyDown := Form1KeyDown;当发生按键的事件时,系统会调用Form1实例的函数指针onKeyDown。Form2,Form3继承自Form1,意思是他们拥有Form1的所有字段和方法(比如那个Form1OnKeyDown方法),但是,那个赋值操作并没有继承下来。解决方法:
    contructor  Form3.Create(...)
    begin
    ...
       self.onKeyDown := self.Form1KeyDown;//(Form1中)
    end;你试试,保证ok.
      

  5.   

    或者给Form3的onCreate事件添加如下代码:
      self.onKeyDown := self.Form1KeyDown;