如何判断一个应用程序在启动时完成了对Delphi应用程序的所有可视化控件的更新



我的系统是windows 10和Delphi 10.4。

我有几个应用程序工作得很好,只是在启动时看起来很丑。

主要的问题是,当应用程序关闭时,我保存主窗口状态,如窗口状态,大小,位置等,然后在启动时恢复它们。

我从ini文件中恢复mainform oncreate事件中的主窗口参数,在onactivate事件中,我从项目文件中加载程序动态内容。

加载项目文件可能需要10秒左右,但与此同时,窗口已经缩放到最终大小(即最大化),但所有主要的窗体视觉组件仍然保持在设计时的大小。

一旦项目文件被加载,它就会自行排序,在启动过程中它看起来太难看了。

我已经尝试了各种应用程序的组合。在加载项目文件之前处理消息,更新,刷新等,但在onactivate事件中没有任何工作

奇怪的是,我试着打印屏幕,这样我就可以发布一张效果的图片,但最终的图片看起来很好,所以我猜它在应用程序启动时在图形管道中卡住了。

是否有一个事件,在主窗口完成所有的处理后触发,所以我可以开始动态内容加载?

下面是我在注释中描述的代码示例:

unit Unit83;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs;
CONST
UM_LOADPROJECT = WM_USER+10;
type
TForm83 = class(TForm)
procedure FormActivate(Sender: TObject);
private
{ Private declarations }
procedure LoadProject(var Msg : TMsg); MESSAGE UM_LOADPROJECT;
procedure LoadProjectFile;
public
{ Public declarations }
end;
var
Form83: TForm83;
implementation
{$R *.dfm}
procedure TForm83.FormActivate(Sender: TObject);
begin
OnActivate:=NIL;
PostMessage(Handle,UM_LOADPROJECT,10,0)
end;
procedure TForm83.LoadProject(var Msg: TMsg);
begin
IF Msg.wParam>0 THEN
PostMessage(Handle,Msg.message,PRED(Msg.wParam),Msg.lParam)
ELSE
LoadProjectFile
end;
procedure TForm83.LoadProjectFile;
begin
// Do the project file load
end;
end.

"10";在FormActivate的PostMessage中,是消息被放到队列后面的次数。从0开始,测试是否有必要。

最新更新