大家好,我是新手.. 
       我想學習數據庫的應用.
       我在ACCESS的OLE對象中加入了圖片,想通過Image控件顯示圖片..
       而且圖片要跟隨記錄指針更換. 請教如何實現.?  最好能寫詳細代碼說明.
       在此先謝過了..
       

解决方案 »

  1.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, Buttons, ExtCtrls, Grids, DBGrids, DB, ADODB, ExtDlgs,
      jpeg,DAODatabase, GridsEh, DBGridEh,math;type
      TForm1 = class(TForm)
        Image1: TImage;
        BitBtn2: TBitBtn;
        BitBtn3: TBitBtn;
        ADOConnection1: TADOConnection;
        ADOQuery1: TADOQuery;
        DataSource1: TDataSource;
        BitBtn4: TBitBtn;
        BitBtn5: TBitBtn;
        OpenPictureDialog1: TOpenPictureDialog;
        Button1: TButton;
        DBGridEh1: TDBGridEh;
        BitBtn1: TBitBtn;
        procedure FormCreate(Sender: TObject);
        procedure BitBtn4Click(Sender: TObject);
        procedure BitBtn5Click(Sender: TObject);
        procedure BitBtn2Click(Sender: TObject);
        procedure BitBtn3Click(Sender: TObject);
        procedure ADOQuery1AfterScroll(DataSet: TDataSet);
        procedure Button1Click(Sender: TObject);
        procedure DBGridEh1DrawColumnCell(Sender: TObject; const Rect: TRect;
          DataCol: Integer; Column: TColumnEh; State: TGridDrawState);
        procedure BitBtn1Click(Sender: TObject);  private
        { Private declarations }
      public
        { Public declarations }
      end;var
      Form1: TForm1;implementationuses   Dao97,Dao2000,comobj;
    {$R *.dfm}procedure TForm1.FormCreate(Sender: TObject);
    begin
    form1.caption:=extractfilepath(paramstr(0))+'mydata.mdb';
    if __DBEngine36 = nil then CreateEngine (Dao36, '');
    adoconnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Password="";Data Source='+ExtractFilePath(Paramstr(0))+'Mydata.mdb;Persist Security Info=True';
    adoconnection1.Connected:=true;
    adoquery1.Close;
    adoquery1.SQL.Clear;
    adoquery1.SQL.Text:='select * from test';
    adoquery1.Open;end;procedure TForm1.BitBtn4Click(Sender: TObject);
    begin
    adoquery1.Append;
    adoquery1.FieldByName('图片名称').AsString:=' ';
    adoquery1.Post;end;procedure TForm1.BitBtn5Click(Sender: TObject);
    begin
    adoquery1.Delete;
    end;procedure TForm1.BitBtn2Click(Sender: TObject);
    var ext:string;
    begin
      OpenPictureDialog1.FilterIndex:=1;
      openpicturedialog1.FileName :='.jpg';
    If OpenPictureDialog1.Execute Then
     begin
       image1.Picture.LoadFromFile(openpicturedialog1.FileName );
          if image1.picture.Graphic <> nil then  //避免image1中无图像保存出错
    begin
       adoquery1.Edit;
       adoquery1.FieldByName('图片').Assign(image1.Picture.Graphic);
       //以下记录保存到数据库的图像格式
       ext:=extractfileext(openpicturedialog1.FileName );
       if uppercase(ext) = '.BMP' THEN
          adoquery1.FieldByName('格式').VALUE :='bmp'
       ELSE
         IF (UPPERCASE(EXT) = '.JPEG') OR (UPPERCASE(EXT) = '.JPG') THEN
          adoquery1.FieldByName('格式').VALUE := 'jpg';
       adoquery1.Post;
       end;end;
    end;
    procedure TForm1.BitBtn3Click(Sender: TObject);
    begin
    if application.MessageBox('真的要删除图片吗?','删除确认',1+64)=1 then
    begin
      adoquery1.Edit;
      adoquery1.FieldByName('图片').clear;
      adoquery1.FieldByName('图片').Assign(nil);
      adoquery1.FieldByName('格式').Value:='';
      adoquery1.Post;
      image1.Picture.Graphic :=nil;
    end;
    end;procedure TForm1.ADOQuery1AfterScroll(DataSet: TDataSet);
    var
      jpegimage:tjpegimage;
    begin
      image1.Picture.Graphic :=nil;  //BMP、JPEG两种图像数据必需分别处理
      if adoquery1.fieldbyname('格式').Asstring = 'bmp' then
      image1.Picture.bitmap.Assign(adoquery1.fieldbyname('图片'))
              //上边语句中的bitmap不能为graphic,否则会出错
      else if adoquery1.fieldbyname('格式').asstring = 'jpg' then
      begin   //begin2
        jpegimage := tjpegimage.Create ;  //通过jpegimage将图像显示在image1,否则会出错
        try
          jpegimage.Assign(adoquery1.fieldbyname('图片'));
          image1.Picture.Graphic :=jpegimage;
        finally
          jpegimage.Free ;
        end;  //end try
      end;  //end begin2
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    begin
    adoconnection1.Connected:=false;
     if FileExists(ExtractFilePath(Paramstr(0))+'tmp.mdb') then
       DeleteFile(ExtractFilePath(Paramstr(0))+'tmp.mdb');  //删除临时文件
       //将数据库文件压缩并复制为tmp临时文件
       __DBEngine36.CompactDatabase (ExtractFilePath(Paramstr(0))+'mydata.mdb',ExtractFilePath(Paramstr(0))+'tmp.mdb', '', 0, '');
       //删除原数据库文件
       DeleteFile(ExtractFilePath(Paramstr(0))+'mydata.mdb');
      //将临时文件更改为数据库文件:
    if not RenameFile(ExtractFilePath(Paramstr(0))+'tmp.mdb',ExtractFilePath(Paramstr(0))+'mydata.mdb') then raise Exception.Create('文化改名操作失败!');adoconnection1.Connected:=true;
    adoquery1.Active:=true;
    end;function DBGridRecordSize(mColumn: TColumnEh): Boolean;
    { 返回记录数据网格列显示最大宽度是否成功 }
    begin
      Result := False;
      if not Assigned(mColumn.Field) then Exit;
      mColumn.Field.Tag := Max(mColumn.Field.Tag,
      TDBGridEh(mColumn.Grid).Canvas.TextWidth(mColumn.Field.DisplayText));
      Result := True;
    end; { DBGridRecordSize }
    function DBGridAutoSize(mDBGrid: TDBGridEh; mOffset: Integer = 5): Boolean;
    { 返回数据网格自动适应宽度是否成功 }
    var
      I: Integer;
    begin
      Result := False;
      if not Assigned(mDBGrid) then Exit;
      if not Assigned(mDBGrid.DataSource) then Exit;
      if not Assigned(mDBGrid.DataSource.DataSet) then Exit;
      if not mDBGrid.DataSource.DataSet.Active then Exit;
      for I := 0 to mDBGrid.Columns.Count - 1 do begin
       if not mDBGrid.Columns[i].Visible then Continue;
       if Assigned(mDBGrid.Columns[i].Field) then
         mDBGrid.Columns[i].Width := Max(mDBGrid.Columns[i].Field.Tag,
           mDBGrid.Canvas.TextWidth(mDBGrid.Columns[i].Title.Caption)) + mOffset
       else mDBGrid.Columns[i].Width :=
         mDBGrid.Canvas.TextWidth(mDBGrid.Columns[i].Title.Caption) + mOffset;
       mDBGrid.Refresh;
      end;
      Result := True;
    end; { DBGridAutoSize }
    procedure TForm1.DBGridEh1DrawColumnCell(Sender: TObject;
      const Rect: TRect; DataCol: Integer; Column: TColumnEh;
      State: TGridDrawState);
    begin   //在数据库第1个字段自动显示序号
    DBGridRecordSize(Column);
      if Column.Index = 0 then
        if DBGridEh1.SumList.RecNo <> -1 then
          DBGridEh1.Canvas.TextRect(Rect, Rect.Left + 3, Rect.Top + 2,
            IntToStr(DBGridEh1.SumList.RecNo));
    end;procedure TForm1.BitBtn1Click(Sender: TObject);
    begin
    DBGridAutoSize(self.dbgrideh1);
    end;end.