 |
VFP 愛用者社區 本討論區為 Visual Foxpro 愛用者經驗交流的地方, 請多多利用"搜尋"的功能, 先查看看有無前例可循, 如果還有不懂的再發問. 部份主題有附加檔案, 須先註冊成為社區居民才可以下載.
|
上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
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 樓
|
|
回頂端 |
|
 |
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 樓
|
|
回頂端 |
|
 |
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) |
|
回頂端 |
|
 |
|
|
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
|
|