1. 程式人生 > >使用 BLOB 型別欄位

使用 BLOB 型別欄位

vfp9 中增加了 blob 型欄位,這可是個好東西!用它來儲存影象資料最合適,與 SQL 的交換也很順利,接下來就是使用它了。
使用它當然無外乎是顯示/列印影象;顯示很簡單,表單上放一個 Image 控制元件,然後將 Image.PictureVal 賦值為這個 blob 欄位即可;然而如何列印卻費了我一番周折,在梅子上看到有人說先用 StrToFile 儲存為影象檔案,然後再用於報表,當然也行;不過,難道就不能直接使用嗎?
當時確實沒有找到好辦法,一段時間後,終於在 Green1Vfp 找到了解決方案,唯一的問題是,需要使用 vfp9 的報表監聽器,而 vfp9 的物件輔助報表對中文的支援仍存在一些問題,所以我一直沒有 SET REPORTBEHAVIOR 90;那麼在 SET REPORTBEHAVIOR 80 下是否也能直接列印 blob 中的影象呢?

要解決的問題是:
1. 不使用 blob 還原成檔案的方法來列印 blob 欄位(針對圖片)內容
2. 不使用 vfp9 特有的物件輔助報表方式來列印(主要是不想使用報表監聽器物件)

經過 20 分鐘的探索,終於找到了方法,下面是驗證的過程:

1. 先按下圖建一個名為 Test 的報表:
 前面三個是欄位控制元件,第 4 個是一個 Picture/Ole Bound 控制元件,注意按次序新增,至少③要在④之前加入,因為我們需要在列印④之前先由③來改變它繫結的影象資料。如果是修改已存在的報表,則應該先將 4 剪下掉,然後再貼上回來;當然你也可以用佈局工具中的 Bring to Front 將④放到最前端(也就最後顯示/列印)。


2. 接下來設定它們的資料來源,前兩個沒什麼好說的,按下圖設定即可(只有劃紅線的地方需要修改,其它用預設值即可,下同)
 第一個繫結到 t1.fname 欄位上,第二個綁到 t1.lname 上(這個咱就不放圖片了,節約每一位元組空間)

3. 接著是第三個欄位控制元件,其實它並不用於列印,只是用它來改變 Pic/Ole Bound 所繫結的圖片資料而已,所以需要將它的 Print When 設為 .F.

4. 最後加入最重要的圖片控制元件:

好了,報表設計完畢!儲存為 test.frx

5. 現在寫驗證程式碼:

  1. m.cPath = HOME()+'Samples/Tastrade/'
  2. SELECT CAST( ALLTRIM( First_Name ) AS  V(10) ) AS fname, ;
  3.   CAST( ALLTRIM( Last_Name ) AS V(10) ) AS lname, ;
  4.   CAST( FILETOSTR( m.cPath + Photo_File ) AS Blob ) AS pic ;
  5.   FROM ( m.cPath + 'data/Employee.dbf' ) ;
  6.   INTO CURSOR t1
  7. USE IN ( SELECT( 'Employee' ))
  8. PUBLIC goPic AS Image
  9. m.goPic = NEWOBJECT( 'Image' )
  10. REPORT FORM ( LOCFILE( 'test', 'frx' ) ) PREVIEW
  11. FUNCTION _GetPic
  12.   m.goPic.pictureval = t1.pic
  13. ENDFUNC

將上面的程式碼儲存為 prg,執行它,我看到如下結果,你呢?