gpt4 book ai didi

delphi - 当消息处理程序不调用继承时会发生什么?

转载 作者:行者123 更新时间:2023-12-03 14:52:39 26 4
gpt4 key购买 nike

我刚刚注意到我们非常(非常)旧的自定义控件(不是我创建的)之一有这个 WM_SIZE 消息处理程序(我在这里使用了 TPanel演示):

TPanel = class(ExtCtrls.TPanel)
private
procedure WMSize(var Message: TWMSize); message WM_SIZE;
end;

procedure TPanel.WMSize(var Message: TWMSize);
begin
DoSomethingWhenResized;
end;

未调用继承DoSomethingWhenResized 创建一个缓存的渐变位图,用于控件的绘制过程。

每件事“看起来”和行为都很好,但我只是想知道如果先调用inherited处理程序是否会出错?

最佳答案

当然,如果您不调用inherited,那么您将失去祖先控件中实现的行为。这对您来说是否是一个问题只有您可以决定。 VCL 源代码准确地向您展示了那些祖先正在做什么。在您的示例中,处理 WM_SIZE 的链上的第一个祖先是 TWinControl ,它执行以下操作:

procedure TWinControl.WMSize(var Message: TWMSize);
var
LList: TList;
begin
UpdateBounds;
UpdateExplicitBounds;
inherited;

LList := nil;
if (Parent <> nil) and (Parent.FAlignControlList <> nil) then
LList := Parent.FAlignControlList
else if FAlignControlList <> nil then
LList := FAlignControlList;

if LList <> nil then
begin
if LList.IndexOf(Self) = -1 then
LList.Add(Self);
end
else
begin
Realign;
if not (csLoading in ComponentState) then
Resize;
end;
end;

这里WMSize调用inherited,但是(当前)TWinControl上面没有祖先对象来实现这个,所以上面是你的由于不调用inherited而丢失。如果您的 DoSomethingWhenResized 管理子控件的控件边界、大小调整和组件对齐(或者如果您不需要它来执行此操作),那么就可以了。但是,如果您发现控件没有正确处理这些事情,那么您可能会怀疑 DoSomethingWHenResized 在其实现中错过了其中一项或多项职责。

关于delphi - 当消息处理程序不调用继承时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45919002/

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