delphiinitializationtstream

TStream warning in delphi


I have the following code snippet

 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;   

I have a problem understanding the initialisation of bs variable.

If I dont initialize it , a but obvious warning i get.

 Variable 'bs' might not have been initialized.

Now if I do it as the commented part i.e.

 bs:= TStream.create;

I get the following warning.

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

and finally it works totally fine if I use

 bs:=nil;

Am I Doing it correct by assigning it to Nil?

Any views appreciated.


Solution

  • TStream is abstract so you shouldn't instantiate it (calling an abstract method causes a runtime error). Instead, you should instantiate a non-abstract descendant. When you're done you should Free the instance.

    For example:

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