【问题标题】:Overriding method of a component in Delphi 7?Delphi 7中组件的覆盖方法?
【发布时间】:2013-02-21 06:02:36
【问题描述】:

基于this 的答案,我试图在Delphi 7 中覆盖TOleContainerOnShowWindow 方法。

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;

...

【问题讨论】:

  • 从 TOleContainer 继承来实现 IOleClientSite:TMyContainer = class(TOleContainer, IOleClientSite, etc...)。现在给它一个 IOleClientSite 类型的私有变量,在构造函数中初始化它,并通过简单地调用具有相同参数和返回类型的内部 IOleClientSite 的方法来实现 IOleClientSite 所需的所有方法,当然除了您要更改的方法。换句话说:重写一个类的非虚方法并不容易,但是重写一个接口的方法却很容易。
  • 我用代码更新了我的帖子。这是正确的做法吗?谢谢。

标签: delphi methods components overriding


【解决方案1】:

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

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

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

如果不重新声明和重新实现IOleClientSite 的整个实现,我看不出如何改变IOleClientSite.OnShowWindow 实现的行为。而且我认为这并不容易做到。

【讨论】:

  • OTOH,如果他只需要它作为 IOleClientSide 的实现,那么“覆盖”一个接口方法很容易:声明 IOleClientSite 的实现,从 TOleContainer 继承并隐藏方法 OnShowWindow。现在界面将使用新方法。
  • @RudyVelthuis 他还需要重新实现IOleClientSite 中的所有其他方法,因为TOleContainer 中的实现都具有私有可见性。
  • 好吧,那更糟。他可以使用 TOleContainer 作为 IOleClientSite 来实现其余部分。
  • 是的,当然,我刚刚更新了这个问题,因为我想不出按照 Rudy Velthuis 所说的正确方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多