  | 
				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) | 
			 
		  | 
	 
	
		| 回頂端 | 
		 | 
	 
	
		  | 
	 
	
		 | 
	 
 
  
  	 
	    
  	   | 
 	
您 無法 在這個版面發表文章 您 無法 在這個版面回覆文章 您 無法 在這個版面編輯文章 您 無法 在這個版面刪除文章 您 無法 在這個版面進行投票 您 無法 在這個版面附加檔案 您 無法 在這個版面下載檔案
  | 
   
  
		 |