1

Delphi 7でIStreamをTStreamAdapterに変換する方法は?

Delphi XE2では、次のように書くことができます。

var
  aStream: IStream;
  aStreamAdapter: TStreamAdapter;
begin
  ...
  aStreamAdapter := aStream as TStreamAdapter;
  ...
end;

しかし、Delphi7は次のように書いています。

Error: Operator not applicable to this operand type
4

4 に答える 4

3

このコードは、D2010で導入された新機能、つまり、インターフェイスを実装するオブジェクトへの参照を回復する機能のために機能します。ただし、IStreamDelphiコード以外で実装されている場合、キャストは失敗することに注意してください。

古いバージョンのDelphiで実装オブジェクトを参照する必要がある場合は、さまざまなハックの1つを使用してオブジェクトを回復する必要があります。例えば:

ただし、実装オブジェクトに戻る必要はありません。あなたが望んでいるという事実は、あなたのデザインが間違っていることを非常に強く示しています。

于 2013-01-22T19:27:06.293 に答える
2

ユニットAxCtrlsには、まさにそれを行うためのTOleStreamオブジェクトがあります。

var
  aStream: IStream;
  bStream: TStream;
begin
  bStream := TOleStream.Create(aStream);
  try
    //
  finally
    bStream.Free;
  end;
end;
于 2013-01-23T09:56:57.270 に答える
0

Create次のような方法を使用する必要があります

var StreamAdapter:TStreamAdapter;
begin
  StreamAdapter := TStreamAdapter.Create(aStream);
...
于 2018-09-28T08:28:40.053 に答える
-1

サンプルコード:

var
  aFileStream: TFileStream;
  iStr: TStreamAdapter;
  iRes , iRes1, iRes2: Largeint;
  aStreamStat: TStatStg;
  aStreamContent: IStream;
begin
  aFileStream := TFileStream.Create('<...>', fmCreate);
  try
    aStreamContent := <...> as IStream;
    aStreamContent.Seek(0, 0, iRes);
    iStr := TStreamAdapter.Create(aFileStream, soReference);
    aStreamContent.Stat(aStreamStat, 1);
    aStreamContent.CopyTo(iStr, aStreamStat.cbSize , iRes1, iRes2);
  finally
    aFileStream.Free;
  end;
end;
于 2013-01-23T11:47:12.367 に答える