我是用ADOQUERY,image控件的,图片的字段是PIC,类型是IMAGE型,里面BMP,JPG的图片都有。想把图片取出来,我想把它显示在IMAGE,请问如何实现
with adoquery1 do
  begin
    close;
    sql.Clear;
    sql.Add('select * from table where s_no='''+edit1.text+'''');
    open;
  end;
????接下来该如何写,请各位指教指教,希望是用文件流的方法。
谢谢!

解决方案 »

  1.   

    这个问题参看我在这里的回答。判断文件格式与读取的代码都有http://topic.csdn.net/u/20090219/13/135bd031-7cb0-4372-be4a-391fbaaf0953.html
      

  2.   

      ms:=TMemoryStream.Create;
      ms:=ty.ADOQuery1.CreateBlobStream(ty.ADOQuery1.FieldByName('ty'),bmread);
      (ty.FindComponent('image'+inttostr(flag)) as TImage).Picture.Bitmap.LoadFromStream(ms);
      ms.Free;
      

  3.   


    var 
      mStream: TMemoryStream;
      JpgFile: TjpegImage;
    begin
      Query1.close;
      Query1.Sql.text := '.......';
      Query1.Open;
      if not Query1.FieldByName('Pic').IsNull then 
      begin
        mStream := TMemoryStream.Create ;
        JpgFile := TjpegImage.Create ;
        TBlobField(Query1.FieldByName('Pic')).SaveToStream(mStream);
        mStream.Position :=0;
        jpgfile.LoadFromStream(MStream);
        image2.Picture.Assign(JpgFile);
      end
      else 
       image2.Picture :=nil;
    end;
      

  4.   

    存图片的,看看有没有问题!
    procedure TForm1.Button1Click(Sender: TObject);
    var
     mstream:tmemorystream;
     fileexit:string;
    begin
      adoquery1.Edit;
      adoquery1.FieldByName('s_no').AsString:=edit1.Text;
      adoquery1.FieldByName('s_name').AsString:=edit2.Text;  if image1.Picture.Graphic<>nil then
      begin
        mstream:=TMemoryStream.Create;
        fileexit:=extractfileext(opendialog1.FileName) ;
        image1.Picture.Graphic.SaveToStream(mstream);
        mstream.Position:=0;
        TBlobField(adoquery1.FieldByName('pic')).LoadFromStream(mstream);
      end;
        adoquery1.Append;
      showmessage('oks');end;
      

  5.   

    procedure TForm1.Button1Click(Sender: TObject); 
    var 
    mstream:tmemorystream; 
    fileexit:string; 
    begin 
      adoquery1.Edit;   // 这是编辑状态
      adoquery1.FieldByName('s_no').AsString:=edit1.Text; 
      adoquery1.FieldByName('s_name').AsString:=edit2.Text;   if image1.Picture.Graphic <>nil then  // 这个判断好像一直会成立
      begin 
        mstream := TMemoryStream.Create; 
        fileexit := extractfileext(opendialog1.FileName) ; 
        image1.Picture.Graphic.SaveToStream(mstream); 
        mstream.Position:=0; 
        TBlobField(adoquery1.FieldByName('pic')).LoadFromStream(mstream); 
      end; 
      if AdoQuery1.state in [dsInsert,dsEdit] then AdoQuery1.post;  adoquery1.Append;   // 这里又置于新增状态
      showmessage('oks'); end;
    如果我上面的注释你都觉得合理的话,那代码是没有问题的。
      

  6.   

    谢谢 starluck
    我现在改成了:
    procedure TForm1.Button1Click(Sender: TObject); 
    var 
    mstream:tmemorystream; 
    fileexit:string; 
    begin 
      adoquery1.insert;    


    。  AdoQuery1.post;
      showmessage('oks'); 
    end;这个不知道还有问题吗,
    还有,sanguomi 的写法,我只能查询到JPG的图片,BMP的查不出来,请问有没有办法解决!
      

  7.   

    我上面有一个连接,是我上次解决另一个网友的。里面有一个 checkPicFormat 函数,你要检查下是什么类型的图片,
    你这个问题的难点在判断图片类型而不是载入或存储图片。
      

  8.   


    var
      mStream: TMemoryStream;
      JpgFile: TjpegImage;
      bmpfile: Tbitmap;
    begin
      with adoquery1 do
      begin
        close;
        sql.Clear;
        sql.Add('select * from stu_info where s_no='''+edit1.Text+''' ') ;
        open;
      end;try
      if not adoquery1.FieldByName('pic').IsNull then
      begin
        mstream:=tmemorystream.Create;
        jpgfile:=tjpegimage.Create;
        bmpfile:=tbitmap.Create;
        Tblobfield(adoquery1.FieldByName('pic')).SaveToStream(mstream);
        mstream.Position:=0;
        if uppercase(checkpicformat(mstream))='JPEG' then
        begin
           jpgfile.LoadFromStream(mstream);
           image1.Picture.Assign(jpgfile);
        end
        else
        if uppercase(checkpicformat(mstream))='BMP' then
        begin
           bmpfile.LoadFromStream(mstream);
           image1.Picture.Assign(bmpfile);
        end;
      end
      else
        image1.Picture:=nil;
    finally
       jpgfile.Free;
       bmpfile.Free;
    end;我这样写代码,出错,麻烦看看是什么原因!
      

  9.   

    var 
      mStream: TMemoryStream; 
      JpgFile: TjpegImage; 
      bmpfile: Tbitmap; 
    begin 
      with adoquery1 do 
      begin 
        close; 
        sql.Clear; 
        sql.Add('select * from stu_info where s_no='''+edit1.Text+''' ') ; 
        open; 
      end; try 
      if not adoquery1.FieldByName('pic').IsNull then 
      begin 
        mstream:=tmemorystream.Create; 
        jpgfile:=tjpegimage.Create; 
        bmpfile:=tbitmap.Create; 
        Tblobfield(adoquery1.FieldByName('pic')).SaveToStream(mstream); 
        mstream.Position:=0; 
        if uppercase(checkpicformat(mstream))='JPEG' then 
        begin 
          mstream.Position:=0; //注意,下面也是
          jpgfile.LoadFromStream(mstream); 
          image1.Picture.Assign(jpgfile); 
        end 
        else 
        if uppercase(checkpicformat(mstream))='BMP' then 
        begin 
          mstream.Position:=0;
          bmpfile.LoadFromStream(mstream); 
          image1.Picture.Assign(bmpfile); 
        end; 
      end 
      else 
        image1.Picture:=nil; 
    finally 
      jpgfile.Free; 
      bmpfile.Free; 
    end; 我这样写代码,出错,麻烦看看是什么原因!
      

  10.   

    谢谢STARLUCK
    现在能把JPEG的文件查出来了。
    但是BMP的文件,还是查不出来!能给我说一下,
     mstream.Position:=0;
    这个的用法吗?
      

  11.   

    我去掉
    uppercase(checkpicformat(mstream))='BMP' then 
    才能查询出来BMP的图片,
    不知道是哪里的问题。
      

  12.   

     如果你只有二个文件,你就 if else 没有必要在ELSE中再判断