delphi 里面写了个basefm窗体,新建立一个窗口,用代码改动继承自basefm,为什么新窗口产生的时候,没有执行basefm的onCreate事件?basefm里面的OnCreate里面有写MessageBox,但是,新窗口就是没有弹出来

解决方案 »

  1.   

    是否在子窗体中也有ONCREATE,而且没有引用INHERITED
      

  2.   

    delphi 里面写了个basefm窗体,新建立一个窗口,用代码改动继承自basefm,
    ---
    alt+f12
    如下代码:
    object Form1: TForm1
      Left = 192
      Top = 107
      Width = 696
      Height = 480
      Caption = 'Form1'
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      OldCreateOrder = False
      PixelsPerInch = 96
      TextHeight = 13
    end改成
    inherited Form1: TForm1
    end
    然后alt+f12
      

  3.   

    to : zaza_bbface(我试着成熟一点~) (
    我也改过,还是没有成功,我的form是DLL里面的
      

  4.   

    我在basefm里面加了个主菜单,但是,在调用dll form后,form没有主菜单,但是,主程序(MDI)主窗口的菜单被basefm的菜单覆盖了,说明 dll form还是继承了basefm的主菜单,但是,并没有出现在 dll form里面( dll form 没有最大化的时候,也没有菜单的, )奇怪吧?
      

  5.   

    我所有的窗体都需要 在Create的时候给MDI主窗口发送一个消息,告诉主窗口,有新的MDI窗体建立了,当我的MDI子窗口关闭的时候,也需要给MDI主窗口发送一个消息,告诉主窗口,有MID窗口关闭了,因为这样,所以我建立了一个basefm,在basefm的OnCreate和OnClose里面 写了Sendmessage.BTW:为什么要这样做?因为为的主窗口是BCB编的,如果在不关闭Delphi编的DLL里面的FORM,而直接关闭主窗口会出现错误,必须把所有的子窗口都关闭后,才能关闭主窗口
      

  6.   

    我测试没有问题:
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;
      TFormBase = class(TForm1)
      public
        constructor Create(AOwner: TComponent); override;
      end;
      TFormChild = class(TFormBase)
      public
        constructor Create(AOwner: TComponent); override;
      end;var
      Form1: TForm1;implementation{$R *.dfm}{ TFormBase }constructor TFormBase.Create(AOwner: TComponent);
    begin
      inherited;
      Application.MessageBox('主', '');
    end;{ TFormChild }constructor TFormChild.Create(AOwner: TComponent);
    begin
      inherited;
      Application.MessageBox('子', '');
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      fc: TFormChild;
    begin
      fc := TFormChild.Create(nil);
      fc.ShowModal;
      fc.Free;
    end;end.
      

  7.   

    constructor TFormChild.Create(AOwner: TComponent);这个是什么意思?我的这里是:
    procedure TfmBase.FormCreate(Sender: TObject);
      

  8.   

    我猜想是OldCreateOrder的原因,你看一下这篇文章,看看是不是:
    http://blog.csdn.net/linzhengqun/archive/2005/10/01/493746.aspx
      

  9.   

    “如果在不关闭Delphi编的DLL里面的FORM,而直接关闭主窗口会出现错误,必须把所有的子窗口都关闭后,才能关闭主窗口”
    难道不能在主窗体退出时向所有子窗体发送消息么?
      

  10.   

    就是 啊 ,就是在窗体退出的时候要给所有的子窗口发送消息,但是,DLL里面的form在产生后,主程序没有办法知道哪些子窗口产生了,必须记录产生窗口的句柄,怎么记录句柄,必须在DLL里面函数,当子窗口产生的时候,给主程序发一个消息,然后在子窗口关闭的时候,给主窗口发送一个消息,当主窗口关闭的时候,检查有哪些子窗口没有关闭,就给这些子窗口发送关闭消息,当所有子窗口关闭后,主程序就可以关闭了所以,在所有的子窗口的创建和关闭的时候,都必须给主窗口发送消息,所以,写一个basefm来完成这个工作,继承的窗体就不用写了