Domanda

Ho il seguente frammento di codice

 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;   

Ho un problema capire l'inizializzazione di variabili bs.

Se io non inizializza, un evidente avvertimento ma ottengo.

 Variable 'bs' might not have been initialized.

Ora, se lo faccio come la parte commentato vale a dire

 bs:= TStream.create;

ottengo il seguente avviso.

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

e, infine, funziona tutto bene se io uso

 bs:=nil;

sto facendo correggere assegnandolo ad Nil?

Qualsiasi opinione apprezzato.

È stato utile?

Soluzione

TStream è astratta, quindi non dovreste un'istanza (chiamando un metodo astratto provoca un errore di runtime). Invece, si dovrebbe creare un'istanza di un discendente non astratta. Quando hai finito si dovrebbe Free l'istanza.

Ad esempio:

var
  Stream: TStream;
begin
  try
    Stream := CreateBlobStream(FieldByName('Picture'), bmRead);
    try
      // ...
    finally
      Stream.Free;
    end;
  except 
    // handle exceptions
  end;
end;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top