gpt4 book ai didi

delphi - 覆盖 SetEnabled 与处理消息 CM_ENABLEDCHANGED

转载 作者:行者123 更新时间:2023-12-03 15:49:42 27 4
gpt4 key购买 nike

有一个 TFrame 后代类,如下所示:

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 有哪些优点和缺点?

<小时/>

事情,我想到了自己:

  • 覆盖SetEnabled:
    • 我必须重新检查新值是否与旧值不同。那将是一种冗余。 (这对性能没有重大影响,但是 - 叫我吹毛求疵 - 对我来说有点味道。)
  • 处理CM_ENABLEDCHANGED:
    • 如何维持此消息的继承代码?在 TControlTWinControl 中(至少)有此消息的实现。如果我在类 TCustomHistoryFrame 中处理消息,它们还会被执行吗?

最佳答案

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

例如:

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;

关于delphi - 覆盖 SetEnabled 与处理消息 CM_ENABLEDCHANGED,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43863099/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com