3

次のコードスニペットがあります

 Procedure TFrm.Retrieve(mystring : string);
  var 
   bs : TStream;
   ...
  begin
    ...
    bs:=nil;
    //bs:= TStream.create; 
    try
     bs := CreateBlobStream(FieldByName('Picture'), bmRead);
    finally
     bs.Free;
    end;
  ... 
  end;   

bs変数の初期化を理解するのに問題があります。

初期化しないと、明らかな警告が表示されます。

 Variable 'bs' might not have been initialized.

今、私がコメントされた部分としてそれをするならば、すなわち

 bs:= TStream.create;

次の警告が表示されます。

Constructing instance of 'TStream' containing abstract method 'TStream.Read'
Constructing instance of 'TStream' containing abstract method 'TStream.Write'

そして最後に私が使用すればそれは完全にうまくいきます

 bs:=nil;

私はそれをに割り当てることによってそれを正しくやっています Nilか?

どんな意見でもありがたいです。

4

1 に答える 1

10

TStreamは抽象であるため、インスタンス化しないでください(抽象メソッドを呼び出すと、ランタイムエラーが発生します)。代わりに、非抽象子孫をインスタンス化する必要があります。完了したらFree、インスタンスを作成する必要があります。

例えば:

var
  Stream: TStream;
begin
  try
    Stream := CreateBlobStream(FieldByName('Picture'), bmRead);
    try
      // ...
    finally
      Stream.Free;
    end;
  except 
    // handle exceptions
  end;
end;
于 2011-12-01T13:24:49.903 に答える