由于 TStyleManager.TrySetStyle

问题描述 投票:0回答:1

我创建了

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.

难题

  1. 我不想在

    TrySetStyle()
    之后移动POST代码。我不想强迫用户在其主表单/DPR 中调用不必要的代码,因为很容易忘记这样做。到目前为止,所有代码都是独立的(嗯......表单中有一个方法可以拦截
    MSG_LateFormInit
    消息,但这是可选的)。所有更改均在 DPR 中完成。我想保持这样。

  2. 另一方面,我确实想在表单仍然不可见时调用

    TrySetStyle()
    以防止闪烁。

PS:不知道用户会不会打电话给

TrySetStyle()
。这对他来说是可选的。

因此,我需要找到一种可靠的方法来 POST 并接收

MSG_LateFormInit
信号,最好是在主窗体仍然不可见的情况下。

delphi
1个回答
0
投票

一种选择是向TAppData的隐藏窗口

发布
一条消息,其中所需的表单对象位于消息的
lparam
字段中,然后为
TAppData
提供一个消息处理程序,用于发送您的
 MSG_LateFormInit
消息发送至指定表单。这样,您就不再受帖子发布时间和消息发送时间之间表单 HWND 变化的影响。

© www.soinside.com 2019 - 2024. All rights reserved.