線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1644
推到 Plurk!
推到 Facebook!

如何改變報表文字間距

缺席
blue
中階會員


發表:170
回覆:136
積分:81
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2015-10-15 14:33:33 IP:125.227.xxx.xxx 訂閱
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2015-10-15 19:30:12 IP:202.39.xxx.xxx 訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2015-10-16 08:38:25 IP:125.227.xxx.xxx 訂閱
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.
系統時間:2024-12-04 1:34:56
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!