-4

我想从 Form1.OnCreate 事件处理程序过程中检查 Form1 构造函数 Create 是否完成了填充 Form1 上所有组件的工作。然后想使用 Form1 循环访问组件并更改 Text 属性。我努力了:

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

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

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

4

2 回答 2

5

OnCreate事件在 Form 对象的构造结束时触发。OnCreate表单的组件是在事件触发之前的构造过程中创建的。没有必要“检查……如果 Form1 构造函数创建完成了工作”,因为这基本上是有保证的。一旦OnCreate被触发,您就可以访问组件。

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

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

无论哪种方式,您都不应该在事件Form1内部使用变量作为对象的开头。请改用指针,或对事件的参数进行类型转换。两者都将指向创建的同一个对象。OnCreateForm1SelfSenderForm1

于 2014-02-20T19:45:15.473 回答
5

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

无论何时创建表单,您似乎都在尝试运行一个过程。正如我上面解释的,在主线程中等待不会有任何好处。您正在等待的东西也在主线程中运行。你只会永远封锁。

所以我不会像你问的那样解释如何等待,因为那永远行不通。这不是你真正问题的解决方案。

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

或者您想使用创建表单期间的全局Form1变量。nil但是建议您无论如何都要删除该全局Form1变量。全局变量往往会造成麻烦。由于您在表单的 a 方法中,因此在 的方法处理程序中OnCreate,您可以使用Self. Self如果可能,请始终使用。

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

这就是我将如何解决您的问题:

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

这种设计使您有机会在程序中的所有 GUI 元素上应用一致的行为。

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

于 2014-02-20T17:42:59.580 回答