Q:如何透過 ADO 存取 Access 資料庫的圖形欄位? A:步驟如下。 1.在 Delphi 程式中把 ADO 的 variant 陣列儲存到一個動態位元組陣 列(dynamic byte array)。 2.由該位元組陣列建立一個 memory stream (記得在載入圖形之前要做 reset stream 的動作)。 3.使用一個 TOLEGraphic 物件將圖形由串流中讀入。 4.如果你正在寫 COM 物件,就把 TOleGraphic 轉型為 iPictureDisp ,否則只要用 SetOlePicture(TPicture,TOleGraphic) 函式把 OLE 圖形指定到一個 TPicture 物件即可。 以下是範例程式: function TDaTADO.GetImage(const ImageName: WideString): IPictureDisp; var pict: TOleGraphic; Size: integer; Source: array of byte; stream: TMemoryStream; begin result := nil; fQuery := RetrieveQuery('GetImage'); if fQuery <> '' then begin stream := TMemoryStream.Create; Pict := TOleGraphic.Create; try qryMain.CommandText := fQuery; prmParams := varArrayOf([ImageName]); rsRecords := qryMain.Execute(iAffected,prmParams,-1); if not (rsRecords.bof or rsRecords.eof) then begin Size := rsRecords.Fields[0].ActualSize; setLength(Source,Size); Source := rsRecords.Fields[0].Value; stream.Write(Source[0],size); stream.seek(0,soFromBeginning); Pict.LoadFromStream(stream); result := iPictureDisp(Pict.Picture); end; finally Finalize(Source); Pict.Free; Stream.Free; end; end; end;