gpt4 book ai didi

delphi - 消息处理程序中的 DefaultHandler(Message) 和 "inherited"有什么区别?

转载 作者:行者123 更新时间:2023-12-03 14:40:29 25 4
gpt4 key购买 nike

在消息处理程序中调用 DefaultHandler(Message)inherited 之间到底有什么区别。例如:

TScrollBox = class(TScrollingWinControl)
private
...
procedure WMNCHitTest(var Message: TMessage); message WM_NCHITTEST;
...
end;

procedure TScrollBox.WMNCHitTest(var Message: TMessage);
begin
DefaultHandler(Message);
end;

为什么不在这里调用inherited?我什么时候应该使用其中一个?

最佳答案

让我们考虑一下您提供的示例。假设不调用 DefaultHandler ,继承被调用(或者等效地,TScrollBox 没有实现 WM_NCHITTEST 消息处理程序)。在这种情况下,消息将由 TWinControl 处理。在这个方法中:

procedure TWinControl.WMNCHitTest(var Message: TWMNCHitTest);
begin
with Message do
if (csDesigning in ComponentState) and (FParent <> nil) then
Result := HTCLIENT
else
inherited;
end;

这在设计时会进行特殊处理,否则它会调用继承,最终导致调用 DefaultHandler它将消息转发给默认的窗口过程。

现在,TScrollBox用这个消息处理程序替换该消息处理程序:

procedure TScrollBox.WMNCHitTest(var Message: TMessage);
begin
DefaultHandler(Message);
end;

这会调用 DefaultHandler直接,因此无条件地将消息转发给默认窗口过程。

所以,我们由此得出的结论是TScrollBox.WMNCHitTest通过抑制TWinControl.WMNCHitTest中的代码来简单地改变设计时的行为。返回 HTCLIENT .

因此我推测这就是该 VCL 代码的作者的动机。通过使用DefaultHandler底层窗口的行为(由默认窗口过程确定)被恢复,删除由干预 VCL 代码实现的任何行为修改。

关于delphi - 消息处理程序中的 DefaultHandler(Message) 和 "inherited"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44755271/

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