加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在Delphi 7中覆盖组件的方法?

发布时间:2020-12-15 09:18:28 所属栏目:大数据 来源:网络整理
导读:基于 this回答我试图在Delphi 7中覆盖TOleContainer的OnShowWindow方法. unit MyOleContainer;interfaceuses Windows,OleCtnrs;type TOleContainer = class(OleCtnrs.TOleContainer) private function OnShowWindow(fShow: BOOL): HResult; stdcall; overrid
基于 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实现的行为.而且我认为这根本不容易.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读