为什么我的TFrame不能“看到”已发布的消息?

| 我最近才开始大量使用TFrames(好吧,是的,我一直生活在一块石头下……)。我认为框架支持消息处理程序方法声明-并且我已经看到了许多示例。那么,为什么这个简单的TFrame测试单元却永远看不到它发布的消息呢? (当我发现较大的应用程序中未调用消息处理程序时,我创建了测试。)
unit JunkFrame;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

const
  DO_FORM_INITS = WM_USER + 99;

type
  TFrame1 = class(TFrame)
    Panel1: TPanel;
  private
    procedure DoFormInits(var Msg: TMessage); message DO_FORM_INITS;
  public
    constructor Create(AOwner: TComponent); override;
  end;

implementation

{$R *.dfm}

constructor TFrame1.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  PostMessage(self.Handle, DO_FORM_INITS, 0, 0);
end;

procedure TFrame1.DoFormInits(var Msg: TMessage);
begin
  ShowMessage(\'In DoFormInits!\');
end;

end.
该框架仅包含一个TPanel,并且该框架用于仅包含框架和“关闭”按钮的简单主窗体。 我想念什么?     
已邀请:
我看到两种可能性: 您的程序尚未开始处理消息。仅当程序分别调用
GetMessage
PeekMessage
然后
DispatchMessage
时处理已发布的消息。这发生在
Application.Run
内,因此,如果您的程序尚未到达那里,那么它将不会处理任何已发布的消息。 您框架的窗口句柄已被破坏并重新创建。访问“ 5”属性将强制创建框架的窗口句柄,但是如果框架的父窗口尚未完全稳定,则可能会破坏其自己的窗口句柄并重新创建它。这迫使它的所有子进程都执行相同的操作,因此,在程序开始处理消息时,将消息发布到的句柄不存在。 要解决第一个问题,只需等待。您的程序最终将开始处理消息。要解决第二个问题,请覆盖框架的
CreateWnd
方法,然后在此处张贴消息。在创建窗口句柄之后将调用该方法,因此避免了过早创建句柄。不过,仍然有可能销毁并重新创建该句柄,并且每次发生ѭ6都会被调用,因此您需要注意,因为初始化消息可能会多次发布(但是永不对同一个窗口多次处理)。这是否正确取决于您需要执行哪种初始化。     
我能提出的唯一解释是,在您发布消息之后并且在泵送消息队列之前,将重新创建框架的句柄。尝试在OnShow中发布。     

要回复问题请先登录注册