我想从 Form1.OnCreate 事件处理程序过程中检查 Form1 构造函数 Create 是否完成了填充 Form1 上所有组件的工作。然后想使用 Form1 循环访问组件并更改 Text 属性。我努力了:
WHILE NOT Assigned(Form1) DO
Sleep(100);
......但它没有用。
现在,当我尝试使用 Form1 时,出现访问冲突错误。
我想从 Form1.OnCreate 事件处理程序过程中检查 Form1 构造函数 Create 是否完成了填充 Form1 上所有组件的工作。然后想使用 Form1 循环访问组件并更改 Text 属性。我努力了:
WHILE NOT Assigned(Form1) DO
Sleep(100);
......但它没有用。
现在,当我尝试使用 Form1 时,出现访问冲突错误。
该OnCreate
事件在 Form 对象的构造结束时触发。OnCreate
表单的组件是在事件触发之前的构造过程中创建的。没有必要“检查……如果 Form1 构造函数创建完成了工作”,因为这基本上是有保证的。一旦OnCreate
被触发,您就可以访问组件。
如果您的Form1
对象是通过TApplication.CreateForm()
在程序启动时创建的,那么在Form1
调用构造函数之前将为该变量分配一个有效但未初始化的对象,因此将指向OnCreate
事件中的一个有效对象。
如果您的Form1
对象是通过在代码中调用其构造函数来创建的,那么在Form1
构造函数退出之前不会分配该变量,因此不会指向OnCreate
事件中的有效对象。
无论哪种方式,您都不应该在事件Form1
内部使用变量作为对象的开头。请改用指针,或对事件的参数进行类型转换。两者都将指向创建的同一个对象。OnCreate
Form1
Self
Sender
Form1
从您的评论中可以看出,这个答案解决了我认为真正的问题。您应该编辑问题以包含目前仅出现在评论中的那些详细信息。
无论何时创建表单,您似乎都在尝试运行一个过程。正如我上面解释的,在主线程中等待不会有任何好处。您正在等待的东西也在主线程中运行。你只会永远封锁。
所以我不会像你问的那样解释如何等待,因为那永远行不通。这不是你真正问题的解决方案。
据我了解您的问题,根据您最近的问题,您正试图Application.MainForm
在所述表单的构造函数中访问,并且该MainForm
属性尚未初始化。您这样做的原因是因为您想遍历Application
.
或者您想使用创建表单期间的全局Form1
变量。nil
但是建议您无论如何都要删除该全局Form1
变量。全局变量往往会造成麻烦。由于您在表单的 a 方法中,因此在 的方法处理程序中OnCreate
,您可以使用Self
. Self
如果可能,请始终使用。
但无论如何,这是解决问题的错误方法。它否认在您的程序启动后创建的表单的存在。当创建任何表单时,您应该按需执行您需要执行的操作。
这就是我将如何解决您的问题:
TForm
,称为,例如,TMyBaseForm
。AfterConstruction
过程。override
TMyBaseForm.AfterConstruction
以调用您的文本更改代码。此时所有设计时控件都存在并且具有流式传输的属性。TMyBaseForm
.这种设计使您有机会在程序中的所有 GUI 元素上应用一致的行为。
最后一条评论。你似乎相对缺乏经验和新手。没关系,我们都去过一次。但是,如果您提出有关您的问题而不是您提出的解决方案的问题,您会更成功。