delphi – 为什么我的TFrame没有“看到”发布的消息?

前端之家收集整理的这篇文章主要介绍了delphi – 为什么我的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);
end;

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

end.

此框架仅包含TPanel,框架用于仅包含框架和关闭按钮的简单主文件.

我错过了什么?

解决方法

我看到两种可能性:

>您的程序尚未开始处理消息.只有当您的程序调用GetMessage或PeekMessage,然后调用DispatchMessage时,才会处理已发布的消息.这发生在Application.Run中,所以如果你的程序还没有到达那里,那么它将不会处理任何发布的消息.
>您的框架的窗口句柄已被破坏并重新创建.访问Handle属性会强制创建框架的窗口句柄,但如果框架的父框架尚未完全稳定,则可能会破坏其自己的窗口句柄并重新创建它.这会强制所有子项执行相同的操作,因此在程序开始处理消息时,您发布消息的句柄不存在.

解决第一个问题,请等待.您的程序最终将开始处理消息.要解决第二个问题,请覆盖框架的CreateWnd方法并在那里发布消息.在创建窗口句柄后调用方法,因此可以避免强制过早创建句柄.但是,仍然可以销毁和重新创建句柄,并且每次发生时都会调用CreateWnd,因此您需要小心,因为初始化消息可能会多次发布(但从不相同)窗口句柄多次).这是否正确取决于您需要做什么样的初始化.

猜你在找的Delphi相关文章