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