如何在Delphi 7中实现覆盖组件的特定方法以自定义功能?

2026-04-10 02:481阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计340个文字,预计阅读时间需要2分钟。

如何在Delphi 7中实现覆盖组件的特定方法以自定义功能?

基于this回答回应我试图在Delphi 7中覆盖TOleContainer的OnShowWindow方法。单元:MyOleContainer;接口uses Windows, OleCtnrs;type TOleContainer=class(OleCtnrs.TOleContainer) private function OnShowWindow(fShow: BOOL): HResult; end;

基于 this回答我试图在Delphi 7中覆盖TOleContainer的OnShowWindow方法.

unit MyOleContainer; interface uses Windows, OleCtnrs; type TOleContainer = class(OleCtnrs.TOleContainer) private function OnShowWindow(fShow: BOOL): HResult; stdcall; override; end; implementation function TOleContainer.OnShowWindow(fShow: BOOL): HResult; begin Result := S_OK; end; end.

但这不会编译给出以下错误:[错误] MyOleContainer.pas(11):方法或属性后不允许字段定义为什么?

编辑:

您能解释一下如何“声明IOleClientSite的实现,继承自TOleContainer并隐藏方法OnShowWindow […]使用TOleContainer作为IOleClientSite”?

EDIT2:

这是你的意思吗?

TMyContainer = class(TOleContainer, IOleClientSite) private FIOleClientSite: IOleClientSite; function SaveObject: HResult; stdcall; ... constructor TMyContainer.Create(AOwner: TComponent); begin inherited Create(AOwner); Self.OleObjectInterface.GetClientSite(FIOleClientSite); end; function TMyContainer.SaveObject: HResult; begin Result := FIOleClientSite.SaveObject; end; ... 错误消息有点误导.它本质上是说,覆盖关键字不能出现在stdcall关键字之后.

这有点暂时,但如果你重写一个方法,那么你不需要也不应该重新声明调用约定.覆盖方法时无法修改调用约定,因此最好不要重复它.

但是,当您修复该问题时,您的代码仍然无法编译.那是因为他的OnShowWindow功能不是虚拟的.因此,您无法覆盖它.

我没有看到如何在不重新声明和重新实现IOleClientSite的整个实现的情况下更改IOleClientSite.OnShowWindow实现的行为.而且我认为这根本不容易.

如何在Delphi 7中实现覆盖组件的特定方法以自定义功能?

本文共计340个文字,预计阅读时间需要2分钟。

如何在Delphi 7中实现覆盖组件的特定方法以自定义功能?

基于this回答回应我试图在Delphi 7中覆盖TOleContainer的OnShowWindow方法。单元:MyOleContainer;接口uses Windows, OleCtnrs;type TOleContainer=class(OleCtnrs.TOleContainer) private function OnShowWindow(fShow: BOOL): HResult; end;

基于 this回答我试图在Delphi 7中覆盖TOleContainer的OnShowWindow方法.

unit MyOleContainer; interface uses Windows, OleCtnrs; type TOleContainer = class(OleCtnrs.TOleContainer) private function OnShowWindow(fShow: BOOL): HResult; stdcall; override; end; implementation function TOleContainer.OnShowWindow(fShow: BOOL): HResult; begin Result := S_OK; end; end.

但这不会编译给出以下错误:[错误] MyOleContainer.pas(11):方法或属性后不允许字段定义为什么?

编辑:

您能解释一下如何“声明IOleClientSite的实现,继承自TOleContainer并隐藏方法OnShowWindow […]使用TOleContainer作为IOleClientSite”?

EDIT2:

这是你的意思吗?

TMyContainer = class(TOleContainer, IOleClientSite) private FIOleClientSite: IOleClientSite; function SaveObject: HResult; stdcall; ... constructor TMyContainer.Create(AOwner: TComponent); begin inherited Create(AOwner); Self.OleObjectInterface.GetClientSite(FIOleClientSite); end; function TMyContainer.SaveObject: HResult; begin Result := FIOleClientSite.SaveObject; end; ... 错误消息有点误导.它本质上是说,覆盖关键字不能出现在stdcall关键字之后.

这有点暂时,但如果你重写一个方法,那么你不需要也不应该重新声明调用约定.覆盖方法时无法修改调用约定,因此最好不要重复它.

但是,当您修复该问题时,您的代码仍然无法编译.那是因为他的OnShowWindow功能不是虚拟的.因此,您无法覆盖它.

我没有看到如何在不重新声明和重新实现IOleClientSite的整个实现的情况下更改IOleClientSite.OnShowWindow实现的行为.而且我认为这根本不容易.

如何在Delphi 7中实现覆盖组件的特定方法以自定义功能?