一个学生表有:(学号、姓名、、、相片、、)等字段。想在一个窗体上实现这个表的基本功能
添加、删除、修改、保存、取消,的功能=====>>>特别针对:相片如何实现保存的问题??===
表单上用:dbedit、dbimage、openpicturedialog、一个button用于打开相片路径,一个button
用于删除dbimage中的相片,余下五个button分别是(添加、删除、修改、保存、取消)表单的onshow 事件
begin
  with adoquery1 do
  begin
    close;
    sql.clear;
    sql.add('select * from table');
    sql.open;
    first;
  end;
end;
添加:
begin
//  form1.adoquery1.open;
  form1.adoquery1.append;
  /////////
  dbedit1.text :=form1.adoquery1.fieldbyname('学号').asstring;
  dbimage1.picture.loadfromfile('openpicturedialog.filename');///这样肯定不行的
  //相片该怎写呢??  
end;
保存:
begin
  ///还是要在这边加入:form1.adoquery1.fieldbyname('相片').Assign(dbimage1);
  form1.adoquery.post;
end;
修改:adoquery1.edit; 删除:adoquery1.delete; 取消:adoquery1.cancel;
打开相片的:
begin
   If OpenPictureDialog1.Execute Then
   dbimage1.Picture.LoadFromFile(openpicturedialog1.filename);
end;  ///也许这个需要改进?
以上代码:文本可以实现各项功能,就是===<<相片>>===无法实现各项功能?
谢谢!!

解决方案 »

  1.   

    加个image,
    var
      FImg: TJPEGImage;
    begin
      FImg := TJPEGImage.Create;
     if OpenPictureDialog.Execute then
      with FImg do  
      try  
        LoadFromFile(OpenPictureDialog.Filename);
        Image1.Picture.Assign(FImg);
        DBImage.Assign(Image1.Picture.Graphic);
      finally  
        Free;  
      end;  
    end;
    看看可以不?
      

  2.   

    我用的是:Access 数据库 
    希望:实现以上功能的时候,代码的不要做太大的改动,,谢谢!!
      

  3.   

    你加一个image组件过渡实现一下这个效果,应该可以接受的吧?
      

  4.   

    用了 rouqing(*冰雨&双子座奇缘*)  的没错是在打开图片的button上 onclick   添加了 Image1
    var
      FImg: TJPEGImage;
    begin
      FImg := TJPEGImage.Create;
     if OpenPictureDialog.Execute then
      with FImg do  
      try  
        LoadFromFile(OpenPictureDialog.Filename);
        Image1.Picture.Assign(FImg);
        DBImage.Assign(Image1.Picture.Graphic);
      finally  
        Free;  
      end;  
    end;
    运行错误
    [错误]  Undeclared identifier: 'TjpegImage'是image的属性要设置什么吗??小第比较菜,,望说的详细点,谢谢!!!
      

  5.   

    不对,说错了,实际上是这样:不要放image了
    uses jpeg;自动建立这个类了
      

  6.   

    我这里还没有delphi,所以只能麻烦你自己动手写写看了记得加上这个单元  jpeg
      

  7.   

    晕,我怎么总错?!要加image控件的.uses jpeg;...var
      Img: TJPEGImage;
    begin
      Img := TJPEGImage.Create;
     if OpenPictureDialog.Execute then
      with Img do  
      try  
        LoadFromFile(OpenPictureDialog.Filename);
        Image1.Picture.Assign(Img);  //这里使用了image
        DBImage.Assign(Image1.Picture.Graphic);
      finally  
        Free;  
      end;  
    end;
      

  8.   

    加了:jpeg了,
     
    小第不才,那我的代码上要:是保存,还是,添加,要做修改呢??怎么做,谢谢!!
      

  9.   

    保存:也可以使用image组件过渡啊,Image.SaveToFile(...);
    添加:DBImage字段设置为图片字段,
    ADOQuery.Edit;
    ...
    ADOQuery.Post;
    修改:其实和我贴的代码差不多吧,重新导入打开的图片文件,然后用数据查询组建执行相应的修改功能。我这里没有delphi,只能说说了
      

  10.   

    不是你笨,是我这里没有delphi,所以很难讲述清楚,是我的错。
      

  11.   

    这个方法也可以的:copy来的哦用内存流
    var
      strm:tmemorystream;
      ext:string;
    begin
      if image1.picture.Graphic <> nil then //避免image1中无图像保存出错
        begin
          //取出文件的扩展名
          strm := tmemorystream.Create ;
          try
            image1.Picture.Graphic.SaveToStream(strm);
            adoquery1.append;
            strm.Position :=0;
            tblobfield(adoquery1.FieldByName('照片')).LoadFromStream(strm);
            adoquery1.Post;
          finally
            strm.Free ;
          end;
      

  12.   

    ACCESS数据库在处理JPG图片时直接读是不行的,因为ACCESS会把图片路径也存到图片文件里,同一张图片你用UE看一下你保存前和保存到数据库后的文件就知道了,要找到FF D8后才能显示出来。你的数据库里应该有一个存图片的字段,在ACCESS里将该字段类型设为OLE对象,假如字段名为JPG,在FORM1里一个保存按钮保存图片
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      //先判断adoquery的状态再Appened,这段代码楼主自己写
      if  OpenPictureDialog.Execute then
      begin    
        form1.adoquery1.Append;
        form1.adoquery1.FieldByName('JPG').loadfromfile(openpicturedialog.filename);
        //openpicturedialog.filename不要加单引号,楼主的代码里有加,那就错了
      end;
    end;显示图片
    private
      function JpegStartsInBlob(PicField:TBlobField):integer;
     
    implementation
    uses JPEG;
    {$R *.dfm}function TForm1.JpegStartsInBlob(PicField:TBlobField):integer; 
      var  
        bS     : TADOBlobStream; 
        buffer : Word; 
        hx     : string; 
      begin  
        Result := -1;   
        bS := TADOBlobStream.Create(PicField, bmRead); 
     try    
        while (Result = -1) and (bS.Position + 1 < bS.Size) do     
    begin      
      bS.ReadBuffer(buffer, 1);     
      hx:=IntToHex(buffer, 2);     
      if hx = 'FF' then begin       
       bS.ReadBuffer(buffer, 1);    
       hx:=IntToHex(buffer, 2);    
      if hx = 'D8' then Result := bS.Position - 2     
      else if hx = 'FF' then             
       bS.Position := bS.Position-1;      
    end; //if     
    end; //while     
    finally      
    bS.Free     
    end;  //try   
    end;  procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
    var
      bS  : TADOBlobStream;
      Pic : TJpegImage;
    begin
      bS := TADOBlobStream.Create(ADOQuery1.FieldByName('JPG'), bmRead);
      if not ADOQuery1.FieldByName('JPG').IsNull then
      begin
        try
          bS.Seek(JpegStartsInBlob(ADOQuery1.FieldByName('JPG'),soFromBeginning);
          Pic:=TJpegImage.Create;
          try
            Pic.LoadFromStream(bS);
            ADOImage.Picture.Graphic:=Pic;
          finally
            Pic.Free;
          end;
        finally
          bS.Free
        end;
      end;
    end;以上适用于ACCESS2000和2003