为什么我的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,并且该框架用于仅包含框架和“关闭”按钮的简单主窗体。
我想念什么?
没有找到相关结果
已邀请:
2 个回复
粱委教
或
然后
时处理已发布的消息。这发生在
内,因此,如果您的程序尚未到达那里,那么它将不会处理任何已发布的消息。 您框架的窗口句柄已被破坏并重新创建。访问“ 5”属性将强制创建框架的窗口句柄,但是如果框架的父窗口尚未完全稳定,则可能会破坏其自己的窗口句柄并重新创建它。这迫使它的所有子进程都执行相同的操作,因此,在程序开始处理消息时,将消息发布到的句柄不存在。 要解决第一个问题,只需等待。您的程序最终将开始处理消息。要解决第二个问题,请覆盖框架的
方法,然后在此处张贴消息。在创建窗口句柄之后将调用该方法,因此避免了过早创建句柄。不过,仍然有可能销毁并重新创建该句柄,并且每次发生ѭ6都会被调用,因此您需要注意,因为初始化消息可能会多次发布(但是永不对同一个窗口多次处理)。这是否正确取决于您需要执行哪种初始化。
钨蜡唤喉晤