我查询了一些关于这个问题的贴子,但是还是没有弄明白,我的问题是这样的:
我使用SQLSERVER2000数据库,做的程序中包括职员信息管理,其中想将人物照片加上,所以就用了DBIMAGE控件,字段设为IMAGE类型,我在DBIMAGE控件下面加了两个按钮,一个是添加照片一个是删除照片,添加照片的代码如下:
procedure TForm8.BitBtn1Click(Sender: TObject);
var
 f: file of Byte;
 size: Longint;
begin
  if OPDiag1.Execute then
  begin
   AssignFile(f, OpDiag1.FileName);
   Reset(f);
   size := FileSize(f);
   if size<40960 then
   begin
    CloseFile(f);
    DBImage1.Picture.LoadFromFile(OpDiag1.FileName);
   end else showmessage('选择的这个图像太大了,请先进行处理(<40K)。');
  end;
end;
我在USER中引用了JPEG单元,
使用上面这段程序我将一个JPEG图像加入到了DBIMAGE控件中,我是加入之前是先点击修改,也就是让QUERY控件进入EDIT状态,加入照片后再点击保存,就是POST过程,但是一点保存,DBIMAGE中的图像就不见, 浏览记录也不再出现,也不知道是否保存进去了.
请各位给详细地说说如何做才能实现我要的这项功能,最好给出源代码,多谢,呵呵,我是不是很懒!!!

解决方案 »

  1.   

    uses jpeg;
    保存Image1中的图象至数据库 :
    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;
    从数据库中读取图象到image2中:
    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;///也许楼主需要,看吧!..
      

  2.   

    您发表的这段程序代码不错,可是它是用IMAGE的,我用的是DBIMAGE方式,就是想用最少的代码来完成工作.不知道您是否知道DBIMAGE如何做?
      

  3.   

    你的DisPlay属性如何设置的?
    改变一下尝试一下
      

  4.   

    procedure TForm8.BitBtn1Click(Sender: TObject);
    var
     f: file of Byte;
     size: Longint;
    begin
      if OPDiag1.Execute then
      begin
       AssignFile(f, OpDiag1.FileName);
       Reset(f);
       size := FileSize(f);
       if size<40960 then
       begin
        CloseFile(f);
        DBImage1.DataSource.DataSet.Edit;          //----1
        DBImage1.Picture.LoadFromFile(OpDiag1.FileName);
        DBImage1.DataSource.DataSet.Post;          //-----2
       end else showmessage('选择的这个图像太大了,请先进行处理(<40K)。');
      end;
    end;
      

  5.   

    没有DisPlay属性,只有AUTODisPlay属性,我的是TRUE,还有我虽然在代码中没加EDITT 和 POST,但是我是先点修改(EDIT),然后加图片,然后再点保存(POST),和meiqingsong(阿飛) 的是一个意思,但是还是图片马上不见了.
      

  6.   

    那你这么写一下:CopyToClipborad,PasteFromClipboard,可以不?
      

  7.   

    我刚在delphi7下测试过,没有问题。DBImage就用默认属性就可以。代码如下:
    table1.edit;
    DBImage1.Picture.Loadfromfile('d:\temp\01.bmp');
    table1.post;
      

  8.   

    http://community.csdn.net/Expert/topic/3462/3462441.xml?temp=.1229975
      

  9.   

    to 楼主:
    在DBImage1.Picture.LoadFromFile(OpDiag1.FileName);之后
    再使用
    dbimage1.CopyToClipborad;
    dbimage1.PasteFromClipboard
    试试!!!
      

  10.   

    支持 gxgyj(杰克.逊) 的答案
      

  11.   

    感谢大家的答复,请原谅不能一一给分,杰克逊的最后一次答复起到了决定性的作用,
    ///////////////////////////////////////////////////////////////////////
    to 楼主:
    在DBImage1.Picture.LoadFromFile(OpDiag1.FileName);之后
    再使用
    dbimage1.CopyToClipborad;
    dbimage1.PasteFromClipboard
    试试!!!
    ///////////////////////////////////////////////////////////////////////
    原因不知道是为什么,如果能再讲讲为什么这样做就好使,就更好了.感谢各位!
      

  12.   

    rouqing(*冰雨&双子座奇缘*) 的回复由于写的太简单,我都不知道是什么意思,其时您是最先指出了问题所在,如果您象杰克逊一样说详细点我可能就知道了.也谢谢您的支持.分少点,望别介意哟