有些字划掉并不是删除线而是右斜线,在ReportMachine报表的实现
2014-09-20 22:08
260 查看
最近项目中,因为有个字是删除的意思,但不像Word排版给设置删除线样式就可以达到的,而是要求从左上角划一直线穿过这个字到右下角。最开始想到用造字的办法,可是造字不仅麻烦,而且要为不同字体造字,并且,如果机器系统不一样,字体之间还有差异,最关键的是,造出来的字,输出为pdf打开来看时,pdf并不能显示这个造的字出来。在报表中,这个字,有可能是从数据库中出来的,输入与输出在不同机器间共享,表达就会有很大的损失,造成错漏。所以造字是行不通的办法。
报表是采用ReportMachine 6.5,这是网上流传很广的源码版。通过分析发现,可以针对出现这个字的情况下,进行特殊处理。找到RM_Class.pas文件, TRMCustomMemoView.ShowMemo就是输出处理,找到文本绘制的处理 _DrawOneStr,修改代码:
通过增加上面的代码,导出pdf后的效果非常好。凡是用括号(无论全角还是半角)括起来的“补”字,均有右斜线划去。
报表是采用ReportMachine 6.5,这是网上流传很广的源码版。通过分析发现,可以针对出现这个字的情况下,进行特殊处理。找到RM_Class.pas文件, TRMCustomMemoView.ShowMemo就是输出处理,找到文本绘制的处理 _DrawOneStr,修改代码:
procedure _DrawOneStr; var i: Integer; lWidth: Integer; str1,str2 : string; /// add 2014/9/19 begin {/// 在有补字上画一个右斜线 } str1 := aStr; while true do begin str2 := '(补'; i := Pos(str2, str1); if i = 0 then begin str2 := '(补'; i := Pos(str2, str1); end; if i = 0 then begin str2 := '补)'; i := Pos(str2, str1); end; if i = 0 then begin str2 := '补)'; i := Pos(str2, str1); end; if i = 0 then break; if str2 = '(补' then begin str2 := copy(str1,1,i); // 补前的字符 str1 := str2 + '@@' + copy(str1,i+3,Length(str1)); // 将找到的"补"字用两个@替换 end else if str2 = '(补' then begin str2 := copy(str1,1,i+1); str1 := str2 + '@@' + copy(str1,i+4,Length(str1)); // 将找到的"补"字用两个@替换 end else if str2 = '补)' then begin str2 := copy(str1,1,i-1); str1 := Str2 + '@@' + copy(str1,i+2,Length(str1)); // 将找到的"补"字用两个@替换 end else if str2 = '补)' then begin str2 := copy(str1,1,i-1); str1 := str2 + '@@' + copy(str1,i+2,Length(str1)); // 将找到的"补"字用两个@替换 end; lStrLen := Length(str2); GetTextExtentPoint32A(Canvas.Handle, PAnsiChar(str2), lStrLen, lSize); Canvas.MoveTo(aCurx + lSize.cx + (lCurLineHeight div 6), lCury); Canvas.LineTo(aCurx + lSize.cx + lCurLineHeight - (lCurLineHeight div 6), lCury + lSize.cy); end; {\\\ end add 2014/9/19} lStrLen := Length(aStr); GetTextExtentPoint32W(Canvas.Handle, PWideChar(aStr), lStrLen, lSize); ...... end;
通过增加上面的代码,导出pdf后的效果非常好。凡是用括号(无论全角还是半角)括起来的“补”字,均有右斜线划去。
相关文章推荐
- 人最大的快乐不是赚多少钱,而是将一个一个的梦想付诸实现。
- 删除cookie 不是setMaxAge(0) 而是同名替代
- js实现 窗口最大化,不是满屏,而是相当于按了窗口右上角的最大化按钮那样的效果
- (转)千万级并发实现的秘密:内核不是解决方案,而是问题所在!
- asp.net 后台实现删除,划掉效果
- js实现 窗口最大化,不是满屏,而是相当于按了窗口右上角的最大化按钮那样的效果
- Latex----实现latex中用\cite命令时候,出来的不是[1],[2], 而是 作者 年
- 千万级并发实现的秘密:内核不是解决方案,而是问题所在!
- 千万级并发实现的秘密:内核不是解决方案,而是问题所在!
- 千万级并发实现的秘密:内核不是解决方案,而是问题所在!
- Python 最近因开发项目的需要,有一个需求,就是很多SNS网站都有的通过 Email地址 导入好友列表,不过这次要导入的不是Email 列表,而是QQ的好友列表。 实现方式: 通过goog
- 千万级并发实现的秘密:内核不是解决方案,而是问题所在!
- 千万级并发实现的秘密:内核不是解决方案,而是问题所在!
- android:有些listener类型的回调函数不是interface,而是基本类,所以要用extends去继承,不要implement
- 千万级并发实现的秘密:内核不是解决方案,而是问题所在!
- 千万级并发实现的秘密:内核不是解决方案,而是问题所在!
- 千万级并发实现的秘密:内核不是解决方案,而是问题所在!
- 千万级并发实现的秘密:内核不是解决方案,而是问题所在!
- 在JS表格中怎么删除一行(不是指定行,而是我表格中每行后面都有一个删除按钮,按其中一个按钮就删除那一行
- 锚定梦想,一切变简单(不是真的有勇气,而是不能帮助实现梦想的环境要坚决放弃)