4

この回答に基づいて、Delphi 7OnShowWindowのメソッドをオーバーライドしようとしています。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 に答える