VFP 愛用者社區 首頁 VFP 愛用者社區
本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
 
 常見問題常見問題   搜尋搜尋   會員列表會員列表   會員群組會員群組   會員註冊會員註冊 
 個人資料個人資料   登入檢查您的私人訊息登入檢查您的私人訊息   登入登入

VFP ON Wine 筆記(十二) unicode & Report

 
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區
上一篇主題 :: 下一篇主題  
發表人 內容
ckp6250



註冊時間: 2004-07-30
文章: 1645


第 1 樓

發表發表於: 星期二 二月 07, 2012 9:38 pm    文章主題: VFP ON Wine 筆記(十二) unicode & Report 引言回覆

  由於 vfp 不能好好地處理 unicode , 而且 Report 的報表工具上,物件就那區區幾個,不像 Form 的物件可以拿Ms Forms 2.0 TextBox 來取代,因此,在 Report 上列印 unicode 比較麻煩。

  不過,就像白海豚會轉彎一樣,紅狐狸也會轉彎啦,Report 上不是有一個 ole 物件嗎?就拿它來轉彎一下。

請先看看結果


  上圖第二欄是原來的 unicode 欄位內容,把這一欄利用 Api 及 Gdi+ 轉換成 Bmp 檔,然後以 Append General From 填入第三欄,其格式是 ole 。

  用圖說比較清楚∼


  雖然轉換要花費一點效能, 不過,經測試,若改轉成 Excel 或 word 格式,花的時間其實也沒比較省,在還沒有想出更好的點子之下,將就一下吧。

  中文沒問題,日文、韓文、泰文、梵文等其它語言,轉出來還有點小瑕疵,不是很美觀,暫時不理它,有空再說啦。

  目前這項 unicode & Report 的處理模式,基本上是利用 Gdi+,在 windows 下完全沒有問題,但因為據說(據 Google 說) wine 對 Gdi+ 的處理還沒百分百Ok , 暫時還有問題,希望再隔一陣子,wine 能克服這點,屆時再回來改寫這一篇筆記吧。
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
garfield
Site Admin


註冊時間: 2003-01-30
文章: 2160


第 2 樓

發表發表於: 星期三 二月 08, 2012 10:10 am    文章主題: 引言回覆

report裡用gdi+ 這個方式還不是普通人可以做得出來,
GDI+下的文字繪製是參考 行者孫 的這篇文章嗎?
http://hi.baidu.com/myvfp/blog/item/08dc364b77fbaef683025ceb.html

另外我一直不能理解這篇
http://vfp.sunyear.com.tw/viewtopic.php?p=25871
http://msdn.microsoft.com/en-us/library/ms947605.aspx
文章裡所提到GDI+的運用到裡能做到什麼程式,
今天算是開了眼界了.

我想VFP report 裡要用 unicode 只有用 GDI+ 才能解決吧.

_________________
利用>>搜尋<<的功能會比問的還要快得到答案.
回頂端
檢視會員個人資料 發送私人訊息 發送電子郵件
ckp6250



註冊時間: 2004-07-30
文章: 1645


第 3 樓

發表發表於: 星期三 二月 08, 2012 11:40 am    文章主題: 引言回覆

對,參考行者孫的文章並略作修正及調整。

就效率而言,用GDI+反而比其它外掛來得方便,轉Word及Excle如果要顧慮到美觀及跳頁和表頭表尾等,用掉的精神,更多。

把GDI+寫成一個通用函數,直接在 Regort 中套用,好像是可行的辦法。

  至於那個ReportListener,我一直都不敢用,不知道什麼原因,只要設成 SET REPORTBEHAVIOR 90 ,預覽就奇慢無比,既便在4核心8G記憶體下,還是慢吞吞,
不知其他先進有沒有相關經驗?

上面這篇筆記,用的還是SET REPORTBEHAVIOR 80的老方法,並沒有使用到新招術。
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
kalok



註冊時間: 2010-08-26
文章: 284


第 4 樓

發表發表於: 星期四 二月 09, 2012 8:28 am    文章主題: 引言回覆

使用crystal reports可以解決嗎?
回頂端
檢視會員個人資料 發送私人訊息
ckp6250



註冊時間: 2004-07-30
文章: 1645


第 5 樓

發表發表於: 星期四 二月 09, 2012 9:50 am    文章主題: 引言回覆

kalok 寫到:
使用crystal reports可以解決嗎?


不知道您所謂的解決,是要解決什麼?
如果是在 windows 底下,那麼這個方案,基本上就能處理 unicode 的報表工具問題。
如果是在 wine 底下的話,那我會等它改進 Gdi+ 的設計,我相信不會太久。

