自定义消息相对虚函数有什么胜势?感觉根本没必要
自定义消息相对虚函数有什么优势?感觉根本没必要
最近看VCL源码,有个问题,经常需要发送CM_消息去调用某个函数,我就不明白,为什么要这样。直接调用函数名称不是挺好吗,尤其是调用虚函数的话,一样很灵活。
比如:
procedure TWinControl.SetBorderWidth(Value: TBorderWidth);
begin
if FBorderWidth <> Value then
begin
FBorderWidth := Value;
Perform(CM_BORDERCHANGED, 0, 0); // 这里直接调用函数名称不好吗?
end;
end;
procedure TWinControl.CMBorderChanged(var Message: TMessage);
begin
inherited;
if HandleAllocated then
begin
SetWindowPos(Handle, 0, 0,0,0,0, SWP_NOACTIVATE or
SWP_NOZORDER or SWP_NOMOVE or SWP_NOSIZE or SWP_FRAMECHANGED);
if Visible then
Invalidate;
end;
end;
而且发消息还有个缺点,更依赖于系统,如果系统正忙怎么办?而虚函数只和语言自己有关系,不是更稳妥可靠吗?为什么要自定义消息呢?还把VCL框架搞的更复杂了。真的不懂,请各位指教,谢谢。
------解决思路----------------------
Perform是直接调用WindowProc函数,同步调用没有系统忙不忙之说.相当于SendMessage.
不发消息直接调用函数倒也行,不过系统的消息处理总是要处理的.不如就统一走消息这条路了.
另外消息函数实际是动态函数,如果子类派生层次比较多的话比虚函数在内存上是要节省一些的.而用法和虚函数又差不多
最近看VCL源码,有个问题,经常需要发送CM_消息去调用某个函数,我就不明白,为什么要这样。直接调用函数名称不是挺好吗,尤其是调用虚函数的话,一样很灵活。
比如:
procedure TWinControl.SetBorderWidth(Value: TBorderWidth);
begin
if FBorderWidth <> Value then
begin
FBorderWidth := Value;
Perform(CM_BORDERCHANGED, 0, 0); // 这里直接调用函数名称不好吗?
end;
end;
procedure TWinControl.CMBorderChanged(var Message: TMessage);
begin
inherited;
if HandleAllocated then
begin
SetWindowPos(Handle, 0, 0,0,0,0, SWP_NOACTIVATE or
SWP_NOZORDER or SWP_NOMOVE or SWP_NOSIZE or SWP_FRAMECHANGED);
if Visible then
Invalidate;
end;
end;
而且发消息还有个缺点,更依赖于系统,如果系统正忙怎么办?而虚函数只和语言自己有关系,不是更稳妥可靠吗?为什么要自定义消息呢?还把VCL框架搞的更复杂了。真的不懂,请各位指教,谢谢。
------解决思路----------------------
Perform是直接调用WindowProc函数,同步调用没有系统忙不忙之说.相当于SendMessage.
不发消息直接调用函数倒也行,不过系统的消息处理总是要处理的.不如就统一走消息这条路了.
另外消息函数实际是动态函数,如果子类派生层次比较多的话比虚函数在内存上是要节省一些的.而用法和虚函数又差不多