Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 什么是梅和唐';在FormCreate()中我可以做什么?_Delphi - Fatal编程技术网

Delphi 什么是梅和唐';在FormCreate()中我可以做什么?

Delphi 什么是梅和唐';在FormCreate()中我可以做什么?,delphi,Delphi,我想这一定是一个常见问题,但谷歌搜索并没有真正起到帮助作用 在FormCreate()中,我可以做什么,也可以不做什么 我想知道是否所有窗体的子控件都已完全创建并可供访问,等等 我问这个问题的原因是,我无意中发现了一个旧项目,其中我的FormCreate()只是由 Sleep(1000); PostMessage(Handle, UM_PROGRAM_START, 0, 0); 似乎我想“等一等”,然后“等事情稳定下来”再做一些初始化 当然,当时我有这样做的理由(?),但是,由于缺乏启

我想这一定是一个常见问题,但谷歌搜索并没有真正起到帮助作用

FormCreate()中,我可以做什么,也可以不做什么

我想知道是否所有窗体的子控件都已完全创建并可供访问,等等

我问这个问题的原因是,我无意中发现了一个旧项目,其中我的
FormCreate()
只是由

Sleep(1000);  
PostMessage(Handle, UM_PROGRAM_START, 0, 0);  
似乎我想“等一等”,然后“等事情稳定下来”再做一些初始化

当然,当时我有这样做的理由(?),但是,由于缺乏启发性的评论,我想不起来为什么我认为这是必要的

任何人都可以声明或引用一个链接,该链接声明了在
FormCreate()
中可以执行的操作的任何限制吗


[更新]我认为thta DavidHefferman在写“应用程序开始发送消息时找到了解决方案。当您在.dpr文件中调用application.Run时就会发生这种情况”

我想我不关心任何一种形式。例如,我的主窗体希望在启动时对我的config/options窗体执行一些操作,因此显然必须等到它被创建之后

这是我的一个项目中典型的.DPR

Application.Initialize;
Application.CreateForm(TGlobal, Global);
Application.MainFormOnTaskbar := True;
Application.CreateForm(TMainForm, MainForm);

Application.CreateForm(TLoginForm, LoginForm);
Application.CreateForm(TConfigurationForm, ConfigurationForm);

//[snip] a bunch of other forms ...

Application.Run();

因此,我的应用程序的
mainForm.CreateForm()
发送一个
UM\u APPLICATION\u START
,直到所有表单都被创建和初始化(或者,我可以调用fn(),在
APPLICATION.Run()之后从我的.DPR触发消息)调用了
;但我更喜欢这个消息,因为它更明显-我很少查看我的.DPR文件)。

没有明确的文档给出表单OnCreate中可以做和不能做的所有事情的列表

至于.dfm文件是否已被处理,表单所有的组件是否都已创建,是的

我不会太重视你找到的代码。在启动期间调用Sleep,让主线程等待,这绝对不是一种好的做法。如果代码想要等待另一个线程,它可以阻止该线程,或者等待从该线程获取消息。这看起来就像是一个不明白自己在做什么的人输入的代码。代码从未被删除

另一行代码是合理的:

PostMessage(Handle, UM_PROGRAM_START, 0, 0);

由于此消息已发布,因此在应用程序开始发送消息之前,不会对其进行处理。在.dpr文件中调用Application.Run时会发生这种情况。这意味着与主窗体创建相关的所有操作都发生在消息从队列中拉出之前。

您可以在窗体创建中执行任何操作。但是没有消息处理程序可供使用,仅此而已。通常,我会在FormCreate中创建从属对象,并在FormDestroy中释放它们。我也会尽量避免耗时的初始化例程。

我不会在FormCreate中放入太多初始化代码,而是将其放入一个单独的函数中,如

fm := TForm.Create;
fm.Init;

问题是,FormCreate()过程中抛出的异常不会重新抛出(只有一个MessageBox)。这意味着,尽管表单没有正确初始化,但您的代码仍在运行。

您所说的“没有消息处理程序”到底是什么意思?对不起,我的说法不清楚。在主窗体的FormCreate期间,应用程序的消息处理程序尚未初始化。通过询问如何使用MainForm.FormCreate初始化应用程序,我知道这个问题(“在FormCreate中做什么”)。消息泵还没有启动。但是信息是可以发布的。同步消息仍然直接发送到window proc.+1:“我知道,因为……我就是那个编码员”(向Max Bygraves致歉,这应该是我们殖民地的表亲;-)是的,我同意,我可以跳过
sleep()
(而且经常这么做),但为什么我觉得有必要调用
PostMessage()
?创建窗口时,会发送大量消息。在SendMessage中以同步方式发送。PostMessage调用一个操作,该操作将在主窗口完成所有初始化后触发。也许这就是你这么做的原因。很难100%确定。您的应用程序对该消息的响应是什么?+1您在
FormCreate()
中可能期望的所有初始化内容看看当UM\u程序启动时您会做什么,这会让您想起原因。OnCreate将在创建子组件后启动。但取决于OldCreateOrder,它将在Create或AfterConstruction内部激发。但有些控件也可以使用PostMessage来执行其最终初始化,因此不能在OnCreate事件中使用。出于这个原因,你可能会选择发布一条消息-是的,忘记睡眠:o)
Init
内容可能就是
PostMessage()
操作所调用的内容。+1 LURD Max,我猜你是从
.dpr
调用
fm.Init
?似乎类似于发送消息-有细微的区别吗?不确定异常位-是否要添加“try…”。。。除了'to your nother empty
for nmcreate
?我不喜欢事件或消息。调试它们总是比较复杂。您需要知道是谁调用了它以及它来自哪里。如果你只是调用一个函数,你就知道它在哪里被调用(当你只看源代码的时候)。。。。不确定要在Init函数中调用什么代码。当您必须访问外部资源(如DB)时,请先将其加载到单独的对象中,然后使用该对象,而不是直接访问资源。在我的例子中,我使用了一个全局TConfig单例对象,它在启动时加载数据,并且可以以所有形式访问。