我是一个只有两个月的delphi莱鸟,我在尝试做一个数据库时遇到了以下的问题,救大家帮忙帮忙,先谢谢了。
我的数据库表名为member,用以下语句来定位数据库
ADOTable1.Locate('member',mynode.text,[]);
之后,再用一个loadimage过程来读bmp图片,如下:
procedure TMemberInf.loadimage;
var
  bmp:TBitmap;
begin
  try
    bmp := Tbitmap.Create;
    ADOQuery1.Open;
    bmp.Assign(ADOQuery1.FieldByName('pirture'));
    Image1.Picture.Bitmap:=bmp;
  finally
    bmp.Free;
  end;
end;其他的资料信息可以读出来,只是图片读不到,错误提示是:
[Warning] MemberInfU.pas(258): Variable 'bmp' might not have been initialized
我莱莱,多时解决不了,望大家帮忙。

解决方案 »

  1.   

    ////如下保存方法only to sql and access'data
    procedure TForm1.savetodbClick(Sender: TObject);  //保存图像
    var
      strm:tmemorystream;
      ext:string;
    begin
       if image1.picture.Graphic <> nil then  //避免image1中无图像保存出错
       begin
       ext:=extractfileext(openpicturedialog1.FileName );
       strm := tmemorystream.Create ;
       try
       image1.Picture.Graphic.SaveToStream(strm);
       adotable1.Edit ;
       strm.Position :=0;
       DBImage1.dataField :='';  //dbimage只能显示BMP,否则myimage由BMP变为jpeg时会出错
       tblobfield(adotable1.FieldByName('myimage')).LoadFromStream(strm);
       //如需直接由文件保存 TBlobField(adotable1.FieldByName('myimage')).LoadFromFile(OpenPictureDialog1.FileName);
       //以下记录保存到数据库的图像格式
       if uppercase(ext) = '.BMP' then
       begin
       adotable1.FieldByName('isbmp').Value := 1;
       dbimage1.dataField := 'myimage';
       end
       else if (uppercase(ext) = '.JPG') OR ( uppercase(ext) = '.JPEG') THEN
       adotable1.FieldByName('isbmp').Value := 0;
       adotable1.Post ;
       finally
       strm.Free ; //如果你选用TBLOBSTREAM类,程序运行到此语句会出错,可该语句前添入adotable1.edit
       end;
       end;
    end;
     ///如下显示方法不适用于paradox中的graphic字段的显示。
    procedure TForm1.adoTable1AfterScroll(DataSet: TDataSet);  //显示图像
    var
    strm:tadoblobstream;
    jpegimage:tjpegimage;
    bitmap:tbitmap;
    begin
      strm := tadoblobstream.Create(tblobfield(adotable1.fieldbyname('MYIMAGE')),bmread);
      try    //try1
      strm.position :=0;
      image1.Picture.Graphic := nil;
      DBIMAGE1.DataField := '';
      //显示时,BMP、JPEG两种图像数据必需分别处理
      if adotable1.fieldbyname('isbmp').asstring ='1' then
        begin    //begin11
        bitmap := tbitmap.Create ;
        try     //try11
        bitmap.LoadFromStream(strm);
        image1.Picture.Graphic := bitmap;
        DBIMAGE1.DataField := 'myimage';
        finally
        bitmap.Free;
        end;    //end try11
        end     //end begin11
        else if adotable1.fieldbyname('isbmp').asstring ='0' then
        begin   //begin12
        jpegimage := tjpegimage.Create ;
        try     //try12
        jpegimage.LoadFromStream(strm);
        image1.Picture.Graphic := jpegimage;
        finally
        jpegimage.Free ;
        end;    //end try12
        end;    //end begin12
      finally
      strm.Free ;
      end;     //end try1
    end;
      

  2.   


    保存 :
    var 
      Ms:TmemoryStream;
      Jpg:Tjpegimage;
    begin
      ms:=TmemoryStream.Create;
      Jpg.Assign(Image1.Picture.Graphic);
      Jpg.SaveToStream(Ms) ;
      Ms.Position :=0;
      ADOquery1.append;
      TBlobField(ADOquery1.FieldByName('img')).LoadFromStream(Ms);
      ADOquery1.Post;
      Ms.Free;
      Jpg.free;
    end;读取到image中:
    Var
      Ms:TStringStream;
      Jpg:Tjpegimage;
    begin
      Ms:=TstringStream.Create('');
      TBlobField(ADOquery1.FieldByName('img')).SaveToStream(Ms);
      Ms.Position :=0;
      Jpg.LoadFromStream(Ms);
      Image2.Picture.Assign(Jpg);
      Ms.Free;
      Jpg.free;
    end;我试过了,OK。楼主试试看...
         
      

  3.   

    TBlobField(data1.GS.FieldByName('图片')).LoadFromStream(Ms);
    __________↑// <--------编译到这里,就停啦.提示"Undeclared identifier."TBlobfield"
      

  4.   

    前面两段代码忘记加入建立JPG的语句了:
    jpg:=tjpegimage.Create;//加在上面的BEGIN之后
      

  5.   

    TBlobField(data1.GS.FieldByName('图片')).LoadFromStream(Ms);
    __________↑// <--------编译到这里,就停啦.提示"Undeclared identifier."TBlobfield"怎样解决?
      

  6.   

    首先谢谢两位,由于我只想用我自己的代码,能否就我的代码来给点意见呢?
    [Warning] MemberInfU.pas(258): Variable 'bmp' might not have been initialized补充一下,开头时我的代码写错了
    ADOQuery1.Open;
        bmp.Assign(ADOQuery1.FieldByName('pirture'));
    应该是
    ADOTable1.Open;
        bmp.Assign(ADOTable1.FieldByName('pirture'));
      

  7.   

    try
        bmp := Tbitmap.Create;
        ADOQuery1.Open;
        bmp.Assign(ADOQuery1.FieldByName('pirture'));
        Image1.Picture.Bitmap:=bmp;
      finally
        bmp.Free;
      end;
    ------------
    你的代码只是警告,不是错误啊
    写成:
      bmp := Tbitmap.Create;
      try  //try写在这就不会有警告了.
        ADOQuery1.Open;
        bmp.Assign(ADOQuery1.FieldByName('pirture'));
        Image1.Picture.Bitmap:=bmp;
      finally
        bmp.Free;
      end;
      

  8.   

    ahbatima(不用马甲很难成星)你可真行,能否说说这样其中的奥妙吗?另外,我想问一下access中的OLE对象的 长二进制数据的来历,谢谢。