Delphi XE5 - 等待TForm.OnCreate()完成组件的填充

时间:2014-02-20 15:00:38

标签: delphi firemonkey delphi-xe5 firemonkey-fm3

我想检查Form1.OnCreate事件处理程序过程,如果Form1构造函数Create已完成作业,并填充Form1上的所有组件。 然后想使用Form1循环遍历组件并更改Text属性。 我试过了:

WHILE NOT Assigned(Form1) DO 
  Sleep(100); 

......但它没有用。

现在,当我尝试使用Form1时,出现访问冲突错误。

2 个答案:

答案 0 :(得分:5)

这个答案解决了我认为真正的问题,从你的评论中可以看出这一点。您应该编辑问题以包含目前仅在评论中显示的详细信息。

每当创建表单时,您似乎都在尝试运行过程。正如我上面所解释的那样,在主线程中等待没有好处。你正在等待的东西也在主线程中运行。你会永远阻止。

因此,我不会试图解释如何等待,因为这样做永远不会奏效。这不是解决您真正问题的方法。

根据您最近的问题,我了解您的问题,您正尝试在所述表单的构造函数中访问Application.MainForm,并且MainForm属性尚未初始化。这样做的原因是你想要遍历Application拥有的所有组件。

或者您想在创建表单期间使用Form1变量nil。但是建议你删除那个全局Form1变量。全局变量往往会带来麻烦。由于您位于表单的方法内,因此在OnCreate的方法处理程序中,您可以使用Self访问表单。如果可以,请始终使用Self

但无论如何,这是解决问题的错误方法。它否认程序启动后创建的表单的存在。在创建任何表单时,您应该根据需要执行所需操作。

这就是我解决问题的方法:

  1. 声明一个派生自TForm的新表单,例如TMyBaseForm
  2. 使用AfterConstruction指令添加override过程。
  3. 实施TMyBaseForm.AfterConstruction以调用您的文字更改代码。此时,所有设计时控制都存在并且具有流式传输的属性。
  4. 确保应用中的所有表单都来自TMyBaseForm
  5. 此设计使您有机会在程序中的所有GUI元素上应用一致的行为。

    最后一条评论。你似乎是相对缺乏经验和新手。那没关系,我们曾经都在那里。但是,如果您询问有关问题的问题而不是提出的解决方案,您将会更成功。

答案 1 :(得分:5)

在构造Form对象结束时触发OnCreate事件。在触发OnCreate事件之前,在构造过程中创建表单的组件。没有必要“检查..如果Form1构造函数创建完成作业”,因为基本上保证。触发OnCreate后,即可访问组件。

如果在程序启动时通过Form1创建了TApplication.CreateForm()对象,那么在调用构造函数之前,Form1变量将被赋予一个有效但未初始化的对象,因此将指向OnCreate事件中的有效对象。

如果通过在代码中调用其构造函数来创建Form1对象,则在构造函数退出之前不会分配Form1变量,因此不会指向该对象中的有效对象。 OnCreate事件。

无论哪种方式,您都不应该使用Form1事件中的OnCreate变量来开始Form1对象。请改用Self指针,或者对事件的Sender参数进行类型转换。两者都将指向创建的同一Form1对象。