窗体的构造函数和创建事件和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呢,找不出原因,大概是读取窗体资源文件时作了些什么处理吧。
分享到:
相关推荐
1. **初始化子窗体的位置**:在子窗体类的构造函数中,可以通过SetWindowPos函数来设置初始位置。这个函数允许我们指定窗口的大小、位置以及与其他窗口的关系。例如: ```cpp SetWindowPos(NULL, 0, 0, 500, 300, ...
当创建子窗体时,可以将参数作为构造函数的一部分传递给子窗体。这样,子窗体在初始化时就能获得必要的信息。例如: ```delphi var SubForm: TSubForm; begin SubForm := TSubForm.Create(Self); SubForm....
2. 构造函数:初始化浮动窗体的基本设置,例如窗口风格、初始位置和大小。 3. OnCreate()函数:设置对话框资源,初始化控件,并完成其他自定义设置。 4. 窗口消息处理:重载消息映射函数,处理如WM_LBUTTONDOWN、...
在类的实现文件中,你需要编写构造函数、析构函数以及之前声明的消息处理函数。例如: ```cpp CMyCustomForm::CMyCustomForm() { // 控件初始化代码 } CMyCustomForm::~CMyCustomForm() { } void ...
在这些类的构造函数和OnCreate方法中,我们可以设置窗口的初始状态,如初始隐藏或可见。 在描述中提到的文件,如autohide.cpp、MainFrm.cpp、autohideView.cpp等,分别对应着类的实现文件。例如,autohide.cpp可能...
窗体的创建通常在运行时完成,可以通过Form的构造函数来实例化,并可以通过Show方法显示。同时,窗体还可以作为其他组件的容器,允许开发者在窗体上布局和组织各种控件。 在实际编程中,理解并熟练运用VCL组件的...
首先,调用CPaintDC类的构造函数获取一个设备上下文(Device Context,DC),它是Windows图形操作的基础。 - 使用CPaintDC的BeginPaint()和EndPaint()函数,确保正确的绘画过程。 - 创建一个CBrush对象,表示画刷...
- 要设置固定的分割线,可以在`CSplitterWnd`的构造函数中设置分割线的样式。使用`m_nRowFixed`和`m_nColFixed`成员变量来固定行数和列数,设置为非零值表示该行或列的大小不可改变。 - 另外,也可以在`...
2. 启动Activity:使用Intent的构造函数,指定要启动的Activity类和传递的数据,然后调用startActivity()或startActivityForResult()方法。 3. 数据传递:Intent支持两种数据传递方式,通过putExtra()添加额外数据...
9. 使用C++的构造函数和析构函数代替OnCreate和OnDestroy事件。 10. 使用new代替Application->CreateForm来创建窗体。 **C++语言使用建议** 在C++语言的使用中,文档提出了以下建议: 1. 不要将operator new[]和...
为了动态地在界面上添加CheckBox,你需要在窗体的`OnCreate`事件处理程序中执行创建和布局的代码。这样,每次打开窗体时,CheckBox都会被重新创建。 载入CheckBox的状态,比如是否被选中,通常涉及到文件读写操作。...
4. **定时器设置**:为了控制动画的播放,创建一个Ctimer对象,并在构造函数或OnCreate()方法中启动定时器。定时器回调函数(通常由ON_WM_TIMER()消息处理程序触发)负责切换到下一帧,并更新标题栏的绘制。 5. **...
`new`和`malloc`都是用来动态分配内存的,但`new`是C++运算符,会调用构造函数初始化对象,而`delete`会调用析构函数。`malloc`和`free`是C语言标准库函数,不涉及对象的构造和析构。因此,使用`new`和`delete`更...
使用`unsigned long`类型的构造函数来创建`AnsiString`对象可能会导致意料之外的行为,因为字符数据和数值数据之间存在类型不匹配。正确的做法是使用字符数组或`const char*`来初始化`AnsiString`。 #### 1.3 避免...
3. **初始化WebBrowser控件**:在OnCreate事件或构造函数中,设置WebBrowser控件的属性,例如,可以禁用工具栏和菜单,使其看起来更像嵌入式浏览器: ```delphi WebBrowser1.Align := alClient; // 设置控件填满...
**步骤3:** 具体代码实现中,需要在主窗口的构造函数中添加启动窗口的头文件,然后创建启动窗口的对象。在主窗口的`OnCreate`事件中,显示启动窗口,并在一定时间后关闭它,从而避免阻塞主线程。 **优点:** 不会...
在类的构造函数中,我们设置了一些关键属性,包括命令的分类、标题、消息提示以及鼠标悬停提示。同时,我们加载了命令的图标,这通常是一个位图资源,需要与类名关联。 `OnCreate`方法在命令实例化时被调用。在这里...