我创建了该对象的替代品TApplication
。
除其他功能(内存和 GUI 日志记录、将 GUI 状态保存到磁盘、单例实例、用户/应用程序路径相关实用程序等)外,它还实现了一个可以正确初始化 GUI 的地方(不再滥用 OnFormCreate!)通过PostMessage(MForm.Handle, MSG_LateFormInit)
应用程序发送到主窗体的已发布窗口消息。
但是,我发现了一个问题:如果我TrySetStyle()
在使主窗体可见之前调用,我的消息就会丢失。
我相信这是因为TrySetStyle()
内部重新创建了表单,这可能会影响消息循环(MSG_LateFormInit
消息丢失或未按预期发送?)。
DPR 如下所示:
program Stuff;
begin
AppData:= TAppData.Create('My App Name');
AppData.CreateMainForm(TMainForm, MainForm, False {Not visible}); // This calls PostMessage
// Warning:
// Don't call TrySetStyle until the main form is visible.
// Solution: Make the main form visible before you call TrySetStyle!
TStyleManager.TrySetStyle('Amakrits');
Application.Run;
end.
难题:
我不想将 POST 代码移到后面
TrySetStyle()
。我不想强迫用户在主窗体/DPR 中调用比必要更多的代码,因为很容易忘记这样做。到目前为止,所有代码都是独立的(嗯……窗体中有拦截消息的方法MSG_LateFormInit
,但这是可选的)。所有更改都在 DPR 中完成。我想保持这种状态。另一方面,我确实想
TrySetStyle()
在表单仍然不可见时进行调用以防止闪烁。
PS:我不知道用户是否会打电话TrySetStyle()
。这对他来说是可选的。
因此,我需要找到一种可靠的方式来 POST 和接收MSG_LateFormInit
信号,最好是在主窗体仍然不可见时。