【发布时间】:2013-02-21 06:02:36
【问题描述】:
基于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.
但这不会编译给出以下错误:[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