我想在程序中实现图片的动态添加、删除、显示(一个form中可以显示n张图片),图片要存放在服务器上(考虑存放在服务器的数据库中还是以文件形式存放,哪种存取方式更合理?),图片组件使用TImage还是其他控件?请各位高手提供指导或简单的代码,谢谢!

解决方案 »

  1.   

    用TBlobField对应mssql server 的 image 字段,可以先把Bitmap.SaveToStream,
    然后再BlobField.LoadFromStream,就存入数据库了。取出图像只需要相反操作即可。 
    ADOQuery1.Close;
    ADOQuery1.SQL.Clear;
    ADOQuery1.SQL.Add('insert into Pic values(.....,:Pic,...)');
     .................
    ADOQuery1.Parameters.ParamByName('Pic').Assign(Image1.Picture.Bitmap);
    .................
    ADOQuery1.ExecSQL;
    提取:
    Image1.Picture.Bitmap.Assign(TBLOBField(ADOQuery1.Parameters.ParamByName('Pic')))
      

  2.   

    var str:string;
       ms1,ms2,ms3,ms4:tmemorystream;
       Jpegimage1,Jpegimage2,Jpegimage3,Jpegimage4:TJpegImage;
       extname:string;
       maxrecord,addrecord:String;
    begin
      if Edit1.Text = '' then
      begin
        MessageDlg('生产地编码不能为空!',mtinformation,[mbOK],0);
        Edit1.SetFocus;
        Exit;
      end;
      if Edit2.Text = '' then
      begin
        MessageDlg('生产地名称不能为空!',mtinformation,[mbOK],0);
        Edit2.SetFocus;
        Exit;
      end;
      str:= 'Select pL_Barcord from producelist where pL_Barcord = ''' + Trim(edit1.Text) + ''' and fl_id='+edit7.Text+'';
      str:= DBQuery(False, str, 'pL_Barcord');
      if str <> '' then
      begin
        MessageDlg('生产地编码'+Trim(edit1.Text)+'已经存在,请重新添加!', mtInformation, [mbOK], 0);
        edit1.SetFocus;
        Exit;
      end;
      pictostream(ms1,jpegimage1,edit3) ;
      pictostream(ms2,jpegimage2,edit4) ;
      pictostream(ms3,jpegimage3,edit5) ;
      pictostream(ms4,jpegimage4,edit6) ;
      adoquery2.Open;
      adoquery2.append;
      adoquery2.FieldByName('PL_Barcord').AsString:=edit1.Text;
      adoquery2.FieldByName('fl_id').AsString:=edit7.Text;
      adoquery2.FieldByName('PL_ProduceName').AsString:=edit2.Text;
      adoquery2.FieldByName('PL_ProDescribe').AsString:=memo2.Text;
      TBlobField(adoquery2.FieldbyName('PL_PicProduceFirst')).LoadFromStream(MS1);
      TBlobField(adoquery2.FieldbyName('PL_PicProduceSecond')).LoadFromStream(MS2);
      TBlobField(adoquery2.FieldbyName('PL_PicProduceThirdly')).LoadFromStream(MS3);
      TBlobField(adoquery2.FieldbyName('PL_PicProduceFourthly')).LoadFromStream(MS4);
      adoquery2.Post;
      ms1.Free;
      ms2.Free;
      ms3.Free;
      ms4.Free;
      ///add by zqf///
      maxrecord:='select max(PL_ID) as PL_ID from producelist';
      maxrecord:=DBQuery(false, maxrecord, 'PL_ID');
      addrecord:='insert into operaterecord values(''producelist'',''PL_ID'','+maxrecord+',1,getdate())';
      DBQuery(True, addrecord, '');
      ///add by zqf///
      showmessage('保存成功!');
    end;
      

  3.   

    procedure pictostream(var ms:tmemorystream;jpegimage:TJpegImage;edit:TEdit);
    begin
        Ms:=TMeMoryStream.Create;
        Jpegimage:=Tjpegimage.Create;
        if (edit.Text='') or (edit.Text='无') then exit;
            try
             Jpegimage.LoadFromFile(edit.Text);
             Jpegimage.SaveToStream(Ms);
            finally
             jpegimage.Free;
            end;
    end;