本人在调试一个系统时遇到一个奇怪的问题,编译通过,但是在运行时出错,经过断点跟踪,发现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
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
inherited Create(AOwner, AMoudleName);就是调用父类的 TBaseFormDataNavChild.FormCreate(Sender: TObject);在这里inherited;执行父类的 Create; 再执行 8 CreatePopMenu;
然后就是你的2,3,4,5,6
构造函数和OnCreate同时使用有点儿混乱!
其实没那个必要!
代码集中放在其中任何一个都可以实现你想要的功能!
1.constructor Create一般是写类的时候才需要继承写的,最好不要调用元件,因为有可能元件还没创建。
2. 你可以在FormCreate中调用元件的属性,为其赋值,因为这个时候所有的元件均已创建完成。楼主自己跟踪一下FormCreate的执行时机就知道了。
你的理解不对,inherited Create(AOwner, AMoudleName)是执行父类的FormCreate,而不是执行本身的FormCreate,执行完父类的FormCreate,应该接着往下执行,然后再执行本身的FormCreate
对,在父类的FormCreate中,有这样的代码:inherited Create(AOwner, AMoudleName);
兄弟,你真行,你牛!高手就是不同,一言点中要害。果真是这个属性的原因,但是为什么相同的源代码拷贝到我电脑打开就是TRUE,在别人的电脑打开就是FALSE呢?