覆盖 SetEnabled 与处理消息 CM_ENABLEDCHANGED

Override SetEnabled vs. handling message CM_ENABLEDCHANGED

TFrame个后代class如下:

TCustomHistoryFrame = class(TFrame)
  tbMainFunction: TToolBar;
  // there's more, of course, but that is irrelevant to the question
end;

我注意到,当我将此框架的 Enabled 属性 设置为 False 时,其组件 tbMainFunction 不会(在视觉上)被禁用。

我的第一个想法是重写虚方法TControl.SetEnabled。查看它的实现,我看到它在值实际不同时执行控制消息 CM_ENABLEDCHANGED

我不确定如何将框架的 Enabled 状态正确地应用到工具栏。
通常的做法是什么?由于这个问题主要是基于意见,所以让我重新表述一下:

覆盖SetEnabled或处理CM_ENABLEDCHANGED有什么优点和缺点?


事情,我自己想到的:

处理CM_ENABLEDCHANGED是正确的解决方案。此类 CM_... 消息专门设计用于允许后代 类 对基 类 中声明的属性的更改做出反应。

例如:

TCustomHistoryFrame = class(TFrame)
  tbMainFunction: TToolBar;
private
  procedure CMEnabledChanged(var Message: TMessage); message CM_ENABLEDCHANGED;
end;

procedure TCustomHistoryFrame.CMEnabledChanged(var Message: TMessage);
begin
  inherited;
  tbMainFunction.Enabled := Enabled;
end;

或者:

TCustomHistoryFrame = class(TFrame)
  tbMainFunction: TToolBar;
protected
  procedure WndProc(var Message: TMessage); override;
end;

procedure TCustomHistoryFrame.WndProc(var Message: TMessage);
begin
  inherited;
  if Message.Msg = CM_ENABLEDCHANGED then
    tbMainFunction.Enabled := Enabled;
end;