高人请进来

linweihua77 2013-05-28 08:55:10
本人在调试一个系统时遇到一个奇怪的问题,编译通过,但是在运行时出错,经过断点跟踪,发现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 ,为什么会是这样?请高人指点,不胜感谢!
...全文
160 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
linweihua77 2013-05-28
  • 打赏
  • 举报
回复
引用 8 楼 xhz8000 的回复:
constructor TBaseFormDataNavChild.Create 请楼主你这个构造函数是不是 在你的的窗口定义的, inherited 然后不就是 TBaseFormDataNavChild.FormCreate 不过发现你的代码1 inherited Create(AOwner, AMoudleName); 是这样写的,不知道在你的子类里面的第一个父类是否存在 Create(AOwner, AMoudleName); 这样的构造函数!
对,在父类的FormCreate中,有这样的代码:inherited Create(AOwner, AMoudleName);
xhz8000 2013-05-28
  • 打赏
  • 举报
回复
昏! 终于知道你说啥了! 执行本身的FormCreate, 你还是自己执行看看把! 怎么不是执行本身的FormCreate。
xhz8000 2013-05-28
  • 打赏
  • 举报
回复
constructor TBaseFormDataNavChild.Create 请楼主你这个构造函数是不是 在你的的窗口定义的, inherited 然后不就是 TBaseFormDataNavChild.FormCreate 不过发现你的代码1 inherited Create(AOwner, AMoudleName); 是这样写的,不知道在你的子类里面的第一个父类是否存在 Create(AOwner, AMoudleName); 这样的构造函数!
linweihua77 2013-05-28
  • 打赏
  • 举报
回复
引用 1 楼 xhz8000 的回复:
这个执行顺序是对的! inherited Create(AOwner, AMoudleName); 就是调用父类的 TBaseFormDataNavChild.FormCreate(Sender: TObject); 在这里inherited;执行父类的 Create; 再执行 8 CreatePopMenu; 然后就是你的2,3,4,5,6
你的理解不对,inherited Create(AOwner, AMoudleName)是执行父类的FormCreate,而不是执行本身的FormCreate,执行完父类的FormCreate,应该接着往下执行,然后再执行本身的FormCreate
linweihua77 2013-05-28
  • 打赏
  • 举报
回复
执行顺序肯定是错误的! 这个系统用了好多年了,只是最近要修改,在我本机编译后才出现错误,然后我到同事的电脑去调试,编译后运行正常!
linweihua77 2013-05-28
  • 打赏
  • 举报
回复
这个系统用了好多年了,只是最近要修改,在我本机编译后才出现错误,然后我到同事的电脑去调试,发现执行顺序是:1,2,3,4,5,6,7,8 ,我认为正确的顺序就是:1,2,3,4,5,6,7,8
火龙岛主 2013-05-28
  • 打赏
  • 举报
回复
执行顺序是OK的。 楼主自己有点乱 1.constructor Create一般是写类的时候才需要继承写的,最好不要调用元件,因为有可能元件还没创建。 2. 你可以在FormCreate中调用元件的属性,为其赋值,因为这个时候所有的元件均已创建完成。 楼主自己跟踪一下FormCreate的执行时机就知道了。
bdmh 2013-05-28
  • 打赏
  • 举报
回复
inherited Create(AOwner, AMoudleName);这个会调用父类的create
酣酣 2013-05-28
  • 打赏
  • 举报
回复
楼上正解! 构造函数和OnCreate同时使用有点儿混乱! 其实没那个必要! 代码集中放在其中任何一个都可以实现你想要的功能!
xhz8000 2013-05-28
  • 打赏
  • 举报
回复
这个执行顺序是对的! inherited Create(AOwner, AMoudleName); 就是调用父类的 TBaseFormDataNavChild.FormCreate(Sender: TObject); 在这里inherited;执行父类的 Create; 再执行 8 CreatePopMenu; 然后就是你的2,3,4,5,6
linweihua77 2013-05-28
  • 打赏
  • 举报
回复
引用 11 楼 ysai 的回复:
窗体有个属性:OldCreateOrder,你看是不是和这个有关
兄弟,你真行,你牛!高手就是不同,一言点中要害。果真是这个属性的原因,但是为什么相同的源代码拷贝到我电脑打开就是TRUE,在别人的电脑打开就是FALSE呢?
ysai 2013-05-28
  • 打赏
  • 举报
回复
窗体有个属性:OldCreateOrder,你看是不是和这个有关

5,402

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