至於 crystal reports ,沒用過,目前的 VFP Report 已經足以符合我的需要了。
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
ezpos



註冊時間: 2011-04-20
文章: 323


第 6 樓

發表發表於: 星期四 二月 09, 2012 8:46 pm    文章主題: 引言回覆

一定要堅持unicode嗎??難道big5不好!!
_________________
ezPos收銀機 簡單好用低成本 http://www.ezpos.info
全新美觀的POS收銀機.POS軟硬體耗材.
軟體客制化.網站規劃....能賺錢的都可以找我

http://www.twelife.com 台灣生活網
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
ckp6250



註冊時間: 2004-07-30
文章: 1645


第 7 樓

發表發表於: 星期四 二月 09, 2012 8:54 pm    文章主題: 引言回覆

ezpos 寫到:
一定要堅持unicode嗎??難道big5不好!!


無可奈何呀!
在 wine 底下的 vfp ,擠不出『堃』字呀
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
kalok



註冊時間: 2010-08-26
文章: 284


第 8 樓

發表發表於: 星期五 二月 10, 2012 8:38 am    文章主題: 引言回覆

>如果是在 wine 底下的話,那我會等它改進 Gdi+ 的設計,我相信不會太久。
用crystal reports也可能解決

>一定要堅持unicode嗎??難道big5不好!!

如前端用php/asp.net, 中間層用VFP, 不用unicode可能有問題.
回頂端
檢視會員個人資料 發送私人訊息
ckp6250



註冊時間: 2004-07-30
文章: 1645


第 9 樓

發表發表於: 星期五 二月 10, 2012 11:31 am    文章主題: 引言回覆

看了一下 crystal reports 的網頁,試用版就要 360 M,解開後不知道是多少 M , 腳都涼了。

比整套 VFP 大三倍多(vfp全部也才100 M)

它這麼這樣龐大呀?
回頂端
檢視會員個人資料 發送私人訊息 參觀發表人的個人網站
kalok



註冊時間: 2010-08-26
文章: 284


第 10 樓

發表發表於: 星期六 二月 11, 2012 2:17 pm    文章主題: 引言回覆

300 MB確是很大, 不知執行起來速度如何, 沒試過. 有否考慮一個問題, 即使在vfp用上了unicode, 但user將環境設定成BIG5, GB之類的, 也會亂了.
回頂端
檢視會員個人資料 發送私人訊息
kojanlai0823



註冊時間: 2011-12-02
文章: 74


第 11 樓

發表發表於: 星期一 四月 29, 2013 10:01 am    文章主題: 引言回覆

試了幾次總是試不出如何寫出UNICODE的字來..是我的寫法有問題嗎?!

