如何改變報表文字間距 |
缺席
|
blue
中階會員 發表:170 回覆:136 積分:81 註冊:2002-04-15 發送簡訊給我 |
Hi,各位先進大家好:
小弟使用 Vcl.Printer 來列印報表(原打算用FastReport,但資料來源不是資料庫), 因為字的間距需要設比較寬, 故使用 SetTextCharacterExtra 來設定, 但卻會造成字無法對齊(使用Printer.Canvas.TextOut或DrawText都一樣),不知該如何解決, 謝謝! Printer.BeginDoc; Printer.Canvas.Font.Name := '細明體'; Printer.Canvas.Font.Size := 14; r := TRect.Create(10,10,7000,7000); SetTextCharacterExtra(Printer.Canvas.Handle , 12); Printer.Canvas.TextOut(10, r.Top, '細明體字距12'); r.Top := r.Top 100; Str := '細明體字距12'; DrawText(Printer.Canvas.Handle, PChar(Str), Length(Str), r, DT_LEFT or DT_TOP); r.Top := r.Top 100; Str := ' 報表列印日期:2015/10/15 07:09:12 程式編號: PRD0020 頁數 1/3'; Printer.Canvas.TextOut(10, r.Top, Str); r.Top := r.Top 100; Str := ' 投入日期:2015/10/29 客戶代碼/客戶名稱:22222 / xxxxxxxx'; Printer.Canvas.TextOut(10, r.Top, Str); r.Top := r.Top 100; Str := ' 工單號碼:11E9Z658 |'; DrawText(Printer.Canvas.Handle, PChar(Str), Length(Str), r, DT_LEFT or DT_TOP); r.Top := r.Top 100; Str := ' 製程:AB | XXX123456789012345678901234567890'; DrawText(Printer.Canvas.Handle, PChar(Str), Length(Str), r, DT_TOP); Printer.EndDoc; |
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
nCharExtra
Specifies the amount of extra space, in logical units, to be added to each character. If the current mapping mode is not MM_TEXT, the nCharExtra parameter is transformed and rounded to the nearest pixel. 我猜,可能是因為您沒考慮好 14 號字的寬度及本函式轉 Pixel 的四捨五入所造成的問題. 建議用 12 號字 12/72吋 => 16/96 Pixel 比較不會有誤差, 或許可解決您的問題. 補充: 若中英文夾雜, 可能仍有問題, 因它是以 character 為 unit 插入 space, 故 (一個中文字 12) * 4 <> (一個字母 12) * 8, 這與倚天中文自動處理中英文字間距的 ~x6 不同. ~x6 字母右方插入 6 Dot, 中文字右方插入 12 Dot.
編輯記錄
herbert2 重新編輯於 2015-10-15 19:36:59, 註解 無‧
|
blue
中階會員 發表:170 回覆:136 積分:81 註冊:2002-04-15 發送簡訊給我 |
Hi,感謝 Herbert 大大指導:
測試結果仍是一樣, 應該是中文字造成計算錯誤, 目前解法是每個字都計算其位置, 缺點是速度有慢了一點點(不知使用者是否能感覺得出來), 還有就是若輸出成報表檔,容量佔比較大, 謝謝! ===================引 用 herbert2 文 章=================== nCharExtra Specifies the amount of extra space, in logical units, to be added to each character. If the current mapping mode is not MM_TEXT, the nCharExtra parameter is transformed and rounded to the nearest pixel. 我猜,可能是因為您沒考慮好 14 號字的寬度及本函式轉 Pixel 的四捨五入所造成的問題. 建議用 12 號字 12/72吋 => 16/96 Pixel 比較不會有誤差, 或許可解決您的問題. 補充: 若中英文夾雜, 可能仍有問題, 因它是以 character 為 unit 插入 space, 故 (一個中文字 12) * 4 <> (一個字母 12) * 8, 這與倚天中文自動處理中英文字間距的 ~x6 不同. ~x6 字母右方插入 6 Dot, 中文字右方插入 12 Dot. |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |