4

基于这个答案,我试图覆盖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”?

编辑2:

这是你的意思吗?

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;

...
4

1 回答 1

5

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

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

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

我看不出如何在IOleClientSite.OnShowWindow不重新声明和重新实现IOleClientSite. 我不认为这很容易做到。

于 2013-03-06T12:43:28.640 回答