【问题标题】:Code not executed in TFrame.Create代码未在 TFrame.Create 中执行
【发布时间】:2014-11-20 19:14:15
【问题描述】:

我使用以下代码创建了一个以 TFrame 作为祖先的组件:

type
  TCHAdvFrame = class(TFrame)
  private
    { Private declarations }
    FOnShow : TNotifyEvent;
    FOnCreate : TNotifyEvent;
  protected
    procedure CMShowingChanged(var M: TMessage); message CM_SHOWINGCHANGED;
  public
    { Public declarations }
    constructor Create(AOwner: TComponent) ; override;
  published
    property OnShow : TNotifyEvent read FOnShow write FOnShow;
    property OnCreate : TNotifyEvent read FOnCreate write FOnCreate;
  end;

implementation

{$R *.dfm}

{ TCHAdvFrame }

procedure TCHAdvFrame.CMShowingChanged(var M: TMessage);
begin
  inherited;
  if Assigned(OnShow) then
  begin
    ShowMessage('onShow');
    OnShow(self);
  end;
end;

constructor TCHAdvFrame.Create(AOwner: TComponent);
begin
  ShowMessage('OnCreate1');
  inherited ;
  ShowMessage('OnCreate2');
  if Assigned(OnCreate) then
  begin
    ShowMessage('OnCreate3');
    OnCreate(self);
  end;

我已经注册了新组件并做了一些测试。 ShowMessage('OnCreate1');和 ShowMessage('OnCreate2');被正确执行但不是 ShowMessage('OnCreate3');

这可以防止在实现 TCHAdvFrame 的新实例期间添加代码。

为什么会这样,我该如何解决?

【问题讨论】:

    标签: delphi components


    【解决方案1】:

    帧作为其最终所有者的构造函数的一部分流入。通常这将是一个表格。表单处理 .dfm 文件。它遇到新对象并创建它们。然后它设置新创建的对象的属性。因此,框架的属性是在其构造函数返回后设置的。

    这就是TFrame 没有OnCreate 事件的原因。根本没有办法触发该事件,因为该事件被分配得太晚了。 VCL 设计者省略了这个事件,原因与你提出这个问题的原因相同。所以我怀疑你同样不应该添加这个事件。

    如何解决这个问题?除非我们对问题有更详细的描述,否则很难确定。也许您可以覆盖框架的Loaded 方法以获得良好效果。或者,您可能需要做的就是让组件的使用者覆盖其派生框架中的构造函数。

    相关阅读:http://delphi.about.com/od/delphitips2007/qt/tframe_oncreate.htm

    【讨论】:

    • 在派生帧中覆盖构造函数听起来是我的最佳选择。
    • 或者您可以覆盖与OnCreate 事件几乎相同的AfterConstruction
    猜你喜欢
    • 2018-12-21
    • 1970-01-01
    • 2012-12-09
    • 2014-06-29
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    相关资源
    最近更新 更多