zoukankan      html  css  js  c++  java
  • 窗体的构造函数和OldCreateOrder属性有很大的关系

    如果OldCreateOrder为False,则OnCreate将在所有构造函数执行完之后才执行。如果OldCreateOrder为True,则OnCreate在TCustomForm的构造函数执行完就执行。

    窗体的构造函数和创建事件和OldCreateOrder属性有很大的关系。

    情况1:

    如果窗体继承自TForm,且有如下形式:

    1.      constructor TForm1.Create(AOwner: TComponent);
    2.      begin
    3.        inherited;
    4.        Button1.Caption := '1';
    5.      end;
    6.    
    7.      procedure TForm1.FormCreate(Sender: TObject);
    8.      begin
    9.        Button1.Caption := '2';
    10.  end;

    此时,设Tform1的OldCreateOrder(默认就是为False)属性为False,则执行顺序是3-4-9行。

    如果设OldCreateOrder为True,则执行顺序为3-9-4,即先执行inherited然后执行Button1.Caption := '2'再执行Button1.Caption := '1'。

    看帮助,解释是如果OldCreateOrder为False,则OnCreate将在所有构造函数执行完之后才执行。如果OldCreateOrder为True,则OnCreate在TCustomForm的构造函数执行完就执行。

    这 样就很容易理解上面的执行顺序了,OldCreateOrder为True时,执行到第3行时,便会调用TCustomForm的Create函数,该函 数执行完后就调用OnCreate了,当然也就执行了第9行,最后才回来执行第4行。而OldCreateOrder为False时则等所有构造函数执行 才调用onCreate事件。

     

    为什么有这样的行为呢,还是看源代码:

    事实上OnCreate会在两处地方被调用,一是TCustomForm的Create函数,一是AfterConstructor函数。

    在TCustomForm的Create函数中,是这样的:

    if OldCreateOrder then DoCreate;

    在AfterConstruction函数中,是这样的:

    if not OldCreateOrder then DoCreate;

    这样就一清二楚了,同时也了解了AfterConstruction的执行时机,即所有的构造函数执行完毕后才由编译器调用。

    情况2:

    如果窗口继承自一个已经存在的窗口类比如TForm1,同时有像下面这样的代码:

    1.      constructor TForm2.Create(AOwner: TComponent);
    2.      begin
    3.        inherited;
    4.        Button1.Caption := '1';
    5.      end;
    6.  
    7.      procedure TForm2.FormCreate(Sender: TObject);
    8.      begin
    9.        Button1.Caption := '2';
    10.  end;

    无论怎么设OldCreateOrder,都只是执行3-9-4,原因就是最后OldCreateOrder都是等于True。为什么会一直等于True呢,找不出原因,大概是读取窗体资源文件时作了些什么处理吧。


  • 相关阅读:
    java虚拟机8:内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别
    java虚拟机7:垃圾收集器 基于回收算法理论的实现
    java虚拟机5:垃圾回收算法
    java虚拟机1:JVM内存结构
    java虚拟机2:hotspot 对象探究
    java虚拟机4:jvm GC机制回收 判断对象生死 及 方法区永久代回收条件
    java虚拟机3:jvm OutOfMemoryError
    java虚拟机6:hotspot 的算法实现
    JVM调优总结 -Xms -Xmx -Xmn -Xss
    CSS3弹性盒子align-items属性之center垂直居中
  • 原文地址:https://www.cnblogs.com/luckForever/p/7255089.html
Copyright © 2011-2022 走看看