我的Delphi应用程序完成初始化后,应该在哪里放置代码?

我的Delphi应用程序完成初始化后,应该在哪里放置代码?

问题描述:

我有我想要执行的功能,我的应用程序完成初始化后,主窗体已创建。我确实有OnShow事件中的代码(称为ProcedureX),但我刚刚注意到它被调用了两次,因为OnShow发射两次。它激发当主程序调用DPR:我的Delphi应用程序完成初始化后,应该在哪里放置代码?

Application.CreateForm(TMainForm, MainForm) ; 

为我所期望的。但在那之后,当我从包括屏幕上的位置的形式INI文件阅读的东西,我有一个电话:

MainForm.position := poScreenCenter ; 

这样,它会再次出现火灾OnShow中的事件。

我在哪里可以将我的调用放到ProcedureX中,该调用只能调用一次,哪个需要主表单才能执行?

第一次调用过程后,您可以测试并设置一个标志。像这样:

type 
    TForm1 = class(TForm) 
    procedure FormShow(Sender: TObject); 
    private 
    FRunOnce: Boolean; 
    public 
    [...] 

[...] 

procedure TForm1.FormShow(Sender: TObject); 
begin 
    if not FRunOnce then begin 
    FRunOnce := True; 
    ProcedureX; 
    end; 
end; 
+0

我按照约定 “与A F前缀田”,所以FRunOnce听起来更加规范我。不是一个规则,只是一个约定,就像使用T的前缀类名称一样。只是让其他代码更容易阅读。 – jachguate 2010-09-24 01:52:14

+0

@jachguate - 当有'F'时,我觉得它应该有一个getter/setter。但那么这是我的问题,我猜...编辑答案,谢谢指出。 – 2010-09-24 02:10:22

+0

好的,我曾想过这样做,但似乎是在治疗症状,而不是原因。我想我正在寻找其他一些事件(比如“OnEverythingFinished”),它只被解雇了一次。我所听到的是没有!谢谢你的帮助。 FRunOnce就是这样。 – rossmcm 2010-09-24 02:26:13

执行对表单的正常秩序是:

  • AfterConstruction:当表格并分量与其所有属性完全创建。
  • OnShow:每当表是准备好展示(是的,造成的任何变化CM_SHOWINGCHANGED可以触发一个OnShow
  • Activate:每当表把焦点

所以,这取决于你需要在ProcedureX中,AfterConstruction可能就足够了,而且只执行一次;只需覆盖它并在inherited之后添加ProcedureX。 将会在OnCreate之后。

如果不是这种情况,您可以从AfterConstruction向您的表单发布自定义消息,它将排队并在处理完其他消息后到达您的自定义处理程序。

在这两种情况下,您都不需要额外的布尔型字段。

+0

那么使用OnCreate呢? – rossmcm 2010-09-24 03:37:16

+0

这可能是好的。但是AfterConstruction允许在OnCreate中的任何东西之后始终执行ProcedureX ... – 2010-09-24 07:31:12

如果您的代码只需要为每个表单创建(或每个应用程序运行一次,并且该表单仅在每次应用程序运行时创建一次),请将代码放置在表单的OnCreate处理程序中。这是它自然去的地方。

现在(因为D3我认为)OnCreate在AfterConstruction方法的施工过程结束时触发。只有当您将OldCreateOrder设置为True(并且默认情况下它为False)时,您可能会遇到麻烦,因为这会使OnCreate在Create构造函数的末尾触发。

@Sertac,

真的不需要FRUNOnce字段;只需执行OnShow = NIL作为FormShow方法的第一行。如果在事件处理程序的第一行中将事件处理程序字段设置为NIL,那么对于一旦表单完全运行时获得一些代码并运行起来也非常有用初始化。把你的代码放在FormActivate方法中,并且作为方法的第一行,设置OnActivate = NIL。

+4

只有在事件处理程序中没有别的事情时才可能执行。但是,如果你在处理程序中有你想要它运行的代码,只要你f.i.取消隐藏你的表单,你不能让处理程序无效。 – 2010-09-24 19:30:19

@Sertec,

您的代码将无法正常工作或者如果你想为每个取消隐藏事件中运行(你还没有把任何代码重置frunonce场)。

所以你的方法需要重置frunonce字段,我的需要设置OnShow = FormShow。相同的区别,除了你需要一个额外的领域。

+0

如果我将重置国旗为什么我会拥有它?例如:我必须在表单首次显示后在'OnShow'上运行程序'ShowJustOnce'。每次用户重新展示表单时,都必须在'OnShow'上运行'UpdateInfo'。因为'UpdateInfo'不能运行,所以我不能处理这个处理程序。我必须使用该标志,否则每次重新显示表单时都会运行“ShowJustOnce”。 – 2010-09-27 16:29:51

+0

如果您在FormSHow中需要一些运行一次的代码并且运行多次,那么是的,您需要一个标志。这与我们两个人都在回答的问题并不完全相关,这只是“我怎么才能让我的表单在初始显示时执行一次。” 因此,再次...把它放在FormActivate方法中,并且,作为方法的第一行,放置“OnActivate:= NIL;”。 如果您希望在每次显示表单时运行内容,并且每次实际可见性更改时只运行一次,那么这是一个不同的问题。 – 2010-09-27 18:44:03

+1

这是相关的,这不是一个不同的问题。我不会建议任何人去删除他的事件处理程序,因为我不知道是否有代码已经存在或不存在,并且也不会在未来...就像'OnShow'一样,人们也可以在'OnActivate'中使用代码。例如,我有**代码,它重新显示先前隐藏在“OnDeactivate”上的表单。如果我没有'OnActivate',你会在哪里建议我再次展示他们? – 2010-09-27 20:22:02

您可以在Application.CreateForm后的DPR文件中添加一个过程。 将所有需要在该过程中初始化的代码。 当您在应用中使用多个表单时效果最佳。

此外,如果初始化需要很多,它让程序在屏幕上显示窗体,以便用户知道该应用程序正在加载。

例子:

PROGRAM MyProgram; 
begin 
    Application.Initialize; 
    Application.CreateForm(TMyForm, MyForm); 
    MyForm.Show; 

    LateInitialize;  <----------- here 

    Application.Run; 
end.