本人在调试一个系统时遇到一个奇怪的问题,编译通过,但是在运行时出错,经过断点跟踪,发现Form中的constructor create 和Form本身的Create执行顺序乱了,如下代码段: constructor TBaseFormDataNavChild.Create(AOwner: TComponent;
  AMoudleName: string = '');
begin
1  inherited Create(AOwner, AMoudleName);
2  with lc_SalaryMainForm.dxBarListWindows do
3  begin
4     Items.AddObject(Self.Caption, Self);
5  end;
6  da := TDataAccess.Create(Self);
end;procedure TBaseFormDataNavChild.FormCreate(Sender: TObject);
begin
7  inherited;
8  CreatePopMenu;
end;在我本机调试时的执行顺序是:1,7,8,2,3,4,5,6  ,为什么会是这样?请高人指点,不胜感谢!delphi

解决方案 »

  1.   

    这个执行顺序是对的!
    inherited Create(AOwner, AMoudleName);就是调用父类的 TBaseFormDataNavChild.FormCreate(Sender: TObject);在这里inherited;执行父类的 Create; 再执行 8  CreatePopMenu;
     然后就是你的2,3,4,5,6
      

  2.   

    楼上正解!
    构造函数和OnCreate同时使用有点儿混乱!
    其实没那个必要!
    代码集中放在其中任何一个都可以实现你想要的功能!
      

  3.   

    inherited Create(AOwner, AMoudleName);这个会调用父类的create
      

  4.   

    执行顺序是OK的。楼主自己有点乱
    1.constructor Create一般是写类的时候才需要继承写的,最好不要调用元件,因为有可能元件还没创建。
    2. 你可以在FormCreate中调用元件的属性,为其赋值,因为这个时候所有的元件均已创建完成。楼主自己跟踪一下FormCreate的执行时机就知道了。
      

  5.   


    你的理解不对,inherited Create(AOwner, AMoudleName)是执行父类的FormCreate,而不是执行本身的FormCreate,执行完父类的FormCreate,应该接着往下执行,然后再执行本身的FormCreate
      

  6.   

    constructor TBaseFormDataNavChild.Create 请楼主你这个构造函数是不是在你的的窗口定义的, inherited 然后不就是 TBaseFormDataNavChild.FormCreate 不过发现你的代码1  inherited Create(AOwner, AMoudleName);是这样写的,不知道在你的子类里面的第一个父类是否存在 Create(AOwner, AMoudleName);这样的构造函数!
      

  7.   

     昏! 终于知道你说啥了! 执行本身的FormCreate, 你还是自己执行看看把! 怎么不是执行本身的FormCreate。
      

  8.   


    对,在父类的FormCreate中,有这样的代码:inherited Create(AOwner, AMoudleName);
      

  9.   

    窗体有个属性:OldCreateOrder,你看是不是和这个有关
      

  10.   


    兄弟,你真行,你牛!高手就是不同,一言点中要害。果真是这个属性的原因,但是为什么相同的源代码拷贝到我电脑打开就是TRUE,在别人的电脑打开就是FALSE呢?