我创建了
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.
难题:
我不想在
TrySetStyle()
之后移动POST代码。我不想强迫用户在其主表单/DPR 中调用不必要的代码,因为很容易忘记这样做。到目前为止,所有代码都是独立的(嗯......表单中有一个方法可以拦截 MSG_LateFormInit
消息,但这是可选的)。所有更改均在 DPR 中完成。我想保持这样。
另一方面,我确实想在表单仍然不可见时调用
TrySetStyle()
以防止闪烁。
PS:不知道用户会不会打电话给
TrySetStyle()
。这对他来说是可选的。
因此,我需要找到一种可靠的方法来 POST 并接收
MSG_LateFormInit
信号,最好是在主窗体仍然不可见的情况下。
一种选择是向TAppData
的隐藏窗口
发布一条消息,其中所需的表单对象位于消息的
lparam
字段中,然后为TAppData
提供一个消息处理程序,用于发送您的 MSG_LateFormInit
消息发送至指定表单。这样,您就不再受帖子发布时间和消息发送时间之间表单 HWND 变化的影响。