最近項目中,由於有個字是刪除的意思,但不像Word排版給設置刪除線樣式就能夠達到的,而是要求從左上角劃一直線穿過這個字到右下角。最開始想到用造字的辦法,但是造字不只麻煩,並且要爲不一樣字體造字,而且,若是機器系統不同,字體之間還有差別,最關鍵的是,造出來的字,輸出爲pdf打開來看時,pdf並不能顯示這個造的字出來。在報表中,這個字,有多是從數據庫中出來的,輸入與輸出在不一樣機器間共享,表達就會有很大的損失,形成錯漏。因此造字是行不通的辦法。數據庫
報表是採用ReportMachine 6.5,這是網上流傳很廣的源碼版。經過分析發現,能夠針對出現這個字的狀況下,進行特殊處理。找到RM_Class.pas文件, TRMCustomMemoView.ShowMemo就是輸出處理,找到文本繪製的處理 _DrawOneStr,修改代碼:ide
1 procedure _DrawOneStr; 2 var 3 i: Integer; 4 lWidth: Integer; 5 str1,str2 : string; /// add 2014/9/19 6 begin 7 {/// 在有補字上畫一個右斜線 } 8 str1 := aStr; 9 while true do 10 begin 11 str2 := '(補'; 12 i := Pos(str2, str1); 13 if i = 0 then begin str2 := '(補'; i := Pos(str2, str1); end; 14 if i = 0 then begin str2 := '補)'; i := Pos(str2, str1); end; 15 if i = 0 then begin str2 := '補)'; i := Pos(str2, str1); end; 16 if i = 0 then break; 17 if str2 = '(補' then 18 begin 19 str2 := copy(str1,1,i); // 補前的字符 20 str1 := str2 + '@@' + copy(str1,i+3,Length(str1)); // 將找到的"補"字用兩個@替換 21 end 22 else if str2 = '(補' then 23 begin 24 str2 := copy(str1,1,i+1); 25 str1 := str2 + '@@' + copy(str1,i+4,Length(str1)); // 將找到的"補"字用兩個@替換 26 end 27 else if str2 = '補)' then 28 begin 29 str2 := copy(str1,1,i-1); 30 str1 := Str2 + '@@' + copy(str1,i+2,Length(str1)); // 將找到的"補"字用兩個@替換 31 end 32 else if str2 = '補)' then 33 begin 34 str2 := copy(str1,1,i-1); 35 str1 := str2 + '@@' + copy(str1,i+2,Length(str1)); // 將找到的"補"字用兩個@替換 36 end; 37 38 lStrLen := Length(str2); 39 GetTextExtentPoint32A(Canvas.Handle, PAnsiChar(str2), lStrLen, lSize); 40 Canvas.MoveTo(aCurx + lSize.cx + (lCurLineHeight div 6), lCury); 41 Canvas.LineTo(aCurx + lSize.cx + lCurLineHeight - (lCurLineHeight div 6), lCury + lSize.cy); 42 end; 43 {\\\ end add 2014/9/19} 44 lStrLen := Length(aStr); 45 GetTextExtentPoint32W(Canvas.Handle, PWideChar(aStr), lStrLen, lSize); 46 ...... 47 end;
經過增長上面的代碼,導出pdf後的效果很是好。凡是用括號(不管全角仍是半角)括起來的「補」字,均有右斜線劃去。字體