DECLARE Long GdipDrawString IN GDIPLUS.DLL ;
Long graphics, String str,;
Long length, Long thefont,;
String @layoutRect, ;
Long StringFormat,;
Long brush
DECLARE INTEGER GdipCreateStringFormat IN GdiPlus.dll ;
INTEGER formatAttributes, INTEGER language, INTEGER @nFormat
DECLARE INTEGER GdipCreateSolidFill IN GdiPlus.dll;
INTEGER ARGBcolor, INTEGER @brush
DECLARE INTEGER GdipDeleteBrush IN GdiPlus.dll ;
INTEGER brush
DECLARE INTEGER GdipCreateFont IN GdiPlus.dll;
INTEGER fontFamily, SINGLE emSize,;
INTEGER fntstyle, INTEGER unit, INTEGER @fnt
DECLARE INTEGER GdipDeleteFont IN GdiPlus.dll ;
INTEGER fnt
DECLARE INTEGER GdipCreateFontFamilyFromName IN GdiPlus.dll;
STRING familyname, INTEGER FontCollection, INTEGER @FontFamily
DECLARE INTEGER GdipDeleteFontFamily IN GdiPlus.dll ;
INTEGER FontFamily
DECLARE INTEGER GdipCreateFromHWND IN gdiplus.dll ;
INTEGER hWind, INTEGER @graphics
DECLARE INTEGER GdipDeleteGraphics IN GdiPlus.dll ;
INTEGER graphics
Declare Long MultiByteToWideChar In kernel32 ;
Long iCodePage, Long dwFlags, String @ lpStr, Long iMultiByte, ;
String @ lpWideStr, Long iWideChar
DECLARE INTEGER GdipLoadImageFromFile IN gdiplus.DLL ;
STRING wFilename, INTEGER @nImage
DECLARE INTEGER GdipSaveImageToFile IN gdiplus.DLL ;
INTEGER nImage, STRING wFilename, STRING qEncoder, INTEGER nEncoderParamsPtr
DECLARE INTEGER GdipGetImageGraphicsContext IN gdiplus.DLL ;
INTEGER nImage, INTEGER @ nGraphics
DECLARE INTEGER GdipCreateHatchBrush IN Gdiplus.dll;
INTEGER hatchstyle, INTEGER forecol, INTEGER backcol, INTEGER @brush
DECLARE INTEGER GdipGetImageHeight IN gdiplus;
INTEGER img,;
INTEGER @ imgheight
DECLARE INTEGER GdipGetImageWidth IN gdiplus;
INTEGER img,INTEGER @ imgwidth
LCTEXT=THISFORM.FILENAME1.TEXT
lnLen=2*(Len(lcText)+1)
lcWideStr=Replicate(Chr(0),lnLen)
MultiByteToWideChar(0,0,@lcText,Len(lcText), @lcWideStr,lnLen)
tcText=lcWideStr
graphics=0
nimage=0
File_Name='123.bmp'
result1=GdipLoadImageFromFile(STRCONV(File_Name + CHR(0),5),@nimage)
lcFontName='¼Ð·¢Åé'
lcFontName=STRCONV(lcFontName+CHR(0),5)
lnFontFamily=0
result2=GdipCreateFontFamilyFromName(lcFontName,0,@lnFontFamily)
lnFont=0
lnFontStyle=1&&¦rÅéÃþ«¬¡A0Àq»{¡A1¥[²Ê¡A2¶É±×3=1+2¥[²Ê¶É±× 4U 8 S
tnSize=12&&¦rÅé¤j¤p
result3=GdipCreateFont(lnFontFamily,tnSize,lnFontStyle, 3,@lnFont)
lnFormatHandle = 0
thAlignment=0&&©~¥ª
result4=GdipCreateStringFormat(0, 0, @lnFormatHandle )
nAlign = lnFormatHandle
brush=0
ucolor1=RGB(0,255,0)&&¦rÅéÃC¦â
aphpi=255&&³z©ú«×
lnColor1 = CTOBIN(CHR(aphpi)+LEFT(BINTOC(uColor1,'4rs'),3),'4s')
ucolor2=RGB(0,0,0)&&¦rÅéÃC¦â
aphpi=255&&³z©ú«×
lnColor2 = CTOBIN(CHR(aphpi)+LEFT(BINTOC(uColor2,'4rs'),3),'4s')
result5=GdipCreateHatchBrush(11,lnColor1,lnColor2,@brush)&&«Ø¥ß‾¾²z¨ê¤l
x=0&&ø¨î¤å¦rªº¥ª¤W¨¤§¤¸¨
y=0
w=100
h=500
result6=GdipGetImageWidth(nImage,@w)
result7=GdipGetImageHeight(nImage,@h)
lcRectangleF=BINTOC(x,'F')+BINTOC(y,'F')+BINTOC(w,'F')+BINTOC(h,'F')
result8=GdipGetImageGraphicsContext (nImage, @Graphics)
result9=GdipDrawString(Graphics, tcText, LEN(lcText), lnFont,@lcRectangleF, 0,brush)
#DEFINE ENCODER_JPEG "{557CF401-1A04-11D3-9A73-0000F81EF32E}"
resulta=GdipSaveImageToFile (nImage, STRCONV('123.JPG',5) + CHR(0), ENCODER_JPEG, 0)
WAIT 'resulta = '+ALLTRIM(STR(resulta)) wind
GdipDeleteFontFamily(lnFontFamily)
GdipDeleteFont(lnFont)

我有試用
#DEFINE ENCODER_BMP "{557CF400-1A04-11D3-9A73-0000F81EF32E}"
CODE 忘了是多少...但確定當時找到的是用來畫BMP的
resulta=GdipSaveImageToFile (nImage, STRCONV('123.BMP',5) + CHR(0), ENCODER_BMP, 0)
回頂端
檢視會員個人資料 發送私人訊息
從之前的文章開始顯示:   
發表新主題   回覆主題    VFP 愛用者社區 首頁 -> VFP 討論區 所有的時間均為 台北時間 (GMT + 8 小時)
1頁(共1頁)

 
前往:  
無法 在這個版面發表文章
無法 在這個版面回覆文章
無法 在這個版面編輯文章
無法 在這個版面刪除文章
無法 在這個版面進行投票
無法 在這個版面附加檔案
無法 在這個版面下載檔案


Powered by phpBB © 2001, 2005 phpBB Group
正體中文語系由 phpbb-tw 維護製作