如何判断应用程序何时在启动时完成更新 Delphi 应用程序的所有可视控件
How to tell when an application has finished updating all the visual controls of a Delphi application on startup
我的系统是 windows 10 和 Delphi 10.4。
我有几个运行良好的应用程序,只是它们在启动时看起来很丑。
主要问题是我在应用程序关闭时保存主要 window 状态,例如 window 状态、大小、位置等,然后在启动时恢复它们。
我从 ini 文件恢复主窗体 oncreate 事件中的主要 window 参数,在 onactivate 事件中,我从项目文件加载程序动态内容。
加载项目文件可能需要 10 秒左右,但与此同时,window 已缩放到最终大小(即最大化),但所有主要表单可视化组件仍处于设计阶段尺码。
加载项目文件后一切都会自行解决,只是在启动过程中看起来很难看。
在加载项目文件之前,我尝试了 application.processmessages、更新、刷新等各种组合,但在 onactivate 事件中没有任何效果。
奇怪的是,我尝试打印屏幕,这样我就可以 post 一张效果图片,但生成的图片看起来不错,所以我猜它是在应用程序启动期间图形管道中的某些东西。
是否有在 mainwindow 完成所有处理后触发的事件,以便我可以开始动态内容加载?
这是我在评论中描述的代码示例:
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.
FormActivate的PostMessage中的“10”是消息被放到队列后面的次数。从值0开始,测试是否需要。
我的系统是 windows 10 和 Delphi 10.4。
我有几个运行良好的应用程序,只是它们在启动时看起来很丑。
主要问题是我在应用程序关闭时保存主要 window 状态,例如 window 状态、大小、位置等,然后在启动时恢复它们。
我从 ini 文件恢复主窗体 oncreate 事件中的主要 window 参数,在 onactivate 事件中,我从项目文件加载程序动态内容。
加载项目文件可能需要 10 秒左右,但与此同时,window 已缩放到最终大小(即最大化),但所有主要表单可视化组件仍处于设计阶段尺码。
加载项目文件后一切都会自行解决,只是在启动过程中看起来很难看。
在加载项目文件之前,我尝试了 application.processmessages、更新、刷新等各种组合,但在 onactivate 事件中没有任何效果。
奇怪的是,我尝试打印屏幕,这样我就可以 post 一张效果图片,但生成的图片看起来不错,所以我猜它是在应用程序启动期间图形管道中的某些东西。
是否有在 mainwindow 完成所有处理后触发的事件,以便我可以开始动态内容加载?
这是我在评论中描述的代码示例:
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.
FormActivate的PostMessage中的“10”是消息被放到队列后面的次数。从值0开始,测试是否需要。