Recent

Author Topic: array of TStream + EInOutError ?  (Read 6480 times)

fredycc

  • Sr. Member
  • ****
  • Posts: 264
array of TStream + EInOutError ?
« on: December 28, 2009, 08:50:05 pm »
 :) Hi Again, I have the next problem, I have declared the next Structure:

StreamRecord = Record
                     IDE : array of String;
                     BLOB : array of TStream;
                   End;

private
    ImgArray : StreamRecord;

Next I declared a procedure: This works when I try to obtain my Stream from by array and show it into a Image.

    i := 0;
    While Not SQLQuery1.EOF do
    begin
       if Not SQLQuery1PHOTO.IsNull then begin
          i := i + 1;
          SetLength(ImgArray.BLOB, i);
          SetLength(ImgArray.IDE, i);

          ImgArray.IDE[i-1] := SQLQuery1ID.Text ;
          ImgArray.BLOB[i-1] := SQLQuery1.CreateBlobStream(SQLQuery1PHOTO, bmRead);

->       Image1.Picture.Graphic:= TJpegImage.Create;
->       Image1.Picture.Graphic.LoadFromStream(ImgArray.BLOB[i-1]);

          Image1.Repaint;
       end;
       SQLQuery1.Next;
    end;

    Trx1.Commit;
    SQLQuery1.Free;
    Trx1.Free;
*****************************************************************

The problem is when i put the next code outside the loop, in this case a use 0 for test because I'm sure this have a value, the error is : "EInOutError with message File Not open"

->       Image1.Picture.Graphic:= TJpegImage.Create;
->       Image1.Picture.Graphic.LoadFromStream(ImgArray.BLOB[0]);

Where is my error, i need to set a position of my stream, why this works into the loop?
« Last Edit: December 28, 2009, 09:03:16 pm by fredycc »

Zaher

  • Hero Member
  • *****
  • Posts: 683
    • parmaja.org
Re: array of TStream + EInOutError ?
« Reply #1 on: December 29, 2009, 03:17:05 am »
You need to seek the stream to 0 before load it to ensure it loaded correctly,

I prefer use TObjectList instead of array of "array of TStream";

fredycc

  • Sr. Member
  • ****
  • Posts: 264
Re: array of TStream + EInOutError ?
« Reply #2 on: December 29, 2009, 04:38:42 pm »
thanks Zaher, yesterday at night I was reading about seek and streams, and the final result ands works is the next procedure, and as you mentioned I use seek function, Thanks  :) Now is easy display and save the streams and not is necessary a active transaction. :D

     i := 0;
    While Not SQLQuery1.EOF do
    begin
       if Not SQLQuery1PHOTO.IsNull then begin
          i := i + 1;
          SetLength(ImgArray.BLOB, i);
          SetLength(ImgArray.IDE, i);

          ImgArray.IDE[i-1] := SQLQuery1ID.Text ;

          m := TMemoryStream.Create;
          m := SQLQuery1.CreateBlobStream(SQLQuery1PHOTO, bmRead);

          ImgArray.BLOB[i-1] := TMemoryStream.Create;
          ImgArray.BLOB[i-1].CopyFrom(m,m.Size);

          m.Free;
       end;
       SQLQuery1.Next;

    end;

    Trx1.Commit;
    SQLQuery1.Free;
    Trx1.Free;

    //this sentences are for display the stream into Image1
    Image1.Picture.Graphic:= TJpegImage.Create;
    ImgArray.BLOB[PosArray].Seek(0,0);
    Image1.Picture.Graphic.LoadFromStream(ImgArray.BLOB[PosArray]);
« Last Edit: December 29, 2009, 04:54:14 pm by fredycc »

Zaher

  • Hero Member
  • *****
  • Posts: 683
    • parmaja.org
Re: array of TStream + EInOutError ?
« Reply #3 on: December 29, 2009, 06:17:28 pm »
What for
Code: [Select]
m := TMemoryStream.Create;
and
ImgArray.BLOB[i-1].CopyFrom(m,m.Size);

m.Free;

Using array for store object bad idea, use "TObjectList" from unit "Contnrs"
like this way

Code: [Select]
  TStreamList = class(TObjectList)
  private
    function GetItems(Index: Integer): TStream;
    procedure SetItems(Index: Integer; const Value: TStream);
  protected
  public
    function Add(AStream: TStream): Integer;
    property Items[Index: Integer]: TStream read GetItems write SetItems; default;
  end;



function TStreamList .GetItems(Index: Integer): TStream ;
begin
  Result := (inherited Items[Index] as TStream );
end;

procedure TStreamList .SetItems(Index: Integer; const Value: TStream);
begin
  inherited Items[Index] := Value;
end;

function TStreamList.Add(AStream: TStream): Integer;
begin
  Result := inherited Add(AStream);
end;

you can repleace any TStream with any class you like

using the list
Code: [Select]
   if Not SQLQuery1PHOTO.IsNull then
   begin
         i := i + 1;
        SetLength(ImgArray.IDE, i);
        ImgArray.IDE[i-1] := SQLQuery1ID.Text ;
        m := SQLQuery1.CreateBlobStream(SQLQuery1PHOTO, bmRead);         
        ImgArray.BLOB.Add(m);  // ImgArray.BLOB is TStreamList         
   end;
    SQLQuery1.Next;

fredycc

  • Sr. Member
  • ****
  • Posts: 264
Re: array of TStream + EInOutError ?
« Reply #4 on: December 29, 2009, 09:18:15 pm »
Thanks Zaher for the suggest  :D, i'll take it.  :), see more easy.

 

TinyPortal © 2005-2018