问题描述
有两个类:TBaseClass
和TDerivedClass
,它们都在单独的单元中。
TBaseClass
unit InhPriv.BaseClass;
interface
uses Vcl.Controls,Winapi.Windows,Winapi.Messages,InhPriv.Messages;
type
TBaseClass = class(TWinControl)
strict private
procedure TheMethod(var msg: TMessage); message WM_CUSTOM;
end;
implementation
procedure TBaseClass.TheMethod(var msg: TMessage);
begin
MessageBox(0,'TBaseClass.TheMethod','IhheritedPrivateTest',0);
end;
end.
TDerivedClass
unit InhPriv.DerivedClass;
interface
uses InhPriv.BaseClass,InhPriv.Messages;
type
TDerivedClass = class(TBaseClass)
public
procedure TheMethod(var msg: TMessage); message WM_CUSTOM;
end;
implementation
procedure TDerivedClass.TheMethod(var msg: TMessage);
begin
inherited; //TBaseClass.TheMethod gets called!!!
MessageBox(0,'TDerivedClass.TheMethod',0);
end;
end.
主机表单
TForm1 = class(TForm)
//.......
private
c: TDerivedClass;
//.......
end;
WM_CUSTOM
被定义为WM_USER + 1
变体1:发送消息:
procedure TForm1.Button1Click(Sender: TObject);
begin
SendMessage(c.Handle,WM_CUSTOM,0);
end;
输出:
TBaseClass.TheMethod
TDerivedClass.TheMethod
procedure TForm1.Button1Click(Sender: TObject);
var m: TMessage;
begin
c.TheMethod(m);
end;
输出:
TBaseClass.TheMethod
TDerivedClass.TheMethod
cpu窗口
InhPriv.DerivedClass.pas.17: inherited; //TBaseClass.TheMethod gets called!!!
005B4880 8B55F8 mov edx,[ebp-$08]
005B4883 8B45FC mov eax,[ebp-$04]
005B4886 E87DFDFFFF call TBaseClass.TheMethod
Delphi文档说:
继承的后没有标识符时,它是指与封闭方法同名的继承方法,或者如果封闭方法是消息处理程序,则指向继承的消息相同消息的处理程序。
因此,没有明确的说法表明将方法转换为消息处理程序会使Delphi编译器违反OOP原则。
我可以错过一些文档吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)