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

时间:2013-03-06 12:33:23

标签: delphi methods components override

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

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.

但是这不会编译给出以下错误:[Error] MyOleContainer.pas(11): Field definition not allowed after methods or properties为什么?

编辑:

你能解释一下如何“声明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;

...

1 个答案:

答案 0 :(得分:5)

错误消息有点误导。它本质上是说override关键字不能出现在stdcall关键字之后。

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

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

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