Delphi中的TStream警告

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,这样做是正确的吗?

欢迎任何意见。


这个提示是要告诉你,如果在第10行发生异常,那么变量bs在第12行仍将未初始化。由于Delphi编译器没有提供本地变量初始化的手段,这样的流程会导致异常。因此,您决定将其初始化为nil是完美的。 - OnTheFly
1个回答

10

TStream是抽象的,因此您不应该实例化它(调用一个抽象方法会导致运行时错误)。相反,您应该实例化一个非抽象的子类。完成后,您应该Free实例。

例如:

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

我想将它放在try块中以处理任何异常。我该怎么做? - Shirish11
2
就像我已经向你展示的那样。模式是<创建>try<使用>finally<释放>end; - Ondrej Kelle
如果你想处理异常,就把所有的代码都放在try..except块中。我已经更新了TOndrej的答案来演示这一点。 - gabr
1
@Shirish11,要处理异常,请参见@gabr的编辑。按照注释建议,在except..end;块中放置您的处理代码。 - Ondrej Kelle

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接