Delphi中的TStream警告

Shi*_*h11 3 delphi initialization tstream

我有以下代码片段

 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;   
Run Code Online (Sandbox Code Playgroud)

我在理解bs变量的初始化时遇到了问题.

如果我不初始化它,我得到一个明显的警告.

 Variable 'bs' might not have been initialized.
Run Code Online (Sandbox Code Playgroud)

现在,如果我作为评论部分,即

 bs:= TStream.create;
Run Code Online (Sandbox Code Playgroud)

我收到以下警告.

Constructing instance of 'TStream' containing abstract method 'TStream.Read'
Constructing instance of 'TStream' containing abstract method 'TStream.Write'
Run Code Online (Sandbox Code Playgroud)

最后,如果我使用它,它的工作完全正常

 bs:=nil;
Run Code Online (Sandbox Code Playgroud)

我是通过分配来做到的 Nil吗?

任何观点赞赏.

Ond*_*lle 10

TStream是抽象的,所以你不应该实例化它(调用抽象方法会导致运行时错误).相反,您应该实例化一个非抽象的后代.当你完成后,你应该Free是实例.

例如:

var
  Stream: TStream;
begin
  try
    Stream := CreateBlobStream(FieldByName('Picture'), bmRead);
    try
      // ...
    finally
      Stream.Free;
    end;
  except 
    // handle exceptions
  end;
end;
Run Code Online (Sandbox Code Playgroud)

  • 正如我告诉你的那样.模式是<create it>`try` <use it>`finally` <free it>`end;` (2认同